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

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. #include "typedef.h"
  3. #include "basic_op.h"
  4. #include "ld8k.h"
  5. static Word16     smooth = 1;
  6. static Word16     LarOld[2] = {0, 0};
  7. /************************************************************************/
  8. /*                                                                      */
  9. /*   ADAPTIVE BANDWIDTH EXPANSION FOR THE PERCEPTUAL WEIGHTING FILTER   */
  10. /*                                                                      */
  11. /*                 W(z) = A (z/gamma1) / A(z/gamma2)                    */
  12. /*                                                                      */
  13. /************************************************************************/
  14. void perc_var (
  15.   Word16 *gamma1, /* Bandwidth expansion parameter */
  16.   Word16 *gamma2, /* Bandwidth expansion parameter */
  17.   Word16 *LsfInt, /* Interpolated LSP vector : 1st subframe */
  18.   Word16 *LsfNew, /* New LSP vector : 2nd subframe */
  19.   Word16 *r_c     /* Reflection coefficients */
  20. )
  21. {
  22.   Word32   L_temp;
  23.   Word16   cur_rc;                    /* Q11 */
  24.   Word16   Lar[4];                    /* Q11 */
  25.   Word16  *LarNew;                    /* Q11 */
  26.   Word16  *Lsf;                       /* Q15 */
  27.   Word16   CritLar0, CritLar1;        /* Q11 */
  28.   Word16   temp;
  29.   Word16   d_min;                     /* Q10 */
  30.   Word16   i, k;
  31.   for (k=0; k<M; k++) {
  32.     LsfInt[k] = shl(LsfInt[k], 1);
  33.     LsfNew[k] = shl(LsfNew[k], 1);
  34.   }
  35.   LarNew = &Lar[2];
  36.   /* ---------------------------------------- */
  37.   /* Reflection coefficients ---> Lar         */
  38.   /* Lar(i) = log10( (1+rc) / (1-rc) )        */
  39.   /* Approximated by                          */
  40.   /* x <= SEG1            y = x               */
  41.   /* SEG1 < x <= SEG2     y = A1 x - B1_L     */
  42.   /* SEG2 < x <= SEG3     y = A2 x - B2_L     */
  43.   /* x > SEG3             y = A3 x - B3_L     */
  44.   /* ---------------------------------------- */
  45.   for (i=0; i<2; i++) {
  46.     cur_rc = abs_s(r_c[i]);
  47.     cur_rc = shr(cur_rc, 4);
  48.     if (sub(cur_rc ,SEG1)<= 0) {
  49.         LarNew[i] = cur_rc;
  50.     }
  51.     else {
  52.       if (sub(cur_rc,SEG2)<= 0) {
  53.         cur_rc = shr(cur_rc, 1);
  54.         L_temp = L_mult(cur_rc, A1);
  55.         L_temp = L_sub(L_temp, L_B1);
  56.         L_temp = L_shr(L_temp, 11);
  57.         LarNew[i] = extract_l(L_temp);
  58.       }
  59.       else {
  60.         if (sub(cur_rc ,SEG3)<= 0) {
  61.           cur_rc = shr(cur_rc, 1);
  62.           L_temp = L_mult(cur_rc, A2);
  63.           L_temp = L_sub(L_temp, L_B2);
  64.           L_temp = L_shr(L_temp, 11);
  65.           LarNew[i] = extract_l(L_temp);
  66.         }
  67.         else {
  68.           cur_rc = shr(cur_rc, 1);
  69.           L_temp = L_mult(cur_rc, A3);
  70.           L_temp = L_sub(L_temp, L_B3);
  71.           L_temp = L_shr(L_temp, 11);
  72.           LarNew[i] = extract_l(L_temp);
  73.         }
  74.       }
  75.     }
  76.     if (r_c[i] < 0) {
  77.         LarNew[i] = sub(0, LarNew[i]);
  78.     }
  79.   }
  80.   /* Interpolation of Lar for the 1st subframe */
  81.   temp = add(LarNew[0], LarOld[0]);
  82.   Lar[0] = shr(temp, 1);
  83.   LarOld[0] = LarNew[0];
  84.   temp = add(LarNew[1], LarOld[1]);
  85.   Lar[1] = shr(temp, 1);
  86.   LarOld[1] = LarNew[1];
  87.   for (k=0; k<2; k++) { /* LOOP : gamma2 for 1st to 2nd subframes */
  88.       /* ---------------------------------------------------------- */
  89.       /* First criterion based on the first two Lars                */
  90.       /* smooth == 1  ==>  gamma2 can vary from 0.4 to 0.7          */
  91.       /* smooth == 0  ==>  gamma2 is set to 0.6                     */
  92.       /*                                                            */
  93.       /* Double threshold + hysteresis :                            */
  94.       /* if smooth = 1                                              */
  95.       /*  if (CritLar0 < THRESH_L1) and (CritLar1 > THRESH_H1)      */
  96.       /*                                                 smooth = 0 */
  97.       /* if smooth = 0                                              */
  98.       /*  if (CritLar0 > THRESH_L2) or (CritLar1 < THRESH_H2)       */
  99.       /*                                                 smooth = 1 */
  100.       /* ---------------------------------------------------------- */
  101.       CritLar0 = Lar[2*k];
  102.       CritLar1 = Lar[2*k+1];
  103.       if (smooth != 0) {
  104.         if ((sub(CritLar0,THRESH_L1)<0)&&( sub(CritLar1,THRESH_H1)>0)) {
  105.             smooth = 0;
  106.         }
  107.       }
  108.       else {
  109.         if ( (sub(CritLar0 ,THRESH_L2)>0) || (sub(CritLar1,THRESH_H2) <0) ) {
  110.             smooth = 1;
  111.         }
  112.       }
  113.     if (smooth == 0) {
  114.       /* ------------------------------------------------------ */
  115.       /* Second criterion based on the minimum distance between */
  116.       /*                two successives LSPs                    */
  117.       /*                                                        */
  118.       /*           gamma2[k] = -6.0 * pi * d_min + 1.0          */
  119.       /*                                                        */
  120.       /*       with Lsfs normalized range 0.0 <= val <= 1.0     */
  121.       /* ------------------------------------------------------ */
  122.       gamma1[k] = GAMMA1_0;
  123.       if (k == 0) {
  124.         Lsf = LsfInt;
  125.       }
  126.       else {
  127.         Lsf = LsfNew;
  128.       }
  129.       d_min = sub(Lsf[1], Lsf[0]);
  130.       for (i=1; i<M-1; i++) {
  131.         temp = sub(Lsf[i+1],Lsf[i]);
  132.         if (sub(temp,d_min)<0) {
  133.             d_min = temp;
  134.         }
  135.       }
  136.       temp = mult(ALPHA, d_min);
  137.       temp = sub(BETA, temp);
  138.       temp = shl(temp, 5);
  139.       gamma2[k] = temp;
  140.       if (sub(gamma2[k] , GAMMA2_0_H)>0) {
  141.         gamma2[k] = GAMMA2_0_H;
  142.       }
  143.       if (sub(gamma2[k] ,GAMMA2_0_L)<0) {
  144.         gamma2[k] = GAMMA2_0_L;
  145.       }
  146.     }
  147.     else {
  148.       gamma1[k] = GAMMA1_1;
  149.       gamma2[k] = GAMMA2_1;
  150.     }
  151.   }
  152.   return;
  153. }