📄 melp_chn.c
字号:
}
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[1][0]), 4, 1, 0);
if ((uv1 != 1) && (uv2 != 1) && (cuv == 1)){
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][0]),
8, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][1]),
6, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][2]),
6, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][3]),
6, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &dontcare, 3, 1, 0);
} else {
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][0]),
8, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][1]),
6, 1, 0);
}
}
/* ====== Unpacking gain information ====== */
unpack_code(&bit_ptr, &bit_cntr, &(qpar->gain_index[0]),
GAIN_VQ_BITS, 1, 0);
/* ====== Unpacking voicing information ====== */
for (i = 0; i < NF; i++){
if (!qpar->uv_flag[i])
unpack_code(&bit_ptr, &bit_cntr, &(qpar->bpvc_index[i]), 2, 1, 0);
}
if (cnt == 2)
unpack_code(&bit_ptr, &bit_cntr, &prot_bp1, 2, 1, 0);
else if (cnt == 1){
unpack_code(&bit_ptr, &bit_cntr, &prot_bp2, 2, 1, 0);
unpack_code(&bit_ptr, &bit_cntr, &prot_bp1, 2, 1, 0);
} else if (cnt == 0){ /* UUU */
for (i = 0; i < NF; i++)
unpack_code(&bit_ptr, &bit_cntr, &(qpar->bpvc_index[i]), 2, 1, 0);
}
/* ====== Unpacking Fourier magnitudes information ====== */
unpack_code(&bit_ptr, &bit_cntr, &(qpar->fs_index), FS_BITS, 1, 0);
/* ====== Unpacking jitter information ====== */
unpack_code(&bit_ptr, &bit_cntr, &(qpar->jit_index[0]), 1, 1, 0);
/* ====== FEC decoding ====== */
erase = low_rate_fec_decode(qpar, erase, lsp_check);
/* ====== Decode pitch information ====== */
if (flag_dec_pitch == 1){
if (cnt == 0){
for (i = 0; i < NF; i++)
par[i].pitch = LOG_UV_PITCH_Q12;
} else if (cnt == 1){
for (i = 0; i < NF; i++){
if (!par[i].uv_flag)
quant_u_dec(qpar->pitch_index, &par[i].pitch,
PIT_QLO_Q12, PIT_QUP_Q12, PIT_QLEV_M1_Q8, 7);
else
par[i].pitch = LOG_UV_PITCH_Q12;
par[i].pitch = pow10_fxp(par[i].pitch, 7);
}
} else if (cnt > 1){
index = qpar->pitch_index;
/* ----- set pointer -----*/
if( cnt == NF )
codebook = pitch_vq_cb_vvv;
else
codebook = pitch_vq_cb_uvv;
for (i = 0; i < NF; i++){
if (par[i].uv_flag == 1)
par[i].pitch = UV_PITCH_Q7;
else
par[i].pitch = pow10_fxp(codebook[index*NF + i], 7);
}
}
} else if (flag_dec_pitch == 2){
codebook = pitch_vq_cb_uvv; /* = pitch_vq_cb_uvu = pitch_vq_cb_vvu */
index = qpar->pitch_index;
for (i = 0; i < NF; i++)
par[i].pitch = pow10_fxp(codebook[index*NF + i], 7);
}
/* ====== Decode LSF information ====== */
if (flag_dec_lsp){
if ((uv1 == 1) && (uv2 == 1) && (cuv == 1)){
deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[0], LPC_ORD);
deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[1], LPC_ORD);
deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[2], LPC_ORD);
} else if ((uv1 == 1) && (uv2 == 1) && (cuv != 1)){
deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[0], LPC_ORD);
deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[1], LPC_ORD);
deqnt_msvq(&(par[2].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
qpar->lsf_index[2], LPC_ORD);
} else if ((uv1 == 1) && (uv2 != 1) && (cuv == 1)){
deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[0], LPC_ORD);
deqnt_msvq(&(par[1].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
qpar->lsf_index[1], LPC_ORD);
deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[2], LPC_ORD);
} else if ((uv1 != 1) && (uv2 == 1) && (cuv == 1)){
deqnt_msvq(&(par[0].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
qpar->lsf_index[0], LPC_ORD);
deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[1], LPC_ORD);
deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[2], LPC_ORD);
} else {
if ((uv1 != 1) && (uv2 != 1) && (cuv == 1))
/* ---- Interpolation [4 inp + (8+6+6+6) res + 9 uv] ---- */
deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
qpar->lsf_index[0], LPC_ORD);
else
deqnt_msvq(&(par[2].lsf[0]), lsp_v_256x64x32x32, 4,
melp_v_cb_size, qpar->lsf_index[0], LPC_ORD);
i = qpar->lsf_index[1][0];
for (j = 0; j < LPC_ORD; j++){
/* ilsp1[j] = inpCoef[i][j] * qplsp[j] +
(1.0 - inpCoef[i][j]) * par[2].lsf[j]; */
intfact = inpCoef[i][j]; /* Q14 */
L_acc = L_mult(intfact, qplsp[j]); /* Q14 */
intfact = sub(ONE_Q14, intfact);
L_acc = L_mac(L_acc, intfact, par[2].lsf[j]);
ilsp1[j] = extract_h(L_shl(L_acc, 1)); /* Q15 */
/* ilsp2[j] = inpCoef[i][j+10] * qplsp[j] +
(1.0 - inpCoef[i][j + LPC_ORD]) * par[2].lsf[j]; */
intfact = inpCoef[i][j + LPC_ORD]; /* Q14 */
L_acc = L_mult(intfact, qplsp[j]); /* Q14 */
intfact = sub(ONE_Q14, intfact);
L_acc = L_mac(L_acc, intfact, par[2].lsf[j]);
ilsp2[j] = extract_h(L_shl(L_acc, 1)); /* Q15 */
}
if ((uv1 != 1) && (uv2 != 1) && (cuv == 1))
deqnt_msvq(res, res256x64x64x64, 4, res_cb_size,
qpar->lsf_index[2], 20);
else
deqnt_msvq(res, res256x64x64x64, 2, res_cb_size,
qpar->lsf_index[2], 20);
/* ---- reconstruct lsp ---- */
for (i = 0; i < LPC_ORD; i++){
/* par[0].lsf[i] = (res[i] + ilsp1[i]); */
temp1 = shr(res[i], 2);
par[0].lsf[i] = add(temp1, ilsp1[i]); /* Q15 */
/* par[1].lsf[i] = (res[i + LPC_ORD] + ilsp2[i]); */
temp2 = shr(res[i + LPC_ORD], 2);
par[1].lsf[i] = add(temp2, ilsp2[i]); /* Q15 */
}
}
/* --- FEC LSP check --- */
if (uv1 == 1 && uv2 == 1 && cuv == 1){
if (lsp_check[0] == 1 && lsp_check[1] == 1 && lsp_check[2] == 1){
for (i = 0; i < LPC_ORD; i++){
par[0].lsf[i] = prev_par->lsf[i];
par[1].lsf[i] = prev_par->lsf[i];
par[2].lsf[i] = prev_par->lsf[i];
}
} else if (lsp_check[0] == 1 && lsp_check[1] == 1 &&
lsp_check[2] == 0){
for (i = 0; i < LPC_ORD; i++){
par[0].lsf[i] = add(mult(prev_par->lsf[i], X0667_Q15),
mult(par[2].lsf[i],X0333_Q15));
par[1].lsf[i] = add(mult(prev_par->lsf[i], X0333_Q15),
mult(par[2].lsf[i], X0667_Q15));
}
} else if (lsp_check[0] == 1 && lsp_check[1] == 0 &&
lsp_check[2] == 1){
for (i = 0; i < LPC_ORD; i++){
par[0].lsf[i] = add(shr(prev_par->lsf[i], 1),
shr(par[1].lsf[i], 1));
par[2].lsf[i] = par[1].lsf[i];
}
} else if (lsp_check[0] == 0 && lsp_check[1] == 1 &&
lsp_check[2] == 1){
for (i = 0; i < LPC_ORD; i++){
par[1].lsf[i] = par[0].lsf[i];
par[2].lsf[i] = par[0].lsf[i];
}
} else if (lsp_check[0] == 1 && lsp_check[1] == 0 &&
lsp_check[2] == 0){
for (i = 0; i < LPC_ORD; i++)
par[0].lsf[i] = add(shr(prev_par->lsf[i], 1),
shr(par[1].lsf[i], 1));
} else if (lsp_check[0] == 0 && lsp_check[1] == 1 &&
lsp_check[2] == 0){
for (i = 0; i < LPC_ORD; i++)
par[1].lsf[i] = add(shr(par[0].lsf[i], 1),
shr(par[2].lsf[i], 1));
} else if (lsp_check[0] == 0 && lsp_check[1] == 0 &&
lsp_check[2] == 1){
for (i = 0; i < LPC_ORD; i++){
par[2].lsf[i] = par[1].lsf[i];
}
}
}
/* ---- stable checking ---- */
if (!lspStable (par[0].lsf, LPC_ORD))
lspSort (par[0].lsf, LPC_ORD);
if (!lspStable(par[1].lsf, LPC_ORD))
lspSort (par[1].lsf, LPC_ORD);
if (!lspStable(par[2].lsf, LPC_ORD))
lspSort (par[2].lsf, LPC_ORD);
/* ---- Save for next frame ---- */
v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
} else {
for (i = 0; i < NF; i++)
v_equ(par[i].lsf, prev_par->lsf, LPC_ORD);
v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
}
/* ====== Decode gain information ====== */
index = qpar->gain_index[0];
for (i = 0; i < NF; i++){
for (j = 0; j < NUM_GAINFR; j++)
par[i].gain[j] = gain_vq_cb[index*NUM_GAINFR*NF + i*NUM_GAINFR + j];
}
/* ====== Decode voicing information ====== */
for (i = 0; i < NF; i++){
index = inv_bp_index_map[qpar->bpvc_index[i]];
q_bpvc_dec(&(par[i].bpvc[0]), index, qpar->uv_flag[i], NUM_BANDS);
}
/* ====== Decode Fourier magnitudes information ====== */
if (cnt != 0){
index = qpar->fs_index;
v_equ(par[last].fs_mag, &(fsvq_cb[NUM_HARM*index]), NUM_HARM);
v_equ(weighted_fsmag, par[last].fs_mag, NUM_HARM);
}
if (cnt > 1){
if (prev_uv){ /* U {UVV,VUV,VVU,VVV} */
for (i = 0; i < last; i++)
if (!par[i].uv_flag)
v_equ(par[i].fs_mag, par[last].fs_mag, NUM_HARM);
} else {
if (par[0].uv_flag) /* V UVV */
v_equ(par[1].fs_mag, par[last].fs_mag, NUM_HARM);
else if (par[1].uv_flag) /* V VUV */
v_equ(par[0].fs_mag, prev_fsmag, NUM_HARM);
else if (par[2].uv_flag){ /* V VVU */
for (i = 0; i < NUM_HARM; i++){
/* par[0].fs_mag[i] = 0.5*(weighted_fsmag[i] +
prev_fsmag[i]); */
temp1 = shr(weighted_fsmag[i], 1); /* Q13 */
temp2 = shr(prev_fsmag[i], 1); /* Q13 */
par[0].fs_mag[i] = add(temp1, temp2); /* Q13 */
}
} else { /* V VVV */
for (i = 0; i < NUM_HARM; i++){
p_value = prev_fsmag[i];
q_value = weighted_fsmag[i];
/* par[0].fs_mag[i] = (p + p + q)/3.0; */
temp1 = mult(p_value, X0667_Q15);
temp2 = mult(q_value, X0333_Q15);
par[0].fs_mag[i] = add(temp1, temp2); /* Q13 */
/* par[1].fs_mag[i] = (p + q + q)/3.0; */
temp1 = mult(p_value, X0333_Q15);
temp2 = mult(q_value, X0667_Q15);
par[1].fs_mag[i] = add(temp1, temp2); /* Q13 */
}
}
}
}
prev_uv = par[NF - 1].uv_flag;
if (par[NF - 1].uv_flag){
fill(prev_fsmag, ONE_Q13, NUM_HARM);
window_Q(prev_fsmag, w_fs, prev_fsmag, NUM_HARM, 14);
}else
v_equ(prev_fsmag, par[NF - 1].fs_mag, NUM_HARM);
/* ====== Decode jitter information ====== */
for (i = 0; i < NF; i++){
if (par[i].uv_flag == 1)
par[i].jitter = MAX_JITTER_Q15;
else
par[i].jitter = 0;
}
if (cnt != 0 || !(uv1 == 0 && uv2 == 1 && cuv == 0)){
if (qpar->jit_index[0] == 1){
if (uv1 && uv2 && cuv); /* UUU */
else if (uv1 && uv2 && !cuv) /* UUV */
par[2].jitter = MAX_JITTER_Q15;
else if (uv1 && !uv2 && cuv) /* UVU */
par[1].jitter = MAX_JITTER_Q15;
else if (!uv1 && uv2 && cuv) /* VUU */
par[0].jitter = MAX_JITTER_Q15;
else if (uv1 && !uv2 && !cuv) /* UVV */
par[1].jitter = MAX_JITTER_Q15;
else if (!uv1 && uv2 && !cuv); /* VUV */
else if (!uv1 && !uv2 && cuv) /* VVU */
par[1].jitter = MAX_JITTER_Q15;
else /* VVV */
par[0].jitter = par[1].jitter = par[2].jitter = MAX_JITTER_Q15;
}
}
if (flag_parity){
p_value = prev_par->pitch;
for (i = 0; i < NF; i++){
if (par[i].uv_flag)
par[i].pitch = UV_PITCH_Q7;
else
par[i].pitch = add(mult(SMOOTH, p_value),
mult(sub(32767, SMOOTH), par[i].pitch));
p_value = par[i].pitch;
}
p_value = prev_par->gain[1];
for (i = 0; i < NF; i++){
for (j = 0; j < NUM_GAINFR; j++){
par[i].gain[j] = add(mult(SMOOTH, p_value),
mult(sub(32767, SMOOTH), par[i].gain[j]));
p_value = par[i].gain[j];
}
}
for (j = 0; j < LPC_ORD; j++){
p_value = prev_par->lsf[j];
for (i = 0; i < NF; i++){
par[i].lsf[j] = add(mult(SMOOTH, p_value),
mult(sub(32767, SMOOTH), par[i].lsf[j]));
p_value = par[i].lsf[j];
}
}
} else {
/* gain check */
L_sum1 = 0;
for (i = 0; i < 2*NF*NUM_GAINFR; i++)
L_sum1 = L_add(L_sum1, L_deposit_l(prev_gain[i]));
L_sum1 = L_shr(L_sum1, 1);
L_sum2 = 0;
for (i = 0; i < NF; i++){
for (j = 0; j < NUM_GAINFR; j++)
L_sum2 = L_add(L_sum2, L_deposit_l(par[i].gain[j]));
}
if (L_sum2 > L_add(L_sum1, 92160L) || L_sum2 < L_sub(L_sum1, 92160L)){
L_sum1 = L_shr(L_sum1, 1);
L_sum1 = L_mpy_ls(L_sum1, 10923);
temp1 = extract_l(L_sum1);
for (i = 0; i < NF; i++){
for (j = 0; j < NUM_GAINFR; j++){
par[i].gain[j] = add(mult(SMOOTH, temp1),
mult(sub(32767, SMOOTH),
par[i].gain[j]));
temp1 = par[i].gain[j];
}
}
}
}
for (i = 0; i < NF*NUM_GAINFR; i++)
prev_gain[i] = prev_gain[i + NF*NUM_GAINFR];
for (i = 0; i < NF; i++){
for (j = 0; j < NUM_GAINFR; j++)
prev_gain[NF*NUM_GAINFR + i*NUM_GAINFR + j] = par[i].gain[j];
}
if (erase){
for (i = 0; i < NF; i++){
par[i].pitch = UV_PITCH_Q7;
v_equ(par[i].lsf, prev_par->lsf, LPC_ORD);
for (j = 0; j < NUM_GAINFR; j++)
par[i].gain[j] = prev_par->gain[1];
fill(&(par[i].bpvc[0]), 0, NUM_BANDS);
fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
par[i].jitter = MAX_JITTER_Q15;
}
v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
prev_uv = 1;
fill(prev_fsmag, ONE_Q13, NUM_HARM);
} else if (erase_uuu){
for (i = 0; i < NF; i++){
par[i].pitch = UV_PITCH_Q7;
fill(&(par[i].bpvc[0]), 0, NUM_BANDS);
fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
par[i].jitter = MAX_JITTER_Q15;
}
prev_uv = 1;
fill(prev_fsmag, ONE_Q13, NUM_HARM);
} else if (erase_vvv){
for (i = 0; i < NF; i++){
fill(&(par[i].bpvc[1]), 0, NUM_BANDS - 1);
fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
}
prev_uv = 0;
fill(prev_fsmag, ONE_Q13, NUM_HARM);
}
/* Return erase flag */
return(erase);
}
Shortword parity(Shortword x, Shortword leng)
{
register Shortword i;
Shortword p = 0x0;
for (i = 0; i < leng; i++){
p ^= x & 0x1;
x >>= 1;
}
return(p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -