COR_FUNC.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:5k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729A Speech Coder    ANSI-C Source Code
  3.    Version 1.1    Last modified: September 1996
  4.    Copyright (c) 1996,
  5.    AT&T, France Telecom, NTT, Universite de Sherbrooke
  6.    All rights reserved.
  7. */
  8. /* Functions Corr_xy2() and Cor_h_x()   */
  9. #include "typedef.h"
  10. #include "basic_op.h"
  11. #include "ld8a.h"
  12. /*---------------------------------------------------------------------------*
  13.  * Function corr_xy2()                                                       *
  14.  * ~~~~~~~~~~~~~~~~~~~                                                       *
  15.  * Find the correlations between the target xn[], the filtered adaptive      *
  16.  * codebook excitation y1[], and the filtered 1st codebook innovation y2[].  *
  17.  *   g_coeff[2]:exp_g_coeff[2] = <y2,y2>                                     *
  18.  *   g_coeff[3]:exp_g_coeff[3] = -2<xn,y2>                                   *
  19.  *   g_coeff[4]:exp_g_coeff[4] = 2<y1,y2>                                    *
  20.  *---------------------------------------------------------------------------*/
  21. void Corr_xy2(
  22.       Word16 xn[],           /* (i) Q0  :Target vector.                  */
  23.       Word16 y1[],           /* (i) Q0  :Adaptive codebook.              */
  24.       Word16 y2[],           /* (i) Q12 :Filtered innovative vector.     */
  25.       Word16 g_coeff[],      /* (o) Q[exp]:Correlations between xn,y1,y2 */
  26.       Word16 exp_g_coeff[]   /* (o)       :Q-format of g_coeff[]         */
  27. )
  28. {
  29.       Word16   i,exp;
  30.       Word16   exp_y2y2,exp_xny2,exp_y1y2;
  31.       Word16   y2y2,    xny2,    y1y2;
  32.       Word32   L_acc;
  33.       Word16   scaled_y2[L_SUBFR];       /* Q9 */
  34.       /*------------------------------------------------------------------*
  35.        * Scale down y2[] from Q12 to Q9 to avoid overflow                 *
  36.        *------------------------------------------------------------------*/
  37.       for(i=0; i<L_SUBFR; i++) {
  38.          scaled_y2[i] = shr(y2[i], 3);        }
  39.       /* Compute scalar product <y2[],y2[]> */
  40.       L_acc = 1;                       /* Avoid case of all zeros */
  41.       for(i=0; i<L_SUBFR; i++)
  42.          L_acc = L_mac(L_acc, scaled_y2[i], scaled_y2[i]);    /* L_acc:Q19 */
  43.       exp      = norm_l(L_acc);
  44.       y2y2     = round( L_shl(L_acc, exp) );
  45.       exp_y2y2 = add(exp, 19-16);                          /* Q[19+exp-16] */
  46.       g_coeff[2]     = y2y2;
  47.       exp_g_coeff[2] = exp_y2y2;
  48.       /* Compute scalar product <xn[],y2[]> */
  49.       L_acc = 1;                       /* Avoid case of all zeros */
  50.       for(i=0; i<L_SUBFR; i++)
  51.          L_acc = L_mac(L_acc, xn[i], scaled_y2[i]);           /* L_acc:Q10 */
  52.       exp      = norm_l(L_acc);
  53.       xny2     = round( L_shl(L_acc, exp) );
  54.       exp_xny2 = add(exp, 10-16);                          /* Q[10+exp-16] */
  55.       g_coeff[3]     = negate(xny2);
  56.       exp_g_coeff[3] = sub(exp_xny2,1);                   /* -2<xn,y2> */
  57.       /* Compute scalar product <y1[],y2[]> */
  58.       L_acc = 1;                       /* Avoid case of all zeros */
  59.       for(i=0; i<L_SUBFR; i++)
  60.          L_acc = L_mac(L_acc, y1[i], scaled_y2[i]);           /* L_acc:Q10 */
  61.       exp      = norm_l(L_acc);
  62.       y1y2     = round( L_shl(L_acc, exp) );
  63.       exp_y1y2 = add(exp, 10-16);                          /* Q[10+exp-16] */
  64.       g_coeff[4]     = y1y2;
  65.       exp_g_coeff[4] = sub(exp_y1y2,1);    ;                /* 2<y1,y2> */
  66.       return;
  67. }
  68. /*--------------------------------------------------------------------------*
  69.  *  Function  Cor_h_X()                                                     *
  70.  *  ~~~~~~~~~~~~~~~~~~~                                                     *
  71.  * Compute correlations of input response h[] with the target vector X[].   *
  72.  *--------------------------------------------------------------------------*/
  73. void Cor_h_X(
  74.      Word16 h[],        /* (i) Q12 :Impulse response of filters      */
  75.      Word16 X[],        /* (i)     :Target vector                    */
  76.      Word16 D[]         /* (o)     :Correlations between h[] and D[] */
  77.                         /*          Normalized to 13 bits            */
  78. )
  79. {
  80.    Word16 i, j;
  81.    Word32 s, max, L_temp;
  82.    Word32 y32[L_SUBFR];
  83.    /* first keep the result on 32 bits and find absolute maximum */
  84.    max = 0;
  85.    for (i = 0; i < L_SUBFR; i++)
  86.    {
  87.      s = 0;
  88.      for (j = i; j <  L_SUBFR; j++)
  89.        s = L_mac(s, X[j], h[j-i]);
  90.      y32[i] = s;
  91.      s = L_abs(s);
  92.      L_temp =L_sub(s,max);
  93.      if(L_temp>0L) {
  94.         max = s;
  95.      }
  96.    }
  97.    /* Find the number of right shifts to do on y32[]  */
  98.    /* so that maximum is on 13 bits                   */
  99.    j = norm_l(max);
  100.    if( sub(j,16) > 0) {
  101.     j = 16;
  102.    }
  103.    j = sub(18, j);
  104.    for(i=0; i<L_SUBFR; i++) {
  105.      D[i] = extract_l( L_shr(y32[i], j) );
  106.    }
  107.    return;
  108. }