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

📄 g729ev_g729_pwf.c

📁 最新的ITU-T的宽带语音编解码标准G.729.1,是对原先的G.729的最好的调整.码流输出速率可以进行自适应调整.满足未来通信要求.希望对大家有所帮助.
💻 C
字号:
/* ITU-T G.729EV Optimization/Characterization Candidate                         *//* Version:       1.0.a                                                          *//* Revision Date: June 28, 2006                                                  *//*   ITU-T G.729EV Optimization/Characterization Candidate    ANSI-C Source Code   Copyright (c) 2006    France Telecom, Matsushita Electric, Mindspeed, Siemens AG, ETRI, VoiceAge Corp.   All rights reserved*/#include "stl.h"#include "G729EV_G729_ld8k.h"/************************************************************************//*                                                                      *//*   ADAPTIVE BANDWIDTH EXPANSION for THE PERCEPTUAL WEIGHTING FILTER   *//*                                                                      *//*                 W(z) = A (z/gamma1) / A(z/gamma2)                    *//*                                                                      *//************************************************************************/void G729EV_G729_perc_var(Word16 * gamma1,  /* Bandwidth expansion parameter */                          Word16 * gamma2,  /* Bandwidth expansion parameter */                          Word16 * LsfInt,  /* Interpolated LSP vector : 1st subframe */                          Word16 * LsfNew,  /* New LSP vector : 2nd subframe */                          Word16 * r_c,     /* Reflection coefficients */                          Word16 * smooth, Word16 LarOld[2]){  Word32    L_temp;  Word16    Lar[4];             /* Q11 */  Word16   *LarNew;             /* Q11 */  Word16   *Lsf;                /* Q15 */  Word16    cur_rc;             /* Q11 */  Word16    CritLar0, CritLar1; /* Q11 */  Word16    temp;  Word16    d_min;              /* Q10 */  Word16    i, k;  FOR(k = 0; k < G729EV_G729_M; k++)  {    LsfInt[k] = shl(LsfInt[k], 1);    LsfNew[k] = shl(LsfNew[k], 1);#ifdef WMOPS    move16();    move16();#endif  }  LarNew = &Lar[2];  /* ---------------------------------------------------------------------------- */  /* Reflection coefficients ---> Lar                                             */  /* Lar(i) = log10( (1+rc) / (1-rc) )                                            */  /* Approximated by                                                              */  /* x <= G729EV_G729_SEG1            y = x                                       */  /* G729EV_G729_SEG1 < x <= G729EV_G729_SEG2     y = G729EV_G729_A1 x - B1_L     */  /* G729EV_G729_SEG2 < x <= G729EV_G729_SEG3     y = G729EV_G729_A2 x - B2_L     */  /* x > G729EV_G729_SEG3             y = G729EV_G729_A3 x - B3_L                 */  /* ---------------------------------------------------------------------------- */  FOR(i = 0; i < 2; i++)  {    cur_rc = abs_s(r_c[i]);    cur_rc = shr(cur_rc, 4);    IF(sub(cur_rc, G729EV_G729_SEG1) <= 0)    {      LarNew[i] = cur_rc;#ifdef WMOPS      move16();#endif    }    ELSE    {      IF(sub(cur_rc, G729EV_G729_SEG2) <= 0)      {        cur_rc = shr(cur_rc, 1);        L_temp = L_mult(cur_rc, G729EV_G729_A1);        L_temp = L_sub(L_temp, G729EV_G729_L_B1);        L_temp = L_shr(L_temp, 11);        LarNew[i] = extract_l(L_temp);#ifdef WMOPS        move16();#endif      }      ELSE      {        IF(sub(cur_rc, G729EV_G729_SEG3) <= 0)        {          cur_rc = shr(cur_rc, 1);          L_temp = L_mult(cur_rc, G729EV_G729_A2);          L_temp = L_sub(L_temp, G729EV_G729_L_B2);          L_temp = L_shr(L_temp, 11);          LarNew[i] = extract_l(L_temp);#ifdef WMOPS          move16();#endif        }        ELSE        {          cur_rc = shr(cur_rc, 1);          L_temp = L_mult(cur_rc, G729EV_G729_A3);          L_temp = L_sub(L_temp, G729EV_G729_L_B3);          L_temp = L_shr(L_temp, 11);          LarNew[i] = extract_l(L_temp);#ifdef WMOPS          move16();#endif        }      }    }    if (r_c[i] < 0)    {      LarNew[i] = sub(0, LarNew[i]);#ifdef WMOPS      move16();#endif    }  }  /* Interpolation of Lar for the 1st subframe */  temp = add(LarNew[0], LarOld[0]);  Lar[0] = shr(temp, 1);  LarOld[0] = LarNew[0];  temp = add(LarNew[1], LarOld[1]);  Lar[1] = shr(temp, 1);  LarOld[1] = LarNew[1];#ifdef WMOPS  move16();  move16();  move16();  move16();#endif  FOR(k = 0; k < 2; k++)  {                             /* LOOP : gamma2 for 1st to 2nd subframes */    /* ---------------------------------------------------------- */    /* First criterion based on the first two Lars                */    /* smooth == 1  ==>  gamma2 can vary from 0.4 to 0.7          */    /* smooth == 0  ==>  gamma2 is set to 0.6                     */    /*                                                            */    /* Double threshold + hysteresis :                            */    /* if smooth = 1                                              */    /*  if (CritLar0 < THRESH_L1) and (CritLar1 > THRESH_H1)      */    /*                                                 smooth = 0 */    /* if smooth = 0                                              */    /*  if (CritLar0 > THRESH_L2) or (CritLar1 < THRESH_H2)       */    /*                                                 smooth = 1 */    /* ---------------------------------------------------------- */    CritLar0 = Lar[2 * k];    CritLar1 = Lar[2 * k + 1];#ifdef WMOPS    move16();    move16();#endif    IF(*smooth != 0)    {#ifdef WMOPS      test();#endif      if ((sub(CritLar0, G729EV_G729_THRESH_L1) < 0) && (sub(CritLar1, G729EV_G729_THRESH_H1) > 0))      {        *smooth = 0;#ifdef WMOPS        move16();#endif      }    }    ELSE    {#ifdef WMOPS      test();#endif      if ((sub(CritLar0, G729EV_G729_THRESH_L2) > 0) || (sub(CritLar1, G729EV_G729_THRESH_H2) < 0))      {        *smooth = 1;#ifdef WMOPS        move16();#endif      }    }    IF(*smooth == 0)    {      /* ------------------------------------------------------ */      /* Second criterion based on the minimum distance between */      /*                two successives LSPs                    */      /*                                                        */      /*           gamma2[k] = -6.0 * pi * d_min + 1.0          */      /*                                                        */      /*       with Lsfs normalized range 0.0 <= val <= 1.0     */      /* ------------------------------------------------------ */      gamma1[k] = G729EV_G729_GAMMA1_0;#ifdef WMOPS      move16();      move16();#endif      IF(k == 0)      {        Lsf = LsfInt;      }      ELSE      {        Lsf = LsfNew;      }      d_min = sub(Lsf[1], Lsf[0]);      FOR(i = 1; i < G729EV_G729_M - 1; i++)      {        temp = sub(Lsf[i + 1], Lsf[i]);        if (sub(temp, d_min) < 0)        {#ifdef WMOPS          move16();#endif          d_min = temp;        }      }      temp = mult(G729EV_G729_ALPHA, d_min);      temp = sub(G729EV_G729_BETA, temp);      temp = shl(temp, 5);      gamma2[k] = temp;#ifdef WMOPS      move16();#endif      if (sub(gamma2[k], G729EV_G729_GAMMA2_0_H) > 0)      {#ifdef WMOPS        move16();#endif        gamma2[k] = G729EV_G729_GAMMA2_0_H;      }      if (sub(gamma2[k], G729EV_G729_GAMMA2_0_L) < 0)      {#ifdef WMOPS        move16();#endif        gamma2[k] = G729EV_G729_GAMMA2_0_L;      }    }    ELSE    {      gamma1[k] = G729EV_G729_GAMMA1_1;      gamma2[k] = G729EV_G729_GAMMA2_1;#ifdef WMOPS      move16();      move16();#endif    }  }  return;}

⌨️ 快捷键说明

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