⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cod_ld8a.c

📁 关于对传统的只能传递文本信息的G。729的改进
💻 C
📖 第 1 页 / 共 2 页
字号:
 *       * find the interpolated LSPs and convert to a[] for the 2        *

 *         subframes (both quantized and unquantized)                     *

 *------------------------------------------------------------------------*/

   {

      /* Temporary vectors */

     FLOAT r[MP1];                    /* Autocorrelations       */

     FLOAT rc[M];                     /* Reflexion coefficients */

     FLOAT lsp_new[M];                /* lsp coefficients       */

     FLOAT lsp_new_q[M];              /* Quantized lsp coeff.   */



     /* LP analysis */



     autocorr(p_window, M, r);             /* Autocorrelations */

     lag_window(M, r);                     /* Lag windowing    */

     levinson(r, Ap_t, rc);                /* Levinson Durbin  */

     az_lsp(Ap_t, lsp_new, lsp_old);       /* Convert A(z) to lsp */



     /* LSP quantization */



     qua_lsp(lsp_new, lsp_new_q, ana);

     ana += 2;                        /* Advance analysis parameters pointer */



    /*--------------------------------------------------------------------*

     * Find interpolated LPC parameters in all subframes                  *

     * The interpolated parameters are in array Aq_t[].                   *

     *--------------------------------------------------------------------*/



    int_qlpc(lsp_old_q, lsp_new_q, Aq_t);



    /* Compute A(z/gamma) */



    weight_az(&Aq_t[0],   GAMMA1, M, &Ap_t[0]);

    weight_az(&Aq_t[MP1], GAMMA1, M, &Ap_t[MP1]);



    /* update the LSPs for the next frame */



    copy(lsp_new,   lsp_old,   M);

    copy(lsp_new_q, lsp_old_q, M);

  }



   /*----------------------------------------------------------------------*

    * - Find the weighted input speech w_sp[] for the whole speech frame   *

    * - Find the open-loop pitch delay for the whole speech frame          *

    * - Set the range for searching closed-loop pitch in 1st subframe      *

    *----------------------------------------------------------------------*/



   residu(&Aq_t[0],   &speech[0],       &exc[0],       L_SUBFR);

   residu(&Aq_t[MP1], &speech[L_SUBFR], &exc[L_SUBFR], L_SUBFR);



  {

     FLOAT Ap1[MP1];



     Ap = Ap_t;

     Ap1[0] = (F)1.0;

     for(i=1; i<=M; i++)

       Ap1[i] = Ap[i] - (F)0.7 * Ap[i-1];

     syn_filt(Ap1, &exc[0], &wsp[0], L_SUBFR, mem_w, 1);



     Ap += MP1;

     for(i=1; i<=M; i++)

       Ap1[i] = Ap[i] - (F)0.7 * Ap[i-1];

     syn_filt(Ap1, &exc[L_SUBFR], &wsp[L_SUBFR], L_SUBFR, mem_w, 1);

   }





   /* Find open loop pitch lag for whole speech frame */



   T_op = pitch_ol_fast(wsp, L_FRAME);



   /* Range for closed loop pitch search in 1st subframe */



   T0_min = T_op - 3;

   if (T0_min < PIT_MIN) T0_min = PIT_MIN;

   T0_max = T0_min + 6;

   if (T0_max > PIT_MAX)

   {

      T0_max = PIT_MAX;

      T0_min = T0_max - 6;

   }



   /*------------------------------------------------------------------------*

    *          Loop for every subframe in the analysis frame                 *

    *------------------------------------------------------------------------*

    *  To find the pitch and innovation parameters. The subframe size is     *

    *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *

    *     - find the weighted LPC coefficients                               *

    *     - find the LPC residual signal                                     *

    *     - compute the target signal for pitch search                       *

    *     - compute impulse response of weighted synthesis filter (h1[])     *

    *     - find the closed-loop pitch parameters                            *

    *     - encode the pitch delay                                           *

    *     - find target vector for codebook search                           *

    *     - codebook search                                                  *

    *     - VQ of pitch and codebook gains                                   *

    *     - update states of weighting filter                                *

    *------------------------------------------------------------------------*/



   Aq = Aq_t;    /* pointer to interpolated quantized LPC parameters */

   Ap = Ap_t;    /* pointer to weighted LPC coefficients             */



   for (i_subfr = 0;  i_subfr < L_FRAME; i_subfr += L_SUBFR)

   {

      /*---------------------------------------------------------------*

       * Compute impulse response, h1[], of weighted synthesis filter  *

       *---------------------------------------------------------------*/



      h1[0] = (F)1.0;

      set_zero(&h1[1], L_SUBFR-1);

      syn_filt(Ap, h1, h1, L_SUBFR, &h1[1], 0);



      /*-----------------------------------------------*

       * Find the target vector for pitch search:      *

       *----------------------------------------------*/



      syn_filt(Ap, &exc[i_subfr], xn, L_SUBFR, mem_w0, 0);



      /*-----------------------------------------------------------------*

       *    Closed-loop fractional pitch search                          *

       *-----------------------------------------------------------------*/



      T0 = pitch_fr3_fast(&exc[i_subfr], xn, h1, L_SUBFR, T0_min, T0_max,

                    i_subfr, &T0_frac);



      index = enc_lag3(T0, T0_frac, &T0_min, &T0_max, PIT_MIN, PIT_MAX,

                            i_subfr);



      *ana++ = index;



      if (i_subfr == 0)

        *ana++ = parity_pitch(index);



      /*-----------------------------------------------------------------*

       *   - find filtered pitch exc                                     *

       *   - compute pitch gain and limit between 0 and 1.2              *

       *   - update target vector for codebook search                    *

       *   - find LTP residual.                                          *

       *-----------------------------------------------------------------*/



      syn_filt(Ap, &exc[i_subfr], y1, L_SUBFR, mem_zero, 0);



      gain_pit = g_pitch(xn, y1, g_coeff, L_SUBFR);



      /* clip pitch gain if taming is necessary */



      taming = test_err(T0, T0_frac);



      if( taming == 1){

        if (gain_pit > GPCLIP) {

          gain_pit = GPCLIP;

      }

    }



    for (i = 0; i < L_SUBFR; i++)

        xn2[i] = xn[i] - y1[i]*gain_pit;



      /*-----------------------------------------------------*

       * - Innovative codebook search.                       *

       *-----------------------------------------------------*/



      index = ACELP_code_A(xn2, h1, T0, sharp, code, y2, &i);



      *ana++ = index;           /* Positions index */

      *ana++ = i;               /* Signs index     */



      /*------------------------------------------------------*

       *  - Compute the correlations <y2,y2>, <xn,y2>, <y1,y2>*

       *  - Vector quantize gains.                            *

       *------------------------------------------------------*/



      corr_xy2(xn, y1, y2, g_coeff);

       *ana++ =qua_gain(code, g_coeff, L_SUBFR, &gain_pit, &gain_code,

                                    taming);



      /*------------------------------------------------------------*

       * - Update pitch sharpening "sharp" with quantized gain_pit  *

       *------------------------------------------------------------*/



      sharp = gain_pit;

      if (sharp > SHARPMAX) sharp = SHARPMAX;

      if (sharp < SHARPMIN) sharp = SHARPMIN;



      /*------------------------------------------------------*

       * - Find the total excitation                          *

       * - update filters' memories for finding the target    *

       *   vector in the next subframe  (mem_w0[])            *

       *------------------------------------------------------*/



      for (i = 0; i < L_SUBFR;  i++)

        exc[i+i_subfr] = gain_pit*exc[i+i_subfr] + gain_code*code[i];



      update_exc_err(gain_pit, T0);



      for (i = L_SUBFR-M, j = 0; i < L_SUBFR; i++, j++)

        mem_w0[j]  = xn[i] - gain_pit*y1[i] - gain_code*y2[i];



      Aq += MP1;           /* interpolated LPC parameters for next subframe */

      Ap += MP1;

   }



   /*--------------------------------------------------*

    * Update signal for next frame.                    *

    * -> shift to the left by L_FRAME:                 *

    *     speech[], wsp[] and  exc[]                   *

    *--------------------------------------------------*/



   copy(&old_speech[L_FRAME], &old_speech[0], L_TOTAL-L_FRAME);

   copy(&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);

   copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);



   return;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -