📄 sp_dec.c
字号:
/* (Q14 * Q11 -> Q26) + Q26 -> Q26 */ log_en_int += ( int_fac * st->old_log_en ) << 1; for ( i = 0; i < M; i++ ) { /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */ lsp_int[i] = lsp_int[i] + ( ( int_fac * st->lsp_old[i] ) >> 15 ); /* Q14 -> Q15 */ lsp_int[i] = lsp_int[i] << 1; } /* compute the amount of lsf variability */ /* -0.6 in Q12 */ lsf_variab_factor = st->log_pg_mean - 2457; /* *0.3 Q12*Q15 -> Q12 */ lsf_variab_factor = 4096 - ( ( lsf_variab_factor * 9830 ) >> 15 ); /* limit to values between 0..1 in Q12 */ if ( lsf_variab_factor >= 4096 ) { lsf_variab_factor = 32767; } else if ( lsf_variab_factor < 0 ) { lsf_variab_factor = 0; } else lsf_variab_factor = lsf_variab_factor << 3; /* -> Q15 */ /* get index of vector to do variability with */ lsf_variab_index = pseudonoise( &st->pn_seed_rx, 3 ); /* convert to lsf */ Lsp_lsf( lsp_int, lsf_int ); /* apply lsf variability */ memcpy( lsf_int_variab, lsf_int, M <<2 ); for ( i = 0; i < M; i++ ) { lsf_int_variab[i] = lsf_int_variab[i] + ( ( lsf_variab_factor * st-> lsf_hist_mean[i + lsf_variab_index * M] ) >> 15 ); } /* make sure that LSP's are ordered */ Reorder_lsf( lsf_int, LSF_GAP ); Reorder_lsf( lsf_int_variab, LSF_GAP ); /* copy lsf to speech decoders lsf state */ memcpy( lsfState->past_lsf_q, lsf_int, M <<2 ); /* convert to lsp */ Lsf_lsp( lsf_int, lsp_int ); Lsf_lsp( lsf_int_variab, lsp_int_variab ); /* Compute acoeffs Q12 acoeff is used for level * normalization and Post_Filter, acoeff_variab is * used for synthesis filter * by doing this we make sure that the level * in high frequenncies does not jump up and down */ Lsp_Az( lsp_int, acoeff ); Lsp_Az( lsp_int_variab, acoeff_variab ); /* For use in Post_Filter */ memcpy( &A_t[0], acoeff, MP1 <<2 ); memcpy( &A_t[MP1], acoeff, MP1 <<2 ); memcpy( &A_t[MP1 <<1], acoeff, MP1 <<2 ); memcpy( &A_t[MP1 + MP1 + MP1], acoeff, MP1 <<2 ); /* Compute reflection coefficients Q15 */ A_Refl( &acoeff[1], refl ); /* Compute prediction error in Q15 */ /* 0.99997 in Q15 */ pred_err = MAX_16; for ( i = 0; i < M; i++ ) { pred_err = ( pred_err * ( MAX_16 - ( ( refl[i] * refl[i] ) >> 15 ) ) ) >> 15; } /* compute logarithm of prediction gain */ Log2( pred_err, &log_pg_e, &log_pg_m ); /* convert exponent and mantissa to Word16 Q12 */ /* Q12 */ log_pg = ( log_pg_e - 15 ) << 12; /* saturate */ if (log_pg < -32768) { log_pg = -32768; } log_pg = ( -( log_pg + ( log_pg_m >> 3 ) ) ) >> 1; st->log_pg_mean = ( Word16 )( ( ( 29491*st->log_pg_mean ) >> 15 ) + ( ( 3277 * log_pg ) >> 15 ) ); /* Compute interpolated log energy */ /* Q26 -> Q16 */ log_en_int = log_en_int >> 10; /* Add 4 in Q16 */ log_en_int += 262144L; /* subtract prediction gain */ log_en_int = log_en_int - ( log_pg << 4 ); /* adjust level to speech coder mode */ log_en_int += st->log_en_adjust << 5; log_en_int_e = ( Word16 )( log_en_int >> 16 ); log_en_int_m = ( Word16 )( ( log_en_int - ( log_en_int_e << 16 ) ) >> 1 ); /* Q4 */ level = ( Word16 )( Pow2( log_en_int_e, log_en_int_m ) ); for ( i = 0; i < 4; i++ ) { /* Compute innovation vector */ Build_CN_code( &st->pn_seed_rx, ex ); for ( j = 0; j < L_SUBFR; j++ ) { ex[j] = ( level * ex[j] ) >> 15; } /* Synthesize */ Syn_filt( acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR, mem_syn, 1 ); } /* next i */ /* reset codebook averaging variables */ averState->hangVar = 20; averState->hangCount = 0; if ( new_state == DTX_MUTE ) { /* * mute comfort noise as it has been quite a long time since * last SID update was performed */ Word32 num, denom; tmp_int_length = st->since_last_sid; if ( tmp_int_length > 32 ) { tmp_int_length = 32; } if ( tmp_int_length == 1 ) { st->true_sid_period_inv = MAX_16; } else { num = 1024; denom = ( tmp_int_length << 10 ); st->true_sid_period_inv = 0; for ( i = 0; i < 15; i++ ) { st->true_sid_period_inv <<= 1; num <<= 1; if ( num >= denom ) { num = num - denom; st->true_sid_period_inv += 1; } } } st->since_last_sid = 0; memcpy( st->lsp_old, st->lsp, M << 2 ); st->old_log_en = st->log_en; /* subtract 1/8 in Q11 i.e -6/8 dB */ st->log_en = st->log_en - 256; if (st->log_en < -32768) st->log_en = -32768; } /* * reset interpolation length timer * if data has been updated. */ if ( ( st->sid_frame != 0 ) & ( ( st->valid_data != 0 ) || ( ( st->valid_data == 0 ) & ( st->dtxHangoverAdded != 0 ) ) ) ) { st->since_last_sid = 0; st->data_updated = 1; } return;}/* * lsp_avg * * * Parameters: * st->lsp_meanSave B: LSP averages * lsp I: LSPs * * Function: * Calculate the LSP averages * * Returns: * void */static void lsp_avg( lsp_avgState *st, Word32 *lsp ){ Word32 i, tmp; for ( i = 0; i < M; i++ ) { /* mean = 0.84*mean */ tmp = ( st->lsp_meanSave[i] << 16 ); tmp -= ( EXPCONST * st->lsp_meanSave[i] ) << 1; /* Add 0.16 of newest LSPs to mean */ tmp += ( EXPCONST * lsp[i] ) << 1; /* Save means */ tmp += 0x00008000L; st->lsp_meanSave[i] = tmp >> 16; } return;}/* * Int_lpc_1and3 * * * Parameters: * lsp_old I: LSP vector at the 4th subfr. of past frame [M] * lsp_mid I: LSP vector at the 2nd subframe of present frame [M] * lsp_new I: LSP vector at the 4th subframe of present frame [M] * Az O: interpolated LP parameters in subframes 1 and 3 * [AZ_SIZE] * * Function: * Interpolates the LSPs and converts to LPC parameters * to get a different LP filter in each subframe. * * The 20 ms speech frame is divided into 4 subframes. * The LSPs are quantized and transmitted at the 2nd and * 4th subframes (twice per frame) and interpolated at the * 1st and 3rd subframe. * * Returns: * void */static void Int_lpc_1and3( Word32 lsp_old[], Word32 lsp_mid[], Word32 lsp_new[], Word32 Az[] ){ Word32 lsp[M]; Word32 i; /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */ for ( i = 0; i < 10; i++ ) { lsp[i] = ( lsp_mid[i] >> 1 ) + ( lsp_old[i] >> 1 ); } /* Subframe 1 */ Lsp_Az( lsp, Az ); Az += MP1; /* Subframe 2 */ Lsp_Az( lsp_mid, Az ); Az += MP1; for ( i = 0; i < 10; i++ ) { lsp[i] = ( lsp_mid[i] >> 1 ) + ( lsp_new[i] >> 1 ); } /* Subframe 3 */ Lsp_Az( lsp, Az ); Az += MP1; /* Subframe 4 */ Lsp_Az( lsp_new, Az ); return;}/* * Int_lpc_1to3 * * * Parameters: * lsp_old I: LSP vector at the 4th subframe of past frame [M] * lsp_new I: LSP vector at the 4th subframe of present frame [M] * Az O: interpolated LP parameters in all subframes * [AZ_SIZE] * * Function: * Interpolates the LSPs and converts to LPC parameters to get a different * LP filter in each subframe. * * The 20 ms speech frame is divided into 4 subframes. * The LSPs are quantized and transmitted at the 4th * subframes (once per frame) and interpolated at the * 1st, 2nd and 3rd subframe. * * Returns: * void */static void Int_lpc_1to3( Word32 lsp_old[], Word32 lsp_new[], Word32 Az[] ){ Word32 lsp[M]; Word32 i; for ( i = 0; i < 10; i++ ) { lsp[i] = ( lsp_new[i] >> 2 ) + ( lsp_old[i] - ( lsp_old[i] >> 2 ) ); } /* Subframe 1 */ Lsp_Az( lsp, Az ); Az += MP1; for ( i = 0; i < 10; i++ ) { lsp[i] = ( lsp_old[i] >> 1 ) + ( lsp_new[i] >> 1 ); } /* Subframe 2 */ Lsp_Az( lsp, Az ); Az += MP1; for ( i = 0; i < 10; i++ ) { lsp[i] = ( lsp_old[i] >> 2 ) + ( lsp_new[i] - ( lsp_new[i] >> 2 ) ); } /* Subframe 3 */ Lsp_Az( lsp, Az ); Az += MP1; /* Subframe 4 */ Lsp_Az( lsp_new, Az ); return;}/* * D_plsf_5 * * * Parameters: * st->past_lsf_q I: Past dequantized LFSs * st->past_r_q B: past quantized residual * bfi B: bad frame indicator * indice I: quantization indices of 3 submatrices, Q0 * lsp1_q O: quantized 1st LSP vector * lsp2_q O: quantized 2nd LSP vector * * Function: * Decodes the 2 sets of LSP parameters in a frame * using the received quantization indices. * * Returns: * void */static void D_plsf_5( D_plsfState *st, Word16 bfi, Word16 *indice, Word32 *lsp1_q , Word32 *lsp2_q ){ Word32 lsf1_r[M], lsf2_r[M], lsf1_q[M], lsf2_q[M]; Word32 i, temp1, temp2, sign; const Word32 *p_dico; /* if bad frame */ if ( bfi != 0 ) { /* use the past LSFs slightly shifted towards their mean */ for ( i = 0; i < M; i += 2 ) { /* lsfi_q[i] = ALPHA*st->past_lsf_q[i] + ONE_ALPHA*meanLsf[i]; */ lsf1_q[i] = ( ( st->past_lsf_q[i] * ALPHA_122 ) >> 15 ) + ( ( mean_lsf_5[i] * ONE_ALPHA_122 ) >> 15 ); lsf1_q[i + 1] = ( ( st->past_lsf_q[i + 1] * ALPHA_122 ) >> 15 ) + ( ( mean_lsf_5[i + 1] * ONE_ALPHA_122 ) >> 15 ); } memcpy( lsf2_q, lsf1_q, M <<2 ); /* estimate past quantized residual to be used in next frame */ for ( i = 0; i < M; i += 2 ) { /* temp = meanLsf[i] + st->past_r_q[i] * LSPPpred_facMR122; */ temp1 = mean_lsf_5[i] + ( ( st->past_r_q[i] * LSP_PRED_FAC_MR122 ) >> 15 ); temp2 = mean_lsf_5[i + 1] +( ( st->past_r_q[i + 1] *LSP_PRED_FAC_MR122 ) >> 15 ); st->past_r_q[i] = lsf2_q[i] - temp1; st->past_r_q[i + 1] = lsf2_q[i + 1] -temp2; } } /* if good LSFs received */ else { /* decode prediction residuals from 5 received indices */ p_dico = &dico1_lsf_5[indice[0] << 2]; lsf1_r[0] = *p_dico++; lsf1_r[1] = *p_dico++; lsf2_r[0] = *p_dico++; lsf2_r[1] = *p_dico++; p_dico = &dico2_lsf_5[indice[1] << 2]; lsf1_r[2] = *p_dico++; lsf1_r[3] = *p_dico++; lsf2_r[2] = *p_dico++; lsf2_r[3] = *p_dico++; sign = ( Word16 )( indice[2] & 1 ); i = indice[2] >> 1; p_dico = &dico3_lsf_5[i << 2]; if ( sign == 0 ) { lsf1_r[4] = *p_dico++; lsf1_r[5] = *p_dico++; lsf2_r[4] = *p_dico++; lsf2_r[5] = *p_dico++; } else { lsf1_r[4] = ( Word16 )( -( *p_dico++ ) ); lsf1_r[5] = ( Word16 )( -( *p_dico++ ) ); lsf2_r[4] = ( Word16 )( -( *p_dico++ ) ); lsf2_r[5] = ( Word16 )( -( *p_dico++ ) ); } p_dico = &dico4_lsf_5[( indice[3]<<2 )]; lsf1_r[6] = *p_dico++; lsf1_r[7] = *p_dico++; lsf2_r[6] = *p_dico++; lsf2_r[7] = *p_dico++; p_dico = &dico5_lsf_5[( indice[4]<<2 )]; lsf1_r[8] = *p_dico++; lsf1_r[9] = *p_dico++; lsf2_r[8] = *p_dico++; lsf2_r[9] = *p_dico++; /* Compute quantized LSFs and update the past quantized residual */ for ( i = 0; i < M; i++ ) { temp1 = mean_lsf_5[i] + ( ( st->past_r_q[i] * LSP_PRED_FAC_MR122 ) >> 15 ); lsf1_q[i] = lsf1_r[i] + temp1; lsf2_q[i] = lsf2_r[i] + temp1; st->past_r_q[i] = lsf2_r[i]; } } /* verification that LSFs have minimum distance of LSF_GAP Hz */ Reorder_lsf( lsf1_q, LSF_GAP ); Reorder_lsf( lsf2_q, LSF_GAP ); memcpy( st->past_lsf_q, lsf2_q, M <<2 ); /* convert LSFs to the cosine domain */ Lsf_lsp( lsf1_q, lsp1_q ); Lsf_lsp( lsf2_q, lsp2_q ); return;}/* * Dec_lag3 * * * Parameters: * index I: received pitch index * t0_min I: minimum of search range * t0_max I: maximum of search range * i_subfr I: subframe flag * T0_prev I: integer pitch delay of last subframe used * in 2nd and 4th subframes * T0 O: integer part of pitch lag * T0_frac O : fractional part of pitch lag * flag4 I : flag for encoding with 4 bits * Function: * Decoding of fractional pitch lag with 1/3 resolution. * Extract the integer and fraction parts of the pitch lag from * the received adaptive codebook index. * * The fractional lag in 1st and 3rd subframes is encoded with 8 bits * while that in 2nd and 4th subframes is relatively encoded with 4, 5 * and 6 bits depending on the mode. * * Returns: * void */static void Dec_lag3( Word32 index, Word32 t0_min, Word32 t0_max, Word32 i_subfr , Word32 T0_prev, Word32 *T0, Word32 *T0_frac, Word32 flag4 ){ Word32 i, tmp_lag; /* if 1st or 3rd subframe */ if ( i_subfr == 0 ) { if ( index < 197 ) { *T0 = ( ( ( index + 2 ) * 10923 ) >> 15 ) + 19; i = *T0 + *T0 + *T0; *T0_frac = ( index - i ) + 58; } else { *T0 = index - 112; *T0_frac = 0; } } /* 2nd or 4th subframe */ else { if ( flag4 == 0 ) { /* 'normal' decoding: either with 5 or 6 bit resolution */ i = ( ( ( index + 2 ) * 10923 ) >> 15 ) - 1; *T0 = i + t0_min; i = i + i + i; *T0_frac = ( index - 2 ) - i; } else { /* decoding with 4 bit resolution */ tmp_lag = T0_prev; if ( ( tmp_lag - t0_min ) > 5 ) tmp_lag = t0_min + 5; if ( ( t0_max - tmp_lag ) > 4 ) tmp_lag = t0_max - 4; if ( index < 4 ) { i = ( tmp_lag - 5 ); *T0 = i + index; *T0_frac = 0; } else { if ( index < 12 ) { i = ( ( ( index - 5 ) * 10923 ) >> 15 ) - 1; *T0 = i + tmp_lag; i = i + i + i; *T0_frac = ( index - 9 ) - i; } else { i = ( index - 12 ) + tmp_lag; *T0 = i + 1; *T0_frac = 0; } } } /* end if (decoding with 4 bit resolution) */ } return;}/* * Pred_lt_3or6_40 * * * Parameters: * exc B: excitation buffer * T0 I: integer pitch lag * frac I: fraction of lag * flag3 I: if set, upsampling rate = 3 (6 otherwise) * * Function: * Compute the result of long term prediction with fractional * interpolation of resolution 1/3 or 1/6. (Interpolated past excitation). * * Once the fractional pitch lag is determined, * the adaptive codebook vector v(n) is computed by interpolating * the past excitation signal u(n) at the given integer delay k * and phase (fraction) : * * 9 9 * v(n) = SUM[ u(n-k-i) * b60(t+i*6) ] + SUM[ u(n-k+1+i) * b60(6-t+i*6) ], * i=0 i=0 * n = 0, ...,39, t = 0, ...,5. * * The interpolation filter b60 is based on a Hamming windowed sin(x)/x * function truncated at
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -