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

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*-----------------------------------------------------------------*
  3.  *   Functions Coder_ld8k and Init_Coder_ld8k                      *
  4.  *             ~~~~~~~~~~     ~~~~~~~~~~~~~~~                      *
  5.  *-----------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "typedef.h"
  9. #include "basic_op.h"
  10. #include "ld8k.h"
  11. #include "tab_ld8k.h"
  12. #include "oper_32b.h"
  13. static void update_exc_err(Word16 gain_pit, Word16 t0);
  14. static Word16 test_err(Word16 t0, Word16 t0_frac);
  15. /*-----------------------------------------------------------*
  16.  *    Coder constant parameters (defined in "ld8k.h")        *
  17.  *-----------------------------------------------------------*
  18.  *   L_WINDOW    : LPC analysis window size.                 *
  19.  *   L_NEXT      : Samples of next frame needed for autocor. *
  20.  *   L_FRAME     : Frame size.                               *
  21.  *   L_SUBFR     : Sub-frame size.                           *
  22.  *   M           : LPC order.                                *
  23.  *   MP1         : LPC order+1                               *
  24.  *   L_TOTAL     : Total size of speech buffer.              *
  25.  *   PIT_MIN     : Minimum pitch lag.                        *
  26.  *   PIT_MAX     : Maximum pitch lag.                        *
  27.  *   L_INTERPOL  : Length of filter for interpolation        *
  28.  *-----------------------------------------------------------*/
  29. /*--------------------------------------------------------*
  30.  *         Static memory allocation.                      *
  31.  *--------------------------------------------------------*/
  32.         /* Speech vector */
  33.  static Word16 old_speech[L_TOTAL];
  34.  static Word16 *speech, *p_window;
  35.  Word16 *new_speech;                    /* Global variable */
  36.                 /* Weighted speech vector */
  37.  static Word16 old_wsp[L_FRAME+PIT_MAX];
  38.  static Word16 *wsp;
  39.                 /* Excitation vector */
  40.  static Word16 old_exc[L_FRAME+PIT_MAX+L_INTERPOL];
  41.  static Word16 *exc;
  42.         /* Zero vector */
  43.  static Word16 ai_zero[L_SUBFR+MP1];
  44.  static Word16 *zero;
  45.                 /* Lsp (Line spectral pairs) */
  46.  static Word16 lsp_old[M]={
  47.                           30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000};
  48.  static Word16 lsp_old_q[M];
  49.         /* Filter's memory */
  50.  static Word16 mem_syn[M], mem_w0[M], mem_w[M];
  51.  static Word16 mem_err[M+L_SUBFR], *error;
  52.  static Word16 sharp;
  53.  /* to tame the coder */
  54.  static Word32 L_exc_err[4];
  55. /*-----------------------------------------------------------------*
  56.  *   Function  Init_Coder_ld8k                                     *
  57.  *            ~~~~~~~~~~~~~~~                                      *
  58.  *                                                                 *
  59.  *  Init_Coder_ld8k(void);                                         *
  60.  *                                                                 *
  61.  *   ->Initialization of variables for the coder section.          *
  62.  *       - initialize pointers to speech buffer                    *
  63.  *       - initialize static  pointers                             *
  64.  *       - set static vectors to zero                              *
  65.  *                                                                 *
  66.  *-----------------------------------------------------------------*/
  67. void Init_Coder_ld8k(void)
  68. {
  69.  int i;
  70.   /*----------------------------------------------------------------------*
  71.   *      Initialize pointers to speech vector.                            *
  72.   *                                                                       *
  73.   *                                                                       *
  74.   *   |--------------------|-------------|-------------|------------|     *
  75.   *     previous speech           sf1           sf2         L_NEXT        *
  76.   *                                                                       *
  77.   *   <----------------  Total speech vector (L_TOTAL)   ----------->     *
  78.   *   <----------------  LPC analysis window (L_WINDOW)  ----------->     *
  79.   *   |                   <-- present frame (L_FRAME) -->                 *
  80.   * old_speech            |              <-- new speech (L_FRAME) -->     *
  81.   * p_window              |              |                                *
  82.   *                     speech           |                                *
  83.   *                             new_speech                                *
  84.   *-----------------------------------------------------------------------*/
  85.   new_speech = old_speech + L_TOTAL - L_FRAME;         /* New speech     */
  86.   speech     = new_speech - L_NEXT;                    /* Present frame  */
  87.   p_window   = old_speech + L_TOTAL - L_WINDOW;        /* For LPC window */
  88.   /* Initialize static pointers */
  89.   wsp    = old_wsp + PIT_MAX;
  90.   exc    = old_exc + PIT_MAX + L_INTERPOL;
  91.   zero   = ai_zero + MP1;
  92.   error  = mem_err + M;
  93.   /* Static vectors to zero */
  94.   Set_zero(old_speech, L_TOTAL);
  95.   Set_zero(old_exc, PIT_MAX+L_INTERPOL);
  96.   Set_zero(old_wsp, PIT_MAX);
  97.   Set_zero(mem_syn, M);
  98.   Set_zero(mem_w,   M);
  99.   Set_zero(mem_w0,  M);
  100.   Set_zero(mem_err, M);
  101.   Set_zero(zero, L_SUBFR);
  102.   sharp = SHARPMIN;
  103.   /* Initialize lsp_old_q[] */
  104.   Copy(lsp_old, lsp_old_q, M);
  105.   Lsp_encw_reset();
  106.   for(i=0; i<4; i++) L_exc_err[i] = 0x00004000L;   /* Q14 */
  107.  return;
  108. }
  109. /*-----------------------------------------------------------------*
  110.  *   Functions Coder_ld8k                                          *
  111.  *            ~~~~~~~~~~                                           *
  112.  *  Coder_ld8k(Word16 ana[], Word16 synth[]);                      *
  113.  *                                                                 *
  114.  *   ->Main coder function.                                        *
  115.  *                                                                 *
  116.  *                                                                 *
  117.  *  Input:                                                         *
  118.  *                                                                 *
  119.  *   80 speech data should have been copied to vector new_speech[].*
  120.  *   This vector is global and is declared in this function.       *
  121.  *                                                                 *
  122.  *  Ouputs:                                                        *
  123.  *                                                                 *
  124.  *    ana[]      ->analysis parameters.                            *
  125.  *    synth[]    ->Local synthesis (for debug purpose)             *
  126.  *                                                                 *
  127.  *-----------------------------------------------------------------*/
  128. void Coder_ld8k(
  129.      Word16 ana[],      /* output  : Analysis parameters */
  130.      Word16 synth[]     /* output  : Local synthesis     */
  131. )
  132. {
  133.   /* LPC analysis */
  134.   Word16 r_l[MP1], r_h[MP1];       /* Autocorrelations low and hi          */
  135.   Word16 rc[M];                    /* Reflection coefficients.             */
  136.   Word16 A_t[(MP1)*2];             /* A(z) unquantized for the 2 subframes */
  137.   Word16 Aq_t[(MP1)*2];            /* A(z)   quantized for the 2 subframes */
  138.   Word16 Ap1[MP1];                 /* A(z) with spectral expansion         */
  139.   Word16 Ap2[MP1];                 /* A(z) with spectral expansion         */
  140.   Word16 *A, *Aq;                  /* Pointer on A_t and Aq_t              */
  141.   Word16 lsp_new[M], lsp_new_q[M]; /* LSPs at 2th subframe                 */
  142.   Word16 lsf_int[M];               /* Interpolated LSF 1st subframe.       */
  143.   Word16 lsf_new[M];
  144.   Word16 gamma1[2], gamma2[2];     /* Weighting factor for the 2 subframes */
  145.   /* Other vectors */
  146.   Word16 h1[L_SUBFR];            /* Impulse response h1[]              */
  147.   Word16 xn[L_SUBFR];            /* Target vector for pitch search     */
  148.   Word16 xn2[L_SUBFR];           /* Target vector for codebook search  */
  149.   Word16 code[L_SUBFR];          /* Fixed codebook excitation          */
  150.   Word16 y1[L_SUBFR];            /* Filtered adaptive excitation       */
  151.   Word16 y2[L_SUBFR];            /* Filtered fixed codebook excitation */
  152.   Word16 g_coeff[4];             /* Correlations between xn & y1       */
  153.   Word16 g_coeff_cs[5];
  154.   Word16 exp_g_coeff_cs[5];      /* Correlations between xn, y1, & y2
  155.                                      <y1,y1>, -2<xn,y1>,
  156.                                           <y2,y2>, -2<xn,y2>, 2<y1,y2> */
  157.   /* Scalars */
  158.   Word16 i, j, k, i_subfr, i_gamma;
  159.   Word16 T_op, T0, T0_min, T0_max, T0_frac;
  160.   Word16 gain_pit, gain_code, index;
  161.   Word16 temp;
  162.   Word32 L_temp;
  163. /*------------------------------------------------------------------------*
  164.  *  - Perform LPC analysis:                                               *
  165.  *       * autocorrelation + lag windowing                                *
  166.  *       * Levinson-durbin algorithm to find a[]                          *
  167.  *       * convert a[] to lsp[]                                           *
  168.  *       * quantize and code the LSPs                                     *
  169.  *       * find the interpolated LSPs and convert to a[] for the 2        *
  170.  *         subframes (both quantized and unquantized)                     *
  171.  *------------------------------------------------------------------------*/
  172.   /* LP analysis */
  173.   Autocorr(p_window, M, r_h, r_l);              /* Autocorrelations */
  174.   Lag_window(M, r_h, r_l);                      /* Lag windowing    */
  175.   Levinson(r_h, r_l, &A_t[MP1],rc);             /* Levinson Durbin  */
  176.   Az_lsp(&A_t[MP1], lsp_new, lsp_old);          /* From A(z) to lsp */
  177.   /* LSP quantization */
  178.   Qua_lsp(lsp_new, lsp_new_q, ana);
  179.   ana += 2;                         /* Advance analysis parameters pointer */
  180.   /*--------------------------------------------------------------------*
  181.    * Find interpolated LPC parameters in all subframes (both quantized  *
  182.    * and unquantized).                                                  *
  183.    * The interpolated parameters are in array A_t[] of size (M+1)*4     *
  184.    * and the quantized interpolated parameters are in array Aq_t[]      *
  185.    *--------------------------------------------------------------------*/
  186.   Int_lpc(lsp_old, lsp_new, lsf_int, lsf_new,  A_t);
  187.   Int_qlpc(lsp_old_q, lsp_new_q, Aq_t);
  188.   /* update the LSPs for the next frame */
  189.   for(i=0; i<M; i++)
  190.   {
  191.     lsp_old[i]   = lsp_new[i];
  192.     lsp_old_q[i] = lsp_new_q[i];
  193.   }
  194.  /*----------------------------------------------------------------------*
  195.   * - Find the weighting factors                                         *
  196.   *----------------------------------------------------------------------*/
  197.   perc_var(gamma1, gamma2, lsf_int, lsf_new, rc);
  198.  /*----------------------------------------------------------------------*
  199.   * - Find the weighted input speech w_sp[] for the whole speech frame   *
  200.   * - Find the open-loop pitch delay                                     *
  201.   *----------------------------------------------------------------------*/
  202.   Weight_Az(&A_t[0], gamma1[0], M, Ap1);
  203.   Weight_Az(&A_t[0], gamma2[0], M, Ap2);
  204.   Residu(Ap1, &speech[0], &wsp[0], L_SUBFR);
  205.   Syn_filt(Ap2, &wsp[0], &wsp[0], L_SUBFR, mem_w, 1);
  206.   Weight_Az(&A_t[MP1], gamma1[1], M, Ap1);
  207.   Weight_Az(&A_t[MP1], gamma2[1], M, Ap2);
  208.   Residu(Ap1, &speech[L_SUBFR], &wsp[L_SUBFR], L_SUBFR);
  209.   Syn_filt(Ap2, &wsp[L_SUBFR], &wsp[L_SUBFR], L_SUBFR, mem_w, 1);
  210.   /* Find open loop pitch lag */
  211.   T_op = Pitch_ol(wsp, PIT_MIN, PIT_MAX, L_FRAME);
  212.   /* Range for closed loop pitch search in 1st subframe */
  213.   T0_min = sub(T_op, 3);
  214.   if (sub(T0_min,PIT_MIN)<0) {
  215.     T0_min = PIT_MIN;
  216.   }
  217.   T0_max = add(T0_min, 6);
  218.   if (sub(T0_max ,PIT_MAX)>0)
  219.   {
  220.      T0_max = PIT_MAX;
  221.      T0_min = sub(T0_max, 6);
  222.   }
  223.  /*------------------------------------------------------------------------*
  224.   *          Loop for every subframe in the analysis frame                 *
  225.   *------------------------------------------------------------------------*
  226.   *  To find the pitch and innovation parameters. The subframe size is     *
  227.   *  L_SUBFR and the loop is repeated 2 times.                             *
  228.   *     - find the weighted LPC coefficients                               *
  229.   *     - find the LPC residual signal res[]                               *
  230.   *     - compute the target signal for pitch search                       *
  231.   *     - compute impulse response of weighted synthesis filter (h1[])     *
  232.   *     - find the closed-loop pitch parameters                            *
  233.   *     - encode the pitch delay                                           *
  234.   *     - update the impulse response h1[] by including fixed-gain pitch   *
  235.   *     - find target vector for codebook search                           *
  236.   *     - codebook search                                                  *
  237.   *     - encode codebook address                                          *
  238.   *     - VQ of pitch and codebook gains                                   *
  239.   *     - find synthesis speech                                            *
  240.   *     - update states of weighting filter                                *
  241.   *------------------------------------------------------------------------*/
  242.   A  = A_t;     /* pointer to interpolated LPC parameters           */
  243.   Aq = Aq_t;    /* pointer to interpolated quantized LPC parameters */
  244.   i_gamma = 0;
  245.   for (i_subfr = 0;  i_subfr < L_FRAME; i_subfr += L_SUBFR)
  246.   {
  247.     /*---------------------------------------------------------------*
  248.      * Find the weighted LPC coefficients for the weighting filter.  *
  249.      *---------------------------------------------------------------*/
  250.     Weight_Az(A, gamma1[i_gamma], M, Ap1);
  251.     Weight_Az(A, gamma2[i_gamma], M, Ap2);
  252.     i_gamma = add(i_gamma,1);
  253.     /*---------------------------------------------------------------*
  254.      * Compute impulse response, h1[], of weighted synthesis filter  *
  255.      *---------------------------------------------------------------*/
  256.     for (i = 0; i <= M; i++) {
  257.         ai_zero[i] = Ap1[i];
  258.     }
  259.     Syn_filt(Aq, ai_zero, h1, L_SUBFR, zero, 0);
  260.     Syn_filt(Ap2, h1, h1, L_SUBFR, zero, 0);
  261.    /*------------------------------------------------------------------------*
  262.     *                                                                        *
  263.     *          Find the target vector for pitch search:                      *
  264.     *          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                       *
  265.     *                                                                        *
  266.     *              |------|  res[n]                                          *
  267.     *  speech[n]---| A(z) |--------                                          *
  268.     *              |------|       |   |--------| error[n]  |------|          *
  269.     *                    zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
  270.     *                    exc          |--------|           |------|          *
  271.     *                                                                        *
  272.     * Instead of subtracting the zero-input response of filters from         *
  273.         * the weighted input speech, the above configuration is used to          *
  274.     * compute the target vector. This configuration gives better performance *
  275.     * with fixed-point implementation. The memory of 1/A(z) is updated by    *
  276.     * filtering (res[n]-exc[n]) through 1/A(z), or simply by subtracting     *
  277.     * the synthesis speech from the input speech:                            *
  278.     *    error[n] = speech[n] - syn[n].                                      *
  279.     * The memory of W(z) is updated by filtering error[n] through W(z),      *
  280.     * or more simply by subtracting the filtered adaptive and fixed          *
  281.     * codebook excitations from the target:                                  *
  282.         *     target[n] - gain_pit*y1[n] - gain_code*y2[n]                       *
  283.     * as these signals are already available.                                *
  284.     *                                                                        *
  285.     *------------------------------------------------------------------------*/
  286.     Residu(Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);   /* LPC residual */
  287.     Syn_filt(Aq, &exc[i_subfr], error, L_SUBFR, mem_err, 0);
  288.     Residu(Ap1, error, xn, L_SUBFR);
  289.     Syn_filt(Ap2, xn, xn, L_SUBFR, mem_w0, 0);    /* target signal xn[]*/
  290.     /*----------------------------------------------------------------------*
  291.      *                 Closed-loop fractional pitch search                  *
  292.      *----------------------------------------------------------------------*/
  293.     T0 = Pitch_fr3(&exc[i_subfr], xn, h1, L_SUBFR, T0_min, T0_max,
  294.                                i_subfr, &T0_frac);
  295.     index = Enc_lag3(T0, T0_frac, &T0_min, &T0_max,PIT_MIN,PIT_MAX,i_subfr);
  296.     *ana++ = index;
  297.     if (i_subfr == 0) {
  298.       *ana++ = Parity_Pitch(index);
  299.     }
  300.    /*-----------------------------------------------------------------*
  301.     *   - find unity gain pitch excitation (adaptive codebook entry)  *
  302.     *     with fractional interpolation.                              *
  303.     *   - find filtered pitch exc. y1[]=exc[] convolve with h1[])     *
  304.     *   - compute pitch gain and limit between 0 and 1.2              *
  305.     *   - update target vector for codebook search                    *
  306.     *   - find LTP residual.                                          *
  307.     *-----------------------------------------------------------------*/
  308.     Pred_lt_3(&exc[i_subfr], T0, T0_frac, L_SUBFR);
  309.     Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
  310.     gain_pit = G_pitch(xn, y1, g_coeff, L_SUBFR);
  311.     /* clip pitch gain if taming is necessary */
  312.     temp = test_err(T0, T0_frac);
  313.     if( temp == 1){
  314.       if (sub(gain_pit, GPCLIP) > 0) {
  315.         gain_pit = GPCLIP;
  316.       }
  317.     }
  318.     /* xn2[i]   = xn[i] - y1[i] * gain_pit  */
  319.     for (i = 0; i < L_SUBFR; i++)
  320.     {
  321.       L_temp = L_mult(y1[i], gain_pit);
  322.       L_temp = L_shl(L_temp, 1);               /* gain_pit in Q14 */
  323.       xn2[i] = sub(xn[i], extract_h(L_temp));
  324.     }
  325.    /*-----------------------------------------------------*
  326.     * - Innovative codebook search.                       *
  327.     *-----------------------------------------------------*/
  328.     index = ACELP_Codebook(xn2, h1, T0, sharp, i_subfr, code, y2, &i);
  329.     *ana++ = index;        /* Positions index */
  330.     *ana++ = i;            /* Signs index     */
  331.    /*-----------------------------------------------------*
  332.     * - Quantization of gains.                            *
  333.     *-----------------------------------------------------*/
  334.     g_coeff_cs[0]     = g_coeff[0];                   /* <y1,y1> */
  335.     exp_g_coeff_cs[0] = negate(g_coeff[1]);           /* Q-Format:XXX -> JPN  */
  336.     g_coeff_cs[1]     = negate(g_coeff[2]);           /* (xn,y1) -> -2<xn,y1> */
  337.     exp_g_coeff_cs[1] = negate(add(g_coeff[3], 1));   /* Q-Format:XXX -> JPN  */
  338.     Corr_xy2( xn, y1, y2, g_coeff_cs, exp_g_coeff_cs );  /* Q0 Q0 Q12 ^Qx ^Q0 */
  339.                          /* g_coeff_cs[3]:exp_g_coeff_cs[3] = <y2,y2>   */
  340.                          /* g_coeff_cs[4]:exp_g_coeff_cs[4] = -2<xn,y2> */
  341.                          /* g_coeff_cs[5]:exp_g_coeff_cs[5] = 2<y1,y2>  */
  342.     *ana++ = Qua_gain(code, g_coeff_cs, exp_g_coeff_cs,
  343.                       L_SUBFR, &gain_pit, &gain_code, temp);
  344.    /*------------------------------------------------------------*
  345.     * - Update pitch sharpening "sharp" with quantized gain_pit  *
  346.     *------------------------------------------------------------*/
  347.     sharp = gain_pit;
  348.     if (sub(sharp, SHARPMAX) > 0) { sharp = SHARPMAX;         }
  349.     if (sub(sharp, SHARPMIN) < 0) { sharp = SHARPMIN;         }
  350.    /*------------------------------------------------------*
  351.     * - Find the total excitation                          *
  352.     * - find synthesis speech corresponding to exc[]       *
  353.     * - update filters memories for finding the target     *
  354.     *   vector in the next subframe                        *
  355.     *   (update error[-m..-1] and mem_w_err[])             *
  356.     *   update error function for taming process           *
  357.     *------------------------------------------------------*/
  358.     for (i = 0; i < L_SUBFR;  i++)
  359.     {
  360.       /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */
  361.       /* exc[i]  in Q0   gain_pit in Q14               */
  362.       /* code[i] in Q13  gain_cod in Q1                */
  363.       L_temp = L_mult(exc[i+i_subfr], gain_pit);
  364.       L_temp = L_mac(L_temp, code[i], gain_code);
  365.       L_temp = L_shl(L_temp, 1);
  366.       exc[i+i_subfr] = round(L_temp);
  367.     }
  368.     update_exc_err(gain_pit, T0);
  369.     Syn_filt(Aq, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 1);
  370.     for (i = L_SUBFR-M, j = 0; i < L_SUBFR; i++, j++)
  371.     {
  372.       mem_err[j] = sub(speech[i_subfr+i], synth[i_subfr+i]);
  373.       temp       = extract_h(L_shl( L_mult(y1[i], gain_pit),  1) );
  374.       k          = extract_h(L_shl( L_mult(y2[i], gain_code), 2) );
  375.       mem_w0[j]  = sub(xn[i], add(temp, k));
  376.     }
  377.     A  += MP1;           /* interpolated LPC parameters for next subframe */
  378.     Aq += MP1;
  379.   }
  380.  /*--------------------------------------------------*
  381.   * Update signal for next frame.                    *
  382.   * -> shift to the left by L_FRAME:                 *
  383.   *     speech[], wsp[] and  exc[]                   *
  384.   *--------------------------------------------------*/
  385.   Copy(&old_speech[L_FRAME], &old_speech[0], L_TOTAL-L_FRAME);
  386.   Copy(&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);
  387.   Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
  388.   return;
  389. }
  390. /*---------------------------------------------------------------------------*
  391.  * routine  corr_xy2()                                                       *
  392.  * ~~~~~~~~~~~~~~~~~~~~                                                      *
  393.  * Find the correlations between the target xn[], the filtered adaptive      *
  394.  * codebook excitation y1[], and the filtered 1st codebook innovation y2[].  *
  395.  *   g_coeff[2]:exp_g_coeff[2] = <y2,y2>                                     *
  396.  *   g_coeff[3]:exp_g_coeff[3] = -2<xn,y2>                                   *
  397.  *   g_coeff[4]:exp_g_coeff[4] = 2<y1,y2>                                    *
  398.  *---------------------------------------------------------------------------*/
  399. void Corr_xy2(
  400.       Word16 xn[],           /* (i) Q0  :Target vector.                  */
  401.       Word16 y1[],           /* (i) Q0  :Adaptive codebook.              */
  402.       Word16 y2[],           /* (i) Q12 :Filtered innovative vector.     */
  403.       Word16 g_coeff[],      /* (o) Q[exp]:Correlations between xn,y1,y2 */
  404.       Word16 exp_g_coeff[]   /* (o)       :Q-format of g_coeff[]         */
  405. )
  406. {
  407.       Word16   i,exp;
  408.       Word16   exp_y2y2,exp_xny2,exp_y1y2;
  409.       Word16   y2y2,    xny2,    y1y2;
  410.       Word32   L_acc;
  411.       Word16   scaled_y2[L_SUBFR];       /* Q9 */
  412.       /*------------------------------------------------------------------*
  413.        * Scale down y2[] from Q12 to Q9 to avoid overflow                 *
  414.        *------------------------------------------------------------------*/
  415.       for(i=0; i<L_SUBFR; i++)
  416.          scaled_y2[i] = shr(y2[i], 3);
  417.       /* Compute scalar product <y2[],y2[]> */
  418.       L_acc = 1;                       /* Avoid case of all zeros */
  419.       for(i=0; i<L_SUBFR; i++)
  420.          L_acc = L_mac(L_acc, scaled_y2[i], scaled_y2[i]);    /* L_acc:Q19 */
  421.       exp      = norm_l(L_acc);
  422.       y2y2     = round( L_shl(L_acc, exp) );
  423.       exp_y2y2 = add(exp, 19-16);                          /* Q[19+exp-16] */
  424.       g_coeff[2]     = y2y2;
  425.       exp_g_coeff[2] = exp_y2y2;
  426.       /* Compute scalar product <xn[],y2[]> */
  427.       L_acc = 1;                       /* Avoid case of all zeros */
  428.       for(i=0; i<L_SUBFR; i++)
  429.          L_acc = L_mac(L_acc, xn[i], scaled_y2[i]);           /* L_acc:Q10 */
  430.       exp      = norm_l(L_acc);
  431.       xny2     = round( L_shl(L_acc, exp) );
  432.       exp_xny2 = add(exp, 10-16);                          /* Q[10+exp-16] */
  433.       g_coeff[3]     = negate(xny2);
  434.       exp_g_coeff[3] = sub(exp_xny2,1);                   /* -2<xn,y2> */
  435.       /* Compute scalar product <y1[],y2[]> */
  436.       L_acc = 1;                       /* Avoid case of all zeros */
  437.       for(i=0; i<L_SUBFR; i++)
  438.          L_acc = L_mac(L_acc, y1[i], scaled_y2[i]);           /* L_acc:Q10 */
  439.       exp      = norm_l(L_acc);
  440.       y1y2     = round( L_shl(L_acc, exp) );
  441.       exp_y1y2 = add(exp, 10-16);                          /* Q[10+exp-16] */
  442.       g_coeff[4]     = y1y2;
  443.       exp_g_coeff[4] = sub(exp_y1y2,1);    ;                /* 2<y1,y2> */
  444.       return;
  445. }
  446. /**************************************************************************
  447.  * routine test_err - computes the accumulated potential error in the     *
  448.  * adaptive codebook contribution                                         *
  449.  **************************************************************************/
  450. static Word16 test_err(  /* (o) flag set to 1 if taming is necessary  */
  451.  Word16 T0,       /* (i) integer part of pitch delay           */
  452.  Word16 T0_frac   /* (i) fractional part of pitch delay        */
  453. )
  454.  {
  455.     Word16 i, t1, zone1, zone2, flag;
  456.     Word32 L_maxloc, L_acc;
  457.     if(T0_frac > 0) {
  458.         t1 = add(T0, 1);
  459.     }
  460.     else {
  461.         t1 = T0;
  462.     }
  463.     i = sub(t1, (L_SUBFR+L_INTER10));
  464.     if(i < 0) {
  465.         i = 0;
  466.     }
  467.     zone1 = tab_zone[i];
  468.     i = add(t1, (L_INTER10 - 2));
  469.     zone2 = tab_zone[i];
  470.     L_maxloc = -1L;
  471.     flag = 0 ;
  472.     for(i=zone2; i>=zone1; i--) {
  473.         L_acc = L_sub(L_exc_err[i], L_maxloc);
  474.         if(L_acc > 0L) {
  475.                 L_maxloc = L_exc_err[i];
  476.         }
  477.     }
  478.     L_acc = L_sub(L_maxloc, L_THRESH_ERR);
  479.     if(L_acc > 0L) {
  480.         flag = 1;
  481.     }
  482.     return(flag);
  483. }
  484. /**************************************************************************
  485.  *routine update_exc_err - maintains the memory used to compute the error *
  486.  * function due to an adaptive codebook mismatch between encoder and      *
  487.  * decoder                                                                *
  488.  **************************************************************************/
  489. static void update_exc_err(
  490.  Word16 gain_pit,      /* (i) pitch gain */
  491.  Word16 T0             /* (i) integer part of pitch delay */
  492. )
  493.  {
  494.     Word16 i, zone1, zone2, n;
  495.     Word32 L_worst, L_temp, L_acc;
  496.     Word16 hi, lo;
  497.     L_worst = -1L;
  498.     n = sub(T0, L_SUBFR);
  499.     if(n < 0) {
  500.         L_Extract(L_exc_err[0], &hi, &lo);
  501.         L_temp = Mpy_32_16(hi, lo, gain_pit);
  502.         L_temp = L_shl(L_temp, 1);
  503.         L_temp = L_add(0x00004000L, L_temp);
  504.         L_acc = L_sub(L_temp, L_worst);
  505.         if(L_acc > 0L) {
  506.                 L_worst = L_temp;
  507.         }
  508.         L_Extract(L_temp, &hi, &lo);
  509.         L_temp = Mpy_32_16(hi, lo, gain_pit);
  510.         L_temp = L_shl(L_temp, 1);
  511.         L_temp = L_add(0x00004000L, L_temp);
  512.         L_acc = L_sub(L_temp, L_worst);
  513.         if(L_acc > 0L) {
  514.                 L_worst = L_temp;
  515.         }
  516.     }
  517.     else {
  518.         zone1 = tab_zone[n];
  519.         i = sub(T0, 1);
  520.         zone2 = tab_zone[i];
  521.         for(i = zone1; i <= zone2; i++) {
  522.                 L_Extract(L_exc_err[i], &hi, &lo);
  523.                 L_temp = Mpy_32_16(hi, lo, gain_pit);
  524.                 L_temp = L_shl(L_temp, 1);
  525.                 L_temp = L_add(0x00004000L, L_temp);
  526.                 L_acc = L_sub(L_temp, L_worst);
  527.                 if(L_acc > 0L) L_worst = L_temp;
  528.         }
  529.     }
  530.     for(i=3; i>=1; i--) {
  531.         L_exc_err[i] = L_exc_err[i-1];
  532.     }
  533.     L_exc_err[0] = L_worst;
  534.     return;
  535. }