📄 g729ev_g729_qua_gain.c
字号:
FOR(i = 0; i < 5; i++) { j = sub(exp_min[i], e_min); L_tmp = L_deposit_h(g_coeff[i]); L_tmp = L_shr(L_tmp, j); /* L_tmp:Q[exp_g_coeff[i]+16-j] */ L_Extract(L_tmp, &coeff[i], &coeff_lsf[i]); /* DPF */ } /* Codebook search */#if (WMOPS) move32(); move16(); move16();#endif L_dist_min = MAX_32; /* initialization used only to suppress Microsoft Visual C++ warnings */ index1 = cand1; index2 = cand2; IF(sub(tameflag, 1) == 0) { FOR(i = 0; i < G729EV_G729_NCAN1; i++) { FOR(j = 0; j < G729EV_G729_NCAN2; j++) { g_pitch = add(gbk1[cand1 + i][0], gbk2[cand2 + j][0]); /* Q14 */ IF(sub(g_pitch, G729EV_G729_GP0999) < 0) { L_acc = L_deposit_l(gbk1[cand1 + i][1]); L_accb = L_deposit_l(gbk2[cand2 + j][1]); /* Q13 */ L_tmp = L_add(L_acc, L_accb); tmp = extract_l(L_shr(L_tmp, 1)); /* Q12 */ g_code = mult(gcode0, tmp); /* Q[exp_gcode0+12-15] */ g2_pitch = mult(g_pitch, g_pitch); /* Q13 */ g2_code = mult(g_code, g_code); /* Q[2*exp_gcode0-6-15] */ g_pit_cod = mult(g_code, g_pitch); /* Q[exp_gcode0-3+14-15] */ L_tmp = Mpy_32_16(coeff[0], coeff_lsf[0], g2_pitch); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[1], coeff_lsf[1], g_pitch)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[2], coeff_lsf[2], g2_code)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[3], coeff_lsf[3], g_code)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[4], coeff_lsf[4], g_pit_cod)); L_temp = L_sub(L_tmp, L_dist_min); IF(L_temp < 0L) {#if (WMOPS) move32();#endif L_dist_min = L_tmp; index1 = add(cand1, i); index2 = add(cand2, j); } } } } } ELSE { FOR(i = 0; i < G729EV_G729_NCAN1; i++) { FOR(j = 0; j < G729EV_G729_NCAN2; j++) { g_pitch = add(gbk1[cand1 + i][0], gbk2[cand2 + j][0]); /* Q14 */ L_acc = L_deposit_l(gbk1[cand1 + i][1]); L_accb = L_deposit_l(gbk2[cand2 + j][1]); /* Q13 */ L_tmp = L_add(L_acc, L_accb); tmp = extract_l(L_shr(L_tmp, 1)); /* Q12 */ g_code = mult(gcode0, tmp); /* Q[exp_gcode0+12-15] */ g2_pitch = mult(g_pitch, g_pitch); /* Q13 */ g2_code = mult(g_code, g_code); /* Q[2*exp_gcode0-6-15] */ g_pit_cod = mult(g_code, g_pitch); /* Q[exp_gcode0-3+14-15] */ L_tmp = Mpy_32_16(coeff[0], coeff_lsf[0], g2_pitch); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[1], coeff_lsf[1], g_pitch)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[2], coeff_lsf[2], g2_code)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[3], coeff_lsf[3], g_code)); L_tmp = L_add(L_tmp, Mpy_32_16(coeff[4], coeff_lsf[4], g_pit_cod)); L_temp = L_sub(L_tmp, L_dist_min); IF(L_temp < 0L) {#if (WMOPS) move32();#endif L_dist_min = L_tmp; index1 = add(cand1, i); index2 = add(cand2, j); } } } } /* Read the quantized gain */ /*-----------------------------------------------------------------* * *gain_pit = gbk1[indice1][0] + gbk2[indice2][0]; * *-----------------------------------------------------------------*/#if (WMOPS) move16();#endif *gain_pit = add(gbk1[index1][0], gbk2[index2][0]); /* Q14 */ /*-----------------------------------------------------------------* * *gain_code = (gbk1[indice1][1]+gbk2[indice2][1]) * gcode0; * *-----------------------------------------------------------------*/ L_acc = L_deposit_l(gbk1[index1][1]); L_accb = L_deposit_l(gbk2[index2][1]); L_gbk12 = L_add(L_acc, L_accb); /* Q13 */ tmp = extract_l(L_shr(L_gbk12, 1)); /* Q12 */ L_acc = L_mult(tmp, gcode0); /* Q[exp_gcode0+12+1] */ L_acc = L_shl(L_acc, add(negate(exp_gcode0), (-12 - 1 + 1 + 16))); *gain_cod = extract_h(L_acc); /* Q1 */#if (WMOPS) move16();#endif /*----------------------------------------------* * update table of past quantized energies * *----------------------------------------------*/ G729EV_G729_Gain_update(past_qua_en, L_gbk12); return (add((Word16) (map1[index1] * (Word16) G729EV_G729_NCODE2), map2[index2]));}/*---------------------------------------------------------------------------* * Function G729EV_G729_Gbk_presel * * ~~~~~~~~~~~~~~~~~~~ * * - presearch for gain codebook - * *---------------------------------------------------------------------------*/static void G729EV_G729_Gbk_presel(Word16 best_gain[], /* (i) [0] Q9 : unquantized pitch gain */ /* (i) [1] Q2 : unquantized code gain */ Word16 * cand1, /* (o) : index of best 1st stage vector */ Word16 * cand2, /* (o) : index of best 2nd stage vector */ Word16 gcode0 /* (i) Q4 : presearch for gain codebook */ ){ Word32 L_acc, L_preg, L_cfbg, L_tmp, L_tmp_x, L_tmp_y; Word32 L_temp; Word16 acc_h; Word16 sft_x, sft_y; /*--------------------------------------------------------------------------* x = (best_gain[1]-(coef[0][0]*best_gain[0]+coef[1][1])*gcode0) * inv_coef; *--------------------------------------------------------------------------*/ L_cfbg = L_mult(coef[0][0], best_gain[0]); /* L_cfbg:Q20 -> !!y */ L_acc = L_shr(L_coef[1][1], 15); /* L_acc:Q20 */ L_acc = L_add(L_cfbg, L_acc); acc_h = extract_h(L_acc); /* acc_h:Q4 */ L_preg = L_mult(acc_h, gcode0); /* L_preg:Q9 */ L_acc = L_shl(L_deposit_l(best_gain[1]), 7); /* L_acc:Q9 */ L_acc = L_sub(L_acc, L_preg); acc_h = extract_h(L_shl(L_acc, 2)); /* L_acc_h:Q[-5] */ L_tmp_x = L_mult(acc_h, G729EV_G729_INV_COEF); /* L_tmp_x:Q15 */ /*--------------------------------------------------------------------------* y = (coef[1][0]*(-coef[0][1]+best_gain[0]*coef[0][0])*gcode0 -coef[0][0]*best_gain[1]) * inv_coef; *--------------------------------------------------------------------------*/ L_acc = L_shr(L_coef[0][1], 10); /* L_acc:Q20 */ L_acc = L_sub(L_cfbg, L_acc); /* !!x -> L_cfbg:Q20 */ acc_h = extract_h(L_acc); /* acc_h:Q4 */ acc_h = mult(acc_h, gcode0); /* acc_h:Q[-7] */ L_tmp = L_mult(acc_h, coef[1][0]); /* L_tmp:Q10 */ L_preg = L_mult(coef[0][0], best_gain[1]); /* L_preg:Q13 */ L_acc = L_sub(L_tmp, L_shr(L_preg, 3)); /* L_acc:Q10 */ acc_h = extract_h(L_shl(L_acc, 2)); /* acc_h:Q[-4] */ L_tmp_y = L_mult(acc_h, G729EV_G729_INV_COEF); /* L_tmp_y:Q16 */#if (WMOPS) move16(); move16();#endif sft_y = (14 + 4 + 1) - 16; /* (Q[thr1]+Q[gcode0]+1)-Q[L_tmp_y] */ sft_x = (15 + 4 + 1) - 15; /* (Q[thr2]+Q[gcode0]+1)-Q[L_tmp_x] */ IF(gcode0 > 0) {#if (WMOPS) move16();#endif /*-- pre select codebook #1 --*/ *cand1 = 0; DO { L_temp = L_sub(L_tmp_y, L_shr(L_mult(thr1[*cand1], gcode0), sft_y)); IF(L_temp > 0L) { (*cand1) = add(*cand1, 1);#if (WMOPS) move16();#endif } ELSE BREAK; } WHILE(sub((*cand1), (G729EV_G729_NCODE1 - G729EV_G729_NCAN1)) < 0); /*-- pre select codebook #2 --*/#if (WMOPS) move16();#endif *cand2 = 0; DO { L_temp = L_sub(L_tmp_x, L_shr(L_mult(thr2[*cand2], gcode0), sft_x)); IF(L_temp > 0L) { (*cand2) = add(*cand2, 1);#if (WMOPS) move16();#endif } ELSE BREAK; } WHILE(sub((*cand2), (G729EV_G729_NCODE2 - G729EV_G729_NCAN2)) < 0); } ELSE { /*-- pre select codebook #1 --*/#if (WMOPS) move16();#endif *cand1 = 0; DO { L_temp = L_sub(L_tmp_y, L_shr(L_mult(thr1[*cand1], gcode0), sft_y)); IF(L_temp < 0L) { (*cand1) = add(*cand1, 1);#if (WMOPS) move16();#endif } ELSE BREAK; } WHILE(sub((*cand1), (G729EV_G729_NCODE1 - G729EV_G729_NCAN1)) != 0); /*-- pre select codebook #2 --*/#if (WMOPS) move16();#endif *cand2 = 0; DO { L_temp = L_sub(L_tmp_x, L_shr(L_mult(thr2[*cand2], gcode0), sft_x)); IF(L_temp < 0L) { (*cand2) = add(*cand2, 1);#if (WMOPS) move16();#endif } ELSE BREAK; } WHILE(sub((*cand2), (G729EV_G729_NCODE2 - G729EV_G729_NCAN2)) != 0); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -