📄 cod_ld8a.c
字号:
* * find the interpolated LSPs and convert to a[] for the 2 *
* subframes (both quantized and unquantized) *
*------------------------------------------------------------------------*/
{
/* Temporary vectors */
FLOAT r[MP1]; /* Autocorrelations */
FLOAT rc[M]; /* Reflexion coefficients */
FLOAT lsp_new[M]; /* lsp coefficients */
FLOAT lsp_new_q[M]; /* Quantized lsp coeff. */
/* LP analysis */
autocorr(p_window, M, r); /* Autocorrelations */
lag_window(M, r); /* Lag windowing */
levinson(r, Ap_t, rc); /* Levinson Durbin */
az_lsp(Ap_t, lsp_new, lsp_old); /* Convert A(z) to lsp */
/* LSP quantization */
qua_lsp(lsp_new, lsp_new_q, ana);
ana += 2; /* Advance analysis parameters pointer */
/*--------------------------------------------------------------------*
* Find interpolated LPC parameters in all subframes *
* The interpolated parameters are in array Aq_t[]. *
*--------------------------------------------------------------------*/
int_qlpc(lsp_old_q, lsp_new_q, Aq_t);
/* Compute A(z/gamma) */
weight_az(&Aq_t[0], GAMMA1, M, &Ap_t[0]);
weight_az(&Aq_t[MP1], GAMMA1, M, &Ap_t[MP1]);
/* 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 for the whole speech frame *
* - Set the range for searching closed-loop pitch in 1st subframe *
*----------------------------------------------------------------------*/
residu(&Aq_t[0], &speech[0], &exc[0], L_SUBFR);
residu(&Aq_t[MP1], &speech[L_SUBFR], &exc[L_SUBFR], L_SUBFR);
{
FLOAT Ap1[MP1];
Ap = Ap_t;
Ap1[0] = (F)1.0;
for(i=1; i<=M; i++)
Ap1[i] = Ap[i] - (F)0.7 * Ap[i-1];
syn_filt(Ap1, &exc[0], &wsp[0], L_SUBFR, mem_w, 1);
Ap += MP1;
for(i=1; i<=M; i++)
Ap1[i] = Ap[i] - (F)0.7 * Ap[i-1];
syn_filt(Ap1, &exc[L_SUBFR], &wsp[L_SUBFR], L_SUBFR, mem_w, 1);
}
/* Find open loop pitch lag for whole speech frame */
T_op = pitch_ol_fast(wsp, L_FRAME);
/* Range for closed loop pitch search in 1st subframe */
T0_min = T_op - 3;
if (T0_min < PIT_MIN) T0_min = PIT_MIN;
T0_max = T0_min + 6;
if (T0_max > PIT_MAX)
{
T0_max = PIT_MAX;
T0_min = 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 L_FRAME/L_SUBFR times. *
* - find the weighted LPC coefficients *
* - find the LPC residual signal *
* - 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] = (F)1.0;
set_zero(&h1[1], L_SUBFR-1);
syn_filt(Ap, h1, h1, L_SUBFR, &h1[1], 0);
/*-----------------------------------------------*
* Find the target vector for pitch search: *
*----------------------------------------------*/
syn_filt(Ap, &exc[i_subfr], xn, L_SUBFR, mem_w0, 0);
/*-----------------------------------------------------------------*
* 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 *
* - find LTP residual. *
*-----------------------------------------------------------------*/
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 (gain_pit > GPCLIP) {
gain_pit = GPCLIP;
}
}
for (i = 0; i < L_SUBFR; i++)
xn2[i] = xn[i] - y1[i]*gain_pit;
/*-----------------------------------------------------*
* - Innovative codebook search. *
*-----------------------------------------------------*/
index = ACELP_code_A(xn2, h1, T0, sharp, code, y2, &i);
*ana++ = index; /* Positions index */
*ana++ = i; /* Signs index */
/*------------------------------------------------------*
* - Compute the correlations <y2,y2>, <xn,y2>, <y1,y2>*
* - Vector quantize gains. *
*------------------------------------------------------*/
corr_xy2(xn, y1, y2, g_coeff);
*ana++ =qua_gain(code, g_coeff, L_SUBFR, &gain_pit, &gain_code,
taming);
/*------------------------------------------------------------*
* - Update pitch sharpening "sharp" with quantized gain_pit *
*------------------------------------------------------------*/
sharp = gain_pit;
if (sharp > SHARPMAX) sharp = SHARPMAX;
if (sharp < SHARPMIN) sharp = SHARPMIN;
/*------------------------------------------------------*
* - Find the total excitation *
* - update filters' memories for finding the target *
* vector in the next subframe (mem_w0[]) *
*------------------------------------------------------*/
for (i = 0; i < L_SUBFR; i++)
exc[i+i_subfr] = gain_pit*exc[i+i_subfr] + gain_code*code[i];
update_exc_err(gain_pit, T0);
for (i = L_SUBFR-M, j = 0; i < L_SUBFR; i++, j++)
mem_w0[j] = xn[i] - gain_pit*y1[i] - gain_code*y2[i];
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);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -