📄 pitch_a.c
字号:
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 + -