void Lsp_get_quant( Word16 lspcb1[][M], /* (i) Q13 : first stage LSP codebook */ Word16 lspcb2[][M], /* (i) Q13 : Second stage LSP codebook */ Word16 code0, /* (i) : selected code of first stage */ Word16 code1, /* (i) : selected code of second stage */ Word16 code2, /* (i) : selected code of second stage */ Word16 fg[][M], /* (i) Q15 : MA prediction coef. */ Word16 freq_prev[][M], /* (i) Q13 : previous LSP vector */ Word16 lspq[], /* (o) Q13 : quantized LSP parameters */ Word16 fg_sum[] /* (i) Q15 : present MA prediction coef. */ ) { Word16 j; Word16 buf[M]; /* Q13 */ for ( j = 0 ; j < NC ; j++ ) buf[j] = add( lspcb1[code0][j], lspcb2[code1][j] ); for ( j = NC ; j < M ; j++ ) buf[j] = add( lspcb1[code0][j], lspcb2[code2][j] ); Lsp_expand_1_2(buf, GAP1); Lsp_expand_1_2(buf, GAP2); Lsp_prev_compose(buf, lspq, fg, freq_prev, fg_sum); Lsp_prev_update(buf, freq_prev); Lsp_stability( lspq ); return; }
void Relspwede( 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 freq_cur[] /* (o) Q13 : current LSP MA vector */ ) { 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_quante(lspcb1, lspcb2, cand[mode_index], tindex1[mode_index], tindex2[mode_index], fg[mode_index], freq_prev, lspq, fg_sum[mode_index], freq_cur) ; return; }