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

📄 g729ev_celp2s_acelp_ca.c

📁 最新的ITU-T的宽带语音编解码标准G.729.1,是对原先的G.729的最好的调整.码流输出速率可以进行自适应调整.满足未来通信要求.希望对大家有所帮助.
💻 C
📖 第 1 页 / 共 4 页
字号:
    *p0++ = 0;  }  IF(layer != 0)  {#if (WMOPS)    logic16();    logic16();    logic16();    logic16();    move16();    move16();    move16();    move16();#endif    sign_pat[0] = i0 & 1;    sign_pat[1] = i1 & 1;    sign_pat[2] = i2 & 1;    sign_pat[3] = i3 & 1;    G729EV_CELP2S_Put4Patterns(ip, sign_pat, sp, cod);  }  ELSE  {#if (WMOPS)    move16();    move16();    move16();    move16();#endif    cod[ip[0]] = shr(i0, 2);    /* From Q15 to Q13 */    cod[ip[1]] = shr(i1, 2);    cod[ip[2]] = shr(i2, 2);    cod[ip[3]] = shr(i3, 2);  }  /* find the filtered codeword */  p0 = y;  FOR(i = 0; i < ip[0]; i++)  {#if (WMOPS)    move16();#endif    *p0++ = 0;  }  IF(i0 > 0)  {    IF(ip[0] > 0)    {#if (WMOPS)      move16();      move16();#endif      k = sub(ip[0], 1);      p0 = y + k;      p1 = h - 1;      FOR(i = k; i < G729EV_G729_L_SUBFR; i++)      {#if (WMOPS)        move16();#endif        *p0++ = *p1++;      }    }    ELSE    {#if (WMOPS)      move16();      move16();#endif      p0 = y + ip[0];      p1 = h0;      FOR(i = ip[0]; i < G729EV_G729_L_SUBFR; i++)      {#if (WMOPS)        move16();#endif        *p0++ = *p1++;      }    }  }  ELSE  {    IF(ip[0] > 0)    {#if (WMOPS)      move16();      move16();#endif      k = sub(ip[0], 1);      p0 = y + k;      p1 = h - 1;      FOR(i = k; i < G729EV_G729_L_SUBFR; i++)      {        *p0++ = negate(*p1++);#if (WMOPS)        move16();#endif      }    }    ELSE    {#if (WMOPS)      move16();      move16();#endif      p0 = y + ip[0];      p1 = h0;      FOR(i = ip[0]; i < G729EV_G729_L_SUBFR; i++)      {        *p0++ = negate(*p1++);#if (WMOPS)        move16();#endif      }    }  }#if (WMOPS)  move16();  move16();#endif  k = sub(ip[1], 1);  p0 = y + k;  p1 = h - 1;  IF(i1 > 0)  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = add(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }  ELSE  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = sub(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }#if (WMOPS)  move16();  move16();#endif  k = sub(ip[2], 1);  p0 = y + k;  p1 = h - 1;  IF(i2 > 0)  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = add(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }  ELSE  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = sub(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }#if (WMOPS)  move16();  move16();#endif  k = sub(ip[3], 1);  p0 = y + k;  p1 = h - 1;  IF(i3 > 0)  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = add(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }  ELSE  {    FOR(i = k; i < G729EV_G729_L_SUBFR; i++)    {      *p0++ = sub(y[i], *p1++);#if (WMOPS)      move16();#endif    }  }  /* find codebook index;  17-bit address */#if (WMOPS)  move16();#endif  i = 0;  if (i0 > 0)  {    i = add(i, 1);  }  if (i1 > 0)  {    i = add(i, 2);  }  if (i2 > 0)  {    i = add(i, 4);  }  if (i3 > 0)  {    i = add(i, 8);  }#if (WMOPS)  move16();#endif  *sign = i;#if (WMOPS)  move16();#endif  p0 = ip;  *p0++ = mult(ip[0], 6554);    /* ip[0]/5  */  *p0++ = mult(ip[1], 6554);    /* ip[1]/5  */  *p0++ = mult(ip[2], 6554);    /* ip[2]/5  */#if (WMOPS)  move16();  move16();  move16();#endif  i = mult(ip[3], 6554);        /* ip[3]/5  */  j = add(i, shl(i, 2));        /* j = i*5  */  j = sub(ip[3], add(j, 3));    /* j= ip3%5 -3 */  *p0 = add(shl(i, 1), j);#if (WMOPS)  move16();#endif  i = add(ip[0], shl(ip[1], 3));  i = add(i, shl(ip[2], 6));  i = add(i, shl(ip[3], 9));  return i;}/*-----------------------------------------------------------* *  Function  G729EV_CELP2S_ACELP_code_A_OTH()               * *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~               * *   Index of pulses positions                               * *-----------------------------------------------------------*/Word16 G729EV_CELP2S_ACELP_code_A_OTH(Word16 x[],           /* (i)  Target vector                */                                      Word16 res2[],        /* (i)  LTP residual                 */                                      Word16 h[],           /* (i)  Inpulse response of filters  */                                      Word16 T0,            /* (i)  Pitch lag                    */                                      Word16 pitch_sharp,   /* (i)  Last quantized pitch gain    */                                      Word16 code[],        /* (o)  Innovative codebook          */                                      Word16 y[],           /* (o)  Filtered innovative codebook */                                      Word16 * sign,        /* (o)  Signs of 4 pulses            */                                      Word16 y1[]           /* (i)  AC synthesized signal        */    ){  Word32    xtmp32, ytmp32;  Word16    i, index, sharp;  Word16    Dn[G729EV_G729_L_SUBFR], bn[G729EV_G729_L_SUBFR];  Word16    rr[G729EV_G729_DIM_RR];  Word16    norm_res2, norm_Dn;  Word16    h_buf[G729EV_G729_L_SUBFR + 1];  Word16   *ptr;  G729EV_G729_Copy(h, h_buf + 1, G729EV_G729_L_SUBFR);  h_buf[0] = 0;#if (WMOPS)  move16();#endif   /*-----------------------------------------------------------------*    * Include fixed-gain pitch contribution into impulse resp. h[]    *    * Find correlations of h[] needed for the codebook search.        *    *-----------------------------------------------------------------*/  sharp = shl(pitch_sharp, 1);  /* From Q14 to Q15 */  IF(sub(T0, G729EV_G729_L_SUBFR) < 0)  {    ptr = h + T0;    FOR(i = T0; i < G729EV_G729_L_SUBFR; i++)    {                           /* h[i] += pitch_sharp*h[i-T0] */      *ptr++ = add(h[i], mult(h[i - T0], sharp));#if (WMOPS)      move16();#endif    }  }  G729EV_CELP2S_cor_h_OTH(h, rr, y1);   /*-----------------------------------------------------------------*    * Compute correlation of target vector with impulse response.     *    *-----------------------------------------------------------------*/  G729EV_CELP2S_cor_h_x_OTH(h, x, Dn, y1);  /* Initialization of xtmp32 and ytmp32 */#if (WMOPS)  move32();  move32();#endif  xtmp32 = 256;  ytmp32 = 256;  FOR(i = 0; i < G729EV_G729_L_SUBFR; i++)  {    xtmp32 = L_mac(xtmp32, res2[i], res2[i]);    ytmp32 = L_mac(ytmp32, Dn[i], Dn[i]);  }  xtmp32 = Inv_sqrt(xtmp32);  norm_res2 = extract_h(L_shl(xtmp32, 5));  ytmp32 = Inv_sqrt(ytmp32);  norm_Dn = extract_h(L_shl(ytmp32, 5));  /* bn[i] = res2[i] * norm_res2 + Dn[i] * norm_Dn */  ptr = bn;  FOR(i = 0; i < G729EV_G729_L_SUBFR; i++)  {    xtmp32 = L_mult(norm_res2, res2[i]);    ytmp32 = L_mac(xtmp32, norm_Dn, Dn[i]);    *ptr++ = round(L_shl(ytmp32, 10));#if (WMOPS)    move16();#endif  }  /*-----------------------------------------------------------------*   * Find innovative codebook.                                       *   *-----------------------------------------------------------------*/  /* 1st layer search */  index = G729EV_CELP2S_d4i40_17_fast(0, 0, bn, Dn, rr, h_buf + 1, h_buf + 1, code, y, sign);  /*-----------------------------------------------------------------*   * Compute innovation vector gain.                                 *   * Include fixed-gain pitch contribution into code[].              *   *-----------------------------------------------------------------*/  IF(sub(T0, G729EV_G729_L_SUBFR) < 0)  {    ptr = code + T0;    FOR(i = T0; i < G729EV_G729_L_SUBFR; i++)  /* code[i] += pitch_sharp*code[i-T0] */      *ptr++ = add(code[i], mult(code[i - T0], sharp));#if (WMOPS)    move16();#endif  }  return index;}/*-----------------------------------------------------------* *  Function  G729EV_CELP2S_ACELP_code_2NDLAYER()            * *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~            * *   Index of patterns centre positions                      * *-----------------------------------------------------------*/Word16 G729EV_CELP2S_ACELP_code_2NDLAYER(Word16 x[],                /* (i)  Target vector                */                                         Word16 res2[],             /* (i)  LTP residual                 */                                         Word16 h[],                /* (i)  Impulse response of filters  */                                         Word16 norm_voiced_fac,    /* (i)  Voicing factor               */                                         Word16 code[],             /* (o)  Innovative codebook          */                                         Word16 y[],                /* (o)  Filtered innovative codebook */                                         Word16 * sign              /* (o)  Signs of 4 patterns          */    ){  Word32    xtmp32, ytmp32;  Word16    index;  Word16    rr[G729EV_G729_DIM_RR];  Word16    Dn[G729EV_G729_L_SUBFR], bn[G729EV_G729_L_SUBFR];  Word16    h_buf[G729EV_G729_L_SUBFR + 1], x_hp[G729EV_G729_L_SUBFR + 1];  Word16    h0_buf[G729EV_G729_L_SUBFR + 1], h1_buf[G729EV_G729_L_SUBFR + 1];  Word16    h0_buf0[G729EV_G729_L_SUBFR + 1];  Word16    norm_res2, norm_Dn;  Word16    i;  Word16    sp;  Word16   *ptr;  G729EV_G729_Copy(h, h0_buf + 1, G729EV_G729_L_SUBFR);  G729EV_G729_Copy(x, x_hp + 1, G729EV_G729_L_SUBFR);  h0_buf[0] = 0;  x_hp[0] = 0;#if (WMOPS)  move16();  move16();#endif  /* High Pass filter the target vector and the impulse response to better focus on HFs */  G729EV_MAIN_CONVOLVE_3Tap(h0_buf, h1_buf, G729EV_CELP2S_HP_FACT, G729EV_G729_L_SUBFR + 1);  G729EV_MAIN_CONVOLVE_3Tap(x_hp, x_hp, G729EV_CELP2S_HP_FACT, G729EV_G729_L_SUBFR + 1);  h1_buf[0] = 0;  x_hp[0] = 0;#if (WMOPS)  move16();  move16();#endif  sp = mult_r(G729EV_CELP2S_SP, norm_voiced_fac); /* compute side pulse amplitude */  /* Modify h to introduce tripulse pattern effect */  G729EV_MAIN_CONVOLVE_3Tap(h1_buf, h_buf, sp, G729EV_G729_L_SUBFR + 1); /*-----------------------------------------------------------------*  * Include fixed-gain pitch contribution into impulse resp. h[]    *  * Find correlations of h[] needed for the codebook search.        *  *-----------------------------------------------------------------*/  G729EV_G729_Cor_h(h_buf + 1, rr); /*-----------------------------------------------------------------*  * Compute correlation of target vector with impulse response.     *  *-----------------------------------------------------------------*/  G729EV_G729_Cor_h_X(h_buf + 1, x_hp + 1, Dn, 1);  /* Initialization of xtmp32 and ytmp32 */  xtmp32 = 256;  ytmp32 = 256;#if (WMOPS)  move32();  move32();#endif  FOR(i = 0; i < G729EV_G729_L_SUBFR; i++)  {    xtmp32 = L_mac(xtmp32, res2[i], res2[i]);    ytmp32 = L_mac(ytmp32, Dn[i], Dn[i]);  }  xtmp32 = Inv_sqrt(xtmp32);  norm_res2 = extract_h(L_shl(xtmp32, 5));  ytmp32 = Inv_sqrt(ytmp32);  norm_Dn = extract_h(L_shl(ytmp32, 5));  /* bn[i] = res2[i] * norm_res2 + Dn[i] * norm_Dn */  ptr = bn;  FOR(i = 0; i < G729EV_G729_L_SUBFR; i++)  {    xtmp32 = L_mult(norm_res2, res2[i]);    ytmp32 = L_mac(xtmp32, norm_Dn, Dn[i]);    *ptr++ = round(L_shl(ytmp32, 10));#if (WMOPS)    move16();#endif  } /*-----------------------------------------------------------------*  * Find innovative codebook.                                       *  *-----------------------------------------------------------------*/  G729EV_MAIN_CONVOLVE_2Tap(h0_buf, h0_buf0, sp, G729EV_G729_L_SUBFR + 1);  G729EV_MAIN_CONVOLVE_3Tap(h0_buf, h0_buf, sp, G729EV_G729_L_SUBFR + 1);  /* 2nd layer search */  index = G729EV_CELP2S_d4i40_17_fast(1, sp, bn, Dn, rr, h0_buf0 + 1, h0_buf + 1, code, y, sign);  return index;}

⌨️ 快捷键说明

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