📄 decld8cp.c
字号:
for(i=MP1; i<M_BWDP1; i++) prev_filter[i] = (F)0.;
}
/***************************/
/* Processing active frame */
/***************************/
else {
seed = INIT_SEED;
/* ---------------------------- */
/* LPC decoding in forward mode */
/* ---------------------------- */
if (lp_mode == 0) {
/* Decode the LSPs */
d_lspe(parm, lsp_new, bfi, freq_prev, prev_lsp, &prev_ma);
parm += 2;
if( prev_lp_mode == 0) { /* Interpolation of LPC for the 2 subframes */
int_qlpc(lsp_old, lsp_new, A_t_fwd);
}
else {
/* no interpolation */
lsp_az(lsp_new, A_t_fwd); /* Subframe 1*/
copy(A_t_fwd, &A_t_fwd[MP1], MP1); /* Subframe 2 */
}
/* update the LSFs for the next frame */
copy(lsp_new, lsp_old, M);
c_int = (F)1.1;
pA_t = A_t_fwd;
m_aq = M;
/* update the previous filter for the next frame */
copy(&A_t_fwd[MP1], prev_filter, MP1);
for(i=MP1; i<M_BWDP1; i++) prev_filter[i] = (F)0.;
}
else {
int_bwd(A_t_bwd, prev_filter, &c_int);
pA_t = A_t_bwd;
m_aq = M_BWD;
/* update the previous filter for the next frame */
copy(&A_t_bwd[M_BWDP1], prev_filter, M_BWDP1);
}
/*------------------------------------------------------------------------*
* Loop for every subframe in the analysis frame *
*------------------------------------------------------------------------*
* The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR *
* times *
* - decode the pitch delay *
* - decode algebraic code *
* - decode pitch and codebook gains *
* - find the excitation and compute synthesis speech *
*------------------------------------------------------------------------*/
for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) {
index = *parm++; /* pitch index */
if(i_subfr == 0) {
if (rate == G729D)
i = 0; /* no pitch parity at 6.4 kb/s */
else
i = *parm++; /* get parity check result */
bad_pitch = bfi + i;
if( bad_pitch == 0) {
dec_lag3cp(index, PIT_MIN, PIT_MAX, i_subfr, &t0, &t0_frac, rate);
prev_t0 = t0;
prev_t0_frac = t0_frac;
}
else { /* Bad frame, or parity error */
if (bfi == 0) printf(" ! Wrong Pitch 1st subfr. ! ");
t0 = prev_t0;
if (rate == G729E) {
t0_frac = prev_t0_frac;
}
else {
t0_frac = 0;
prev_t0++;
if(prev_t0 > PIT_MAX) {
prev_t0 = PIT_MAX;
}
}
}
*t0_first = t0; /* If first frame */
}
else { /* second subframe */
if( bfi == 0) {
dec_lag3cp(index, PIT_MIN, PIT_MAX, i_subfr, &t0, &t0_frac, rate);
prev_t0 = t0;
prev_t0_frac = t0_frac;
}
else {
t0 = prev_t0;
if (rate == G729E) {
t0_frac = prev_t0_frac;
}
else {
t0_frac = 0;
prev_t0++;
if(prev_t0 > PIT_MAX) prev_t0 = PIT_MAX;
}
}
}
/*-------------------------------------------------*
* - Find the adaptive codebook vector. *
*-------------------------------------------------*/
pred_lt_3(&exc[i_subfr], t0, t0_frac, L_SUBFR);
/* --------------------------------- */
/* pitch tracking for frame erasures */
/* --------------------------------- */
if( rate == G729E) {
track_pit(&prev_t0, &prev_t0_frac, &prev_pitch, &stat_pitch,
&pitch_sta, &frac_sta);
}
else {
i = prev_t0;
j = prev_t0_frac;
track_pit(&i, &j, &prev_pitch, &stat_pitch,
&pitch_sta, &frac_sta);
}
/*-------------------------------------------------------*
* - Decode innovative codebook. *
*-------------------------------------------------------*/
if(bfi != 0) { /* Bad frame */
parm[0] = (int)random_g729c(&seed_fer);
parm[1] = (int)random_g729c(&seed_fer);
if (rate == G729E) {
parm[2] = (int)random_g729c(&seed_fer);
parm[3] = (int)random_g729c(&seed_fer);
parm[4] = (int)random_g729c(&seed_fer);
}
}
stationnary = 0; /* to avoid visual warning */
if (rate == G729) {
/* case 8 kbps */
decod_ACELP(parm[1], parm[0], code);
parm += 2;
/* for gain decoding in case of frame erasure */
stat_bwd = 0;
stationnary = 0;
}
else if (rate == G729D) {
/* case 8 kbps */
decod_ACELP64(parm[1], parm[0], code);
parm += 2;
/* for gain decoding in case of frame erasure */
stat_bwd = 0;
stationnary = 0;
}
else if (rate == G729E) {
/* case 11.8 kbps */
if (lp_mode == 0) {
dec_ACELP_10i40_35bits(parm, code);
/* for gain decoding in case of frame erasure */
stat_bwd = 0;
stationnary = 0;
}
else {
dec_ACELP_12i40_44bits(parm, code);
/* for gain decoding in case of frame erasure */
stat_bwd++;
if (stat_bwd >= 30) {
stationnary = 1;
stat_bwd = 30;
}
else stationnary = 0;
}
parm += 5;
}
/*-------------------------------------------------------*
* - Add the fixed-gain pitch contribution to code[]. *
*-------------------------------------------------------*/
for (i = t0; i < L_SUBFR; i++) code[i] += sharp * code[i-t0];
/*-------------------------------------------------*
* - Decode pitch and codebook gains. *
*-------------------------------------------------*/
index = *parm++; /* index of energy VQ */
if (rate == G729D)
dec_gain_6k(index, code, L_SUBFR, bfi, &gain_pitch, &gain_code);
else
dec_gaine(index, code, L_SUBFR, bfi, &gain_pitch, &gain_code, rate,
gain_pit_mem, gain_cod_mem, &c_muting, count_bfi, stationnary);
/*-------------------------------------------------------------*
* - Update previous gains
*-------------------------------------------------------------*/
gain_pit_mem = gain_pitch;
gain_cod_mem = gain_code;
/*-------------------------------------------------------------*
* - Update pitch sharpening "sharp" with quantized gain_pitch *
*-------------------------------------------------------------*/
sharp = gain_pitch;
if (sharp > SHARPMAX) sharp = SHARPMAX;
if (sharp < SHARPMIN) sharp = SHARPMIN;
/*-------------------------------------------------------*
* - Find the total excitation. *
* - Find synthesis speech corresponding to exc[]. *
*-------------------------------------------------------*/
if(bfi != 0) { /* Bad frame */
count_bfi++;
if (voicing == 0 ) {
g_p = (F)0.;
g_c = gain_code;
}
else {
g_p = gain_pitch;
g_c = (F)0.;
}
}
else {
g_p = gain_pitch;
g_c = gain_code;
}
for (i = 0; i < L_SUBFR; i++) {
exc[i+i_subfr] = g_p * exc[i+i_subfr] + g_c * code[i];
}
if (rate == G729D) {
PhDisp(&exc[i_subfr], exc_phdisp, gain_code, gain_pitch, code);
syn_filte(m_aq, pA_t, exc_phdisp, &synth[i_subfr], L_SUBFR,
&mem_syn[M_BWD-m_aq], 0);
}
else {
syn_filte(m_aq, pA_t, &exc[i_subfr], &synth[i_subfr], L_SUBFR,
&mem_syn[M_BWD-m_aq], 0);
/* Updates state machine for phase dispersion in
6.4 kbps mode, if running at other rate */
Update_PhDisp(gain_pitch, gain_code);
}
copy(&synth[i_subfr+L_SUBFR-M_BWD], mem_syn, M_BWD);
pA_t += m_aq+1; /* interpolated LPC parameters for next subframe */
}
}
/*------------*
* For G729b
*-----------*/
if(bfi == 0) {
sid_sav = (FLOAT)0.0;
for(i=0; i<L_FRAME; i++) {
sid_sav += exc[i] * exc[i];
}
}
past_ftyp = ftyp;
/*------------*
* For G729E
*-----------*/
energy = ener_dB(synth, L_FRAME);
if (energy >= (F)40.) tst_bwd_dominant(bwd_dominant, lp_mode);
/*--------------------------------------------------*
* Update signal for next frame. *
* -> shift to the left by L_FRAME exc[] *
*--------------------------------------------------*/
copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
if( lp_mode == 0) {
copy(A_t_fwd, Az_dec, 2*MP1);
*m_pst = M;
}
else {
copy(A_t_bwd, Az_dec, 2*M_BWDP1);
*m_pst = M_BWD;
}
prev_bfi = bfi;
prev_lp_mode = lp_mode;
prev_voicing = voicing;
if (bfi != 0) c_fe = (F)1.;
else {
if (lp_mode == 0) c_fe = 0;
else {
if (*bwd_dominant == 1) c_fe -= (F)0.1;
else c_fe -= (F)0.5;
if (c_fe < 0) c_fe= 0;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -