/*---------------------------------------------------------------------------- * Lsp_iqua_cs - LSP main quantization routine *---------------------------------------------------------------------------- */ void Lsp_iqua_cs( Word16 prm[], /* (i) : indexes of the selected LSP */ Word16 lsp_q[], /* (o) Q13 : Quantized LSP parameters */ Word16 erase /* (i) : frame erase information */ ) { Word16 mode_index; Word16 code0; Word16 code1; Word16 code2; Word16 buf[M]; /* Q13 */ if( erase==0 ) { /* Not frame erasure */ mode_index = shr(prm[0] ,NC0_B) & (Word16)1; code0 = prm[0] & (Word16)(NC0 - 1); code1 = shr(prm[1] ,NC1_B) & (Word16)(NC1 - 1); code2 = prm[1] & (Word16)(NC1 - 1); /* compose quantized LSP (lsp_q) from indexes */ Lsp_get_quant(lspcb1, lspcb2, code0, code1, code2, fg[mode_index], freq_prev, lsp_q, fg_sum[mode_index]); /* save parameters to use in case of the frame erased situation */ Copy(lsp_q, prev_lsp, M); prev_ma = mode_index; } else { /* Frame erased */ /* use revious LSP */ Copy(prev_lsp, lsp_q, M); /* update freq_prev */ Lsp_prev_extract(prev_lsp, buf, fg[prev_ma], freq_prev, fg_sum_inv[prev_ma]); Lsp_prev_update(buf, freq_prev); } return; }
void Relspwed( Word16 lsp[], /* (i) Q13 : unquantized LSP parameters */ Word16 wegt[], /* (i) norm: weighting coefficients */ Word16 lspq[], /* (o) Q13 : quantized LSP parameters */ Word16 lspcb1[][M], /* (i) Q13 : first stage LSP codebook */ Word16 lspcb2[][M], /* (i) Q13 : Second stage LSP codebook */ Word16 fg[MODE][MA_NP][M], /* (i) Q15 : MA prediction coefficients */ Word16 freq_prev[MA_NP][M], /* (i) Q13 : previous LSP vector */ Word16 fg_sum[MODE][M], /* (i) Q15 : present MA prediction coef.*/ Word16 fg_sum_inv[MODE][M], /* (i) Q12 : inverse coef. */ Word16 code_ana[] /* (o) : codes of the selected LSP */ ) { Word16 mode, j; Word16 index, mode_index; Word16 cand[MODE], cand_cur; Word16 tindex1[MODE], tindex2[MODE]; Word32 L_tdist[MODE]; /* Q26 */ Word16 rbuf[M]; /* Q13 */ Word16 buf[M]; /* Q13 */ for(mode = 0; mode<MODE; mode++) { Lsp_prev_extract(lsp, rbuf, fg[mode], freq_prev, fg_sum_inv[mode]); Lsp_pre_select(rbuf, lspcb1, &cand_cur ); cand[mode] = cand_cur; Lsp_select_1(rbuf, lspcb1[cand_cur], wegt, lspcb2, &index); tindex1[mode] = index; for( j = 0 ; j < NC ; j++ ) buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] ); Lsp_expand_1(buf, GAP1); Lsp_select_2(rbuf, lspcb1[cand_cur], wegt, lspcb2, &index); tindex2[mode] = index; for( j = NC ; j < M ; j++ ) buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] ); Lsp_expand_2(buf, GAP1); Lsp_expand_1_2(buf, GAP2); Lsp_get_tdist(wegt, buf, &L_tdist[mode], rbuf, fg_sum[mode]); } Lsp_last_select(L_tdist, &mode_index); code_ana[0] = shl( mode_index,NC0_B ) | cand[mode_index]; code_ana[1] = shl( tindex1[mode_index],NC1_B ) | tindex2[mode_index]; Lsp_get_quant(lspcb1, lspcb2, cand[mode_index], tindex1[mode_index], tindex2[mode_index], fg[mode_index], freq_prev, lspq, fg_sum[mode_index]) ; return; }