📄 cod_ld8a.c
字号:
/* update the LSPs for the next frame */
Copy(lsp_new, lsp_old, M);
Copy(lsp_new_q, lsp_old_q, M);
}
/*----------------------------------------------------------------------*
* - Find the weighted input speech w_sp[] for the whole speech frame *
* - Find the open-loop pitch delay *
*----------------------------------------------------------------------*/
Residu(&Aq_t[0], &speech[0], &exc[0], L_SUBFR);
// for(j1=0;j1<L_SUBFR;j1++)
// {
// temp1[j1]=speech[j1];
// }
// for(j1=0;j1<L_SUBFR;j1++)
// {
// temp1[j1]=exc[j1];
// }
// for(t=0,j1=0;j1<L_SUBFR;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)exc[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);
Residu(&Aq_t[MP1], &speech[L_SUBFR], &exc[L_SUBFR], L_SUBFR);
// for(j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
// temp1[j1-L_SUBFR]=speech[j1];
// }
// for(j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
// temp2[j1-L_SUBFR]=exc[j1];
// }
// for(t=0,j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)exc[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);
{
Word16 Ap1[MP1];
Ap = Ap_t;
Ap1[0] = 4096;
for(i=1; i<=M; i++) /* Ap1[i] = Ap[i] - 0.7 * Ap[i-1]; */
Ap1[i] = sub(Ap[i], mult(Ap[i-1], 22938));
// for(j1=0;j1<=M;j1++)temp1[j1]=Ap[j1];
// for(t=0,j1=0;j1<M+1;j1++)
// {
// Sprintf(&st[t],"%04x\n",(unsigned short)Ap1[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream2);
Syn_filt(Ap1, &exc[0], &wsp[0], L_SUBFR, mem_w, 1);
// for(j1=0;j1<=L_SUBFR;j1++)tempx[j1]=exc[j1];
// for(j1=0;j1<=L_SUBFR;j1++)tempy[j1]=wsp[j1];
// for(t=0,j1=0;j1<L_SUBFR;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)wsp[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);
Ap += MP1;
for(i=1; i<=M; i++) /* Ap1[i] = Ap[i] - 0.7 * Ap[i-1]; */
Ap1[i] = sub(Ap[i], mult(Ap[i-1], 22938));
// for(j1=0;j1<=M;j1++)temp1[j1]=Ap[j1];
// for(t=0,j1=0;j1<M+1;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)Ap1[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream2);
Syn_filt(Ap1, &exc[L_SUBFR], &wsp[L_SUBFR], L_SUBFR, mem_w, 1);
// for(j1=L_SUBFR;j1<=L_SUBFR+L_SUBFR;j1++)tempx[j1-L_SUBFR]=exc[j1];
// for(j1=L_SUBFR;j1<=L_SUBFR+L_SUBFR;j1++)tempy[j1-L_SUBFR]=wsp[j1];
// for(t=0,j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)wsp[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);
}
// Find open loop pitch lag
T_op = Pitch_ol_fast(wsp, PIT_MAX, L_FRAME);
{
t=0;
sprintf(&st[t],"%04x\n",(unsigned short)T_op);
t=strlen(st);
fwrite(st,sizeof(char),strlen(st),out_stream3);
}
// Range for closed loop pitch search in 1st subframe
T0_min = sub(T_op, 3);
if (sub(T0_min,PIT_MIN)<0) {
T0_min = PIT_MIN;
}
T0_max = add(T0_min, 6);
if (sub(T0_max ,PIT_MAX)>0)
{
T0_max = PIT_MAX;
T0_min = sub(T0_max, 6);
}
// *------------------------------------------------------------------------*
// * Loop for every subframe in the analysis frame *
// *------------------------------------------------------------------------*
// * To find the pitch and innovation parameters. The subframe size is *
// * L_SUBFR and the loop is repeated 2 times. *
// * - find the weighted LPC coefficients *
// * - find the LPC residual signal res[] *
// * - compute the target signal for pitch search *
// * - compute impulse response of weighted synthesis filter (h1[]) *
// * - find the closed-loop pitch parameters *
// * - encode the pitch delay *
// * - find target vector for codebook search *
// * - codebook search *
// * - VQ of pitch and codebook gains *
// * - update states of weighting filter *
// *------------------------------------------------------------------------*
Aq = Aq_t; // pointer to interpolated quantized LPC parameters
Ap = Ap_t; // pointer to weighted LPC coefficients
for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
{
// *---------------------------------------------------------------*
// * Compute impulse response, h1[], of weighted synthesis filter *
// *---------------------------------------------------------------*
h1[0] = 4096;
Set_zero(&h1[1], L_SUBFR-1);
// for(t=0,j1=0;j1<L_SUBFR;j1++)temp1[j1]=h1[j1];
Syn_filt(Ap, h1, h1, L_SUBFR, &h1[1], 0);
for(t=0,j1=0;j1<L_SUBFR;j1++)tempy[j1]=h1[j1];
// *----------------------------------------------------------------------*
// * Find the target vector for pitch search: *
// *----------------------------------------------------------------------*
for(t=0,j1=0;j1<M+1;j1++)temp1[j1]=Ap[j1];
for(t=0,j1=0;j1<L_SUBFR;j1++)tempx[j1]=exc[j1+i_subfr];
Syn_filt(Ap, &exc[i_subfr], xn, L_SUBFR, mem_w0, 0);
for(t=0,j1=0;j1<L_SUBFR;j1++)tempy[j1]=xn[j1];
// *---------------------------------------------------------------------*
// * Closed-loop fractional pitch search *
// *---------------------------------------------------------------------*
T0 = Pitch_fr3_fast(&exc[i_subfr], xn, h1, L_SUBFR, T0_min, T0_max,
i_subfr, &T0_frac);
index = Enc_lag3(T0, T0_frac, &T0_min, &T0_max,PIT_MIN,PIT_MAX,i_subfr);
*ana++ = index;
if (i_subfr == 0) {
*ana++ = Parity_Pitch(index);
}
// *-----------------------------------------------------------------*
// * - find filtered pitch exc *
// * - compute pitch gain and limit between 0 and 1.2 *
// * - update target vector for codebook search *
// *-----------------------------------------------------------------*
Syn_filt(Ap, &exc[i_subfr], y1, L_SUBFR, mem_zero, 0);
gain_pit = G_pitch(xn, y1, g_coeff, L_SUBFR);
// clip pitch gain if taming is necessary
taming = test_err(T0, T0_frac);
if( taming == 1){
if (sub(gain_pit, GPCLIP) > 0) {
gain_pit = GPCLIP;
}
}
// xn2[i] = xn[i] - y1[i] * gain_pit
for (i = 0; i < L_SUBFR; i++)
{
L_temp = L_mult(y1[i], gain_pit);
L_temp = L_shl(L_temp, 1); // gain_pit in Q14
xn2[i] = sub(xn[i], extract_h(L_temp));
}
// *-----------------------------------------------------*
// * - Innovative codebook search. *
// *-----------------------------------------------------*
index = ACELP_Code_A(xn2, h1, T0, sharp, code, y2, &i);
*ana++ = index; // Positions index
*ana++ = i; // Signs index
// *-----------------------------------------------------*
// * - Quantization of gains. *
// *-----------------------------------------------------*
g_coeff_cs[0] = g_coeff[0]; // <y1,y1>
exp_g_coeff_cs[0] = negate(g_coeff[1]); // Q-Format:XXX -> JPN
g_coeff_cs[1] = negate(g_coeff[2]); // (xn,y1) -> -2<xn,y1>
exp_g_coeff_cs[1] = negate(add(g_coeff[3], 1)); // Q-Format:XXX -> JPN *
Corr_xy2( xn, y1, y2, g_coeff_cs, exp_g_coeff_cs ); // Q0 Q0 Q12 ^Qx ^Q0
// g_coeff_cs[3]:exp_g_coeff_cs[3] = <y2,y2>
// g_coeff_cs[4]:exp_g_coeff_cs[4] = -2<xn,y2>
// g_coeff_cs[5]:exp_g_coeff_cs[5] = 2<y1,y2>
*ana++ = Qua_gain(code, g_coeff_cs, exp_g_coeff_cs,
L_SUBFR, &gain_pit, &gain_code, taming);
// *------------------------------------------------------------*
// * - Update pitch sharpening "sharp" with quantized gain_pit *
// *------------------------------------------------------------*
sharp = gain_pit;
if (sub(sharp, SHARPMAX) > 0) { sharp = SHARPMAX; }
if (sub(sharp, SHARPMIN) < 0) { sharp = SHARPMIN; }
// *------------------------------------------------------*
// * - Find the total excitation *
// * - update filters memories for finding the target *
// * vector in the next subframe *
// *------------------------------------------------------*
for (i = 0; i < L_SUBFR; i++)
{
// exc[i] = gain_pit*exc[i] + gain_code*code[i];
// exc[i] in Q0 gain_pit in Q14
// code[i] in Q13 gain_cod in Q1
L_temp = L_mult(exc[i+i_subfr], gain_pit);
L_temp = L_mac(L_temp, code[i], gain_code);
L_temp = L_shl(L_temp, 1);
exc[i+i_subfr] = round(L_temp);
}
update_exc_err(gain_pit, T0);
for (i = L_SUBFR-M, j = 0; i < L_SUBFR; i++, j++)
{
temp = extract_h(L_shl( L_mult(y1[i], gain_pit), 1) );
k = extract_h(L_shl( L_mult(y2[i], gain_code), 2) );
mem_w0[j] = sub(xn[i], add(temp, k));
}
Aq += MP1; // interpolated LPC parameters for next subframe
Ap += MP1;
}
// *--------------------------------------------------*
// * Update signal for next frame. *
// * -> shift to the left by L_FRAME: *
// * speech[], wsp[] and exc[] *
// *--------------------------------------------------*
Copy(&old_speech[L_FRAME], &old_speech[0], L_TOTAL-L_FRAME);
Copy(&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);
Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
// for(t=0,j1=0;j1<L_FRAME;j1++)
// {
// sprintf(&st[t],"%04x\n",(unsigned short)xn[j1]);
// t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -