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