📄 qua_gain.c
字号:
exp_min[0] = add( exp_coeff[0], 13 ); exp_min[1] = add( exp_coeff[1], 14 ); exp_min[2] = add( exp_coeff[2], sub( shl( exp_gcode0, 1 ), 21 ) ); exp_min[3] = add( exp_coeff[3], sub( exp_gcode0, 3 ) ); exp_min[4] = add( exp_coeff[4], sub( exp_gcode0, 4 ) ); e_min = exp_min[0]; for(i=1; i<5; i++){ if( sub(exp_min[i], e_min) < 0 ){ e_min = exp_min[i]; } } /* align coeff[] and save in special 32 bit double precision */ 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 */ L_dist_min = MAX_32; /* initialization used only to suppress Microsoft Visual C++ warnings */ index1 = cand1; index2 = cand2;if(tameflag == 1){ for(i=0; i<NCAN1; i++){ for(j=0; j<NCAN2; j++){ g_pitch = add( gbk1[cand1+i][0], gbk2[cand2+j][0] ); /* Q14 */ if(g_pitch < GP0999) { 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 ){ L_dist_min = L_tmp; index1 = add(cand1,i); index2 = add(cand2,j); } } } }}else{ for(i=0; i<NCAN1; i++){ for(j=0; j<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 ){ 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]; * *-----------------------------------------------------------------*/ *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 */ /*----------------------------------------------* * update table of past quantized energies * *----------------------------------------------*/ Gain_update( past_qua_en, L_gbk12 ); return( add( map1[index1]*(Word16)NCODE2, map2[index2] ) );}/*---------------------------------------------------------------------------* * Function Gbk_presel * * ~~~~~~~~~~~~~~~~~~~ * * - presearch for gain codebook - * *---------------------------------------------------------------------------*/static void 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 */){ Word16 acc_h; Word16 sft_x,sft_y; Word32 L_acc,L_preg,L_cfbg,L_tmp,L_tmp_x,L_tmp_y; Word32 L_temp; /*--------------------------------------------------------------------------* 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, 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, INV_COEF ); /* L_tmp_y:Q16 */ 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){ /*-- 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); } else break ; } while(sub((*cand1),(NCODE1-NCAN1))<0) ; /*-- pre select codebook #2 --*/ *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); } else break ; } while(sub((*cand2),(NCODE2-NCAN2))<0) ; } else{ /*-- 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); } else break ; } while(sub((*cand1),(NCODE1-NCAN1))) ; /*-- pre select codebook #2 --*/ *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); } else break ; } while(sub( (*cand2),(NCODE2-NCAN2))) ; } return ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -