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

📄 pitch_a.c

📁 C源程序---G.729a语音代码G.729a语音代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    sum = L_mac(sum, x[i], y[i]);  return sum;}/*--------------------------------------------------------------------------* *  Function  Pitch_fr3_fast()                                              * *  ~~~~~~~~~~~~~~~~~~~~~~~~~~                                              * * Fast version of the pitch close loop.                                    * *--------------------------------------------------------------------------*/Word16 Pitch_fr3_fast(/* (o)     : pitch period.                          */  Word16 exc[],       /* (i)     : excitation buffer                      */  Word16 xn[],        /* (i)     : target vector                          */  Word16 h[],         /* (i) Q12 : impulse response of filters.           */  Word16 L_subfr,     /* (i)     : Length of subframe                     */  Word16 t0_min,      /* (i)     : minimum value in the searched range.   */  Word16 t0_max,      /* (i)     : maximum value in the searched range.   */  Word16 i_subfr,     /* (i)     : indicator for first subframe.          */  Word16 *pit_frac    /* (o)     : chosen fraction.                       */){  Word16 t, t0;  Word16 Dn[L_SUBFR];  Word16 exc_tmp[L_SUBFR];  Word32 max, corr, L_temp; /*-----------------------------------------------------------------*  * Compute correlation of target vector with impulse response.     *  *-----------------------------------------------------------------*/  Cor_h_X(h, xn, Dn); /*-----------------------------------------------------------------*  * Find maximum integer delay.                                     *  *-----------------------------------------------------------------*/  max = MIN_32;  t0 = t0_min; /* Only to remove warning from some compilers */  for(t=t0_min; t<=t0_max; t++)  {    corr = Dot_Product(Dn, &exc[-t], L_subfr);    L_temp = L_sub(corr, max);    if(L_temp > 0) {max = corr; t0 = t;  }  } /*-----------------------------------------------------------------*  * Test fractions.                                                 *  *-----------------------------------------------------------------*/  /* Fraction 0 */  Pred_lt_3(exc, t0, 0, L_subfr);  max = Dot_Product(Dn, exc, L_subfr);  *pit_frac = 0;  /* If first subframe and lag > 84 do not search fractional pitch */  if( (i_subfr == 0) && (sub(t0, 84) > 0) )    return t0;  Copy(exc, exc_tmp, L_subfr);  /* Fraction -1/3 */  Pred_lt_3(exc, t0, -1, L_subfr);  corr = Dot_Product(Dn, exc, L_subfr);  L_temp = L_sub(corr, max);  if(L_temp > 0) {     max = corr;     *pit_frac = -1;     Copy(exc, exc_tmp, L_subfr);  }  /* Fraction +1/3 */  Pred_lt_3(exc, t0, 1, L_subfr);  corr = Dot_Product(Dn, exc, L_subfr);  L_temp = L_sub(corr, max);  if(L_temp > 0) {     max = corr;     *pit_frac =  1;  }  else    Copy(exc_tmp, exc, L_subfr);  return t0;}/*---------------------------------------------------------------------* * Function  G_pitch:                                                  * *           ~~~~~~~~                                                  * *---------------------------------------------------------------------* * Compute correlations <xn,y1> and <y1,y1> to use in gains quantizer. * * Also compute the gain of pitch. Result in Q14                       * *  if (gain < 0)  gain =0                                             * *  if (gain >1.2) gain =1.2                                           * *---------------------------------------------------------------------*/Word16 G_pitch(      /* (o) Q14 : Gain of pitch lag saturated to 1.2       */  Word16 xn[],       /* (i)     : Pitch target.                            */  Word16 y1[],       /* (i)     : Filtered adaptive codebook.              */  Word16 g_coeff[],  /* (i)     : Correlations need for gain quantization. */  Word16 L_subfr     /* (i)     : Length of subframe.                      */){   Word16 i;   Word16 xy, yy, exp_xy, exp_yy, gain;   Word32 s;   Word16 scaled_y1[L_SUBFR];   /* divide "y1[]" by 4 to avoid overflow */   for(i=0; i<L_subfr; i++)     scaled_y1[i] = shr(y1[i], 2);   /* Compute scalar product <y1[],y1[]> */   Overflow = 0;   s = 1;                    /* Avoid case of all zeros */   for(i=0; i<L_subfr; i++)     s = L_mac(s, y1[i], y1[i]);   if (Overflow == 0) {     exp_yy = norm_l(s);     yy     = round( L_shl(s, exp_yy) );   }   else {     s = 1;                  /* Avoid case of all zeros */     for(i=0; i<L_subfr; i++)       s = L_mac(s, scaled_y1[i], scaled_y1[i]);     exp_yy = norm_l(s);     yy     = round( L_shl(s, exp_yy) );     exp_yy = sub(exp_yy, 4);   }   /* Compute scalar product <xn[],y1[]> */   Overflow = 0;   s = 0;   for(i=0; i<L_subfr; i++)     s = L_mac(s, xn[i], y1[i]);   if (Overflow == 0) {     exp_xy = norm_l(s);     xy     = round( L_shl(s, exp_xy) );   }   else {     s = 0;     for(i=0; i<L_subfr; i++)       s = L_mac(s, xn[i], scaled_y1[i]);     exp_xy = norm_l(s);     xy     = round( L_shl(s, exp_xy) );     exp_xy = sub(exp_xy, 2);   }   g_coeff[0] = yy;   g_coeff[1] = sub(15, exp_yy);   g_coeff[2] = xy;   g_coeff[3] = sub(15, exp_xy);   /* If (xy <= 0) gain = 0 */   if (xy <= 0)   {      g_coeff[3] = -15;   /* Force exp_xy to -15 = (15-30) */      return( (Word16) 0);   }   /* compute gain = xy/yy */   xy = shr(xy, 1);             /* Be sure xy < yy */   gain = div_s( xy, yy);   i = sub(exp_xy, exp_yy);   gain = shr(gain, i);         /* saturation if > 1.99 in Q14 */   /* if(gain >1.2) gain = 1.2  in Q14 */   if( sub(gain, 19661) > 0)   {     gain = 19661;   }   return(gain);}/*----------------------------------------------------------------------* *    Function Enc_lag3                                                 * *             ~~~~~~~~                                                 * *   Encoding of fractional pitch lag with 1/3 resolution.              * *----------------------------------------------------------------------* * The pitch range for the first subframe is divided as follows:        * *   19 1/3  to   84 2/3   resolution 1/3                               * *   85      to   143      resolution 1                                 * *                                                                      * * The period in the first subframe is encoded with 8 bits.             * * For the range with fractions:                                        * *   index = (T-19)*3 + frac - 1;   where T=[19..85] and frac=[-1,0,1]  * * and for the integer only range                                       * *   index = (T - 85) + 197;        where T=[86..143]                   * *----------------------------------------------------------------------* * For the second subframe a resolution of 1/3 is always used, and the  * * search range is relative to the lag in the first subframe.           * * If t0 is the lag in the first subframe then                          * *  t_min=t0-5   and  t_max=t0+4   and  the range is given by           * *       t_min - 2/3   to  t_max + 2/3                                  * *                                                                      * * The period in the 2nd subframe is encoded with 5 bits:               * *   index = (T-(t_min-1))*3 + frac - 1;    where T[t_min-1 .. t_max+1] * *----------------------------------------------------------------------*/Word16 Enc_lag3(     /* output: Return index of encoding */  Word16 T0,         /* input : Pitch delay              */  Word16 T0_frac,    /* input : Fractional pitch delay   */  Word16 *T0_min,    /* in/out: Minimum search delay     */  Word16 *T0_max,    /* in/out: Maximum search delay     */  Word16 pit_min,    /* input : Minimum pitch delay      */  Word16 pit_max,    /* input : Maximum pitch delay      */  Word16 pit_flag    /* input : Flag for 1st subframe    */){  Word16 index, i;  if (pit_flag == 0)   /* if 1st subframe */  {    /* encode pitch delay (with fraction) */    if (sub(T0, 85) <= 0)    {      /* index = t0*3 - 58 + t0_frac   */      i = add(add(T0, T0), T0);      index = add(sub(i, 58), T0_frac);    }    else {      index = add(T0, 112);    }    /* find T0_min and T0_max for second subframe */    *T0_min = sub(T0, 5);    if (sub(*T0_min, pit_min) < 0)    {      *T0_min = pit_min;    }    *T0_max = add(*T0_min, 9);    if (sub(*T0_max, pit_max) > 0)    {      *T0_max = pit_max;      *T0_min = sub(*T0_max, 9);    }  }  else      /* if second subframe */  {    /* i = t0 - t0_min;               */    /* index = i*3 + 2 + t0_frac;     */    i = sub(T0, *T0_min);    i = add(add(i, i), i);    index = add(add(i, 2), T0_frac);  }  return index;}

⌨️ 快捷键说明

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