# HG changeset patch # User vitor # Date 1283892389 0 # Node ID 1921e24d58866f9c228165eaabf4f1e8d6bdd8fa # Parent 2dd67ed2f9473588547e6e6e50f726a8368183bc Move lsp2lpc_sipr() function to common code so it can be reused in a AMRWB decoder. Patch by Marcelo Galvo Pvoa. diff -r 2dd67ed2f947 -r 1921e24d5886 lsp.c --- a/lsp.c Tue Sep 07 20:44:41 2010 +0000 +++ b/lsp.c Tue Sep 07 20:46:29 2010 +0000 @@ -117,6 +117,32 @@ } } +void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order) +{ + int lp_half_order = lp_order >> 1; + double buf[lp_half_order + 1]; + double pa[lp_half_order + 1]; + double *qa = buf + 1; + int i,j; + + qa[-1] = 0.0; + + ff_lsp2polyf(lsp , pa, lp_half_order ); + ff_lsp2polyf(lsp + 1, qa, lp_half_order - 1); + + for (i = 1, j = lp_order - 1; i < lp_half_order; i++, j--) { + double paf = pa[i] * (1 + lsp[lp_order - 1]); + double qaf = (qa[i] - qa[i-2]) * (1 - lsp[lp_order - 1]); + lp[i-1] = (paf + qaf) * 0.5; + lp[j-1] = (paf - qaf) * 0.5; + } + + lp[lp_half_order - 1] = (1.0 + lsp[lp_order - 1]) * + pa[lp_half_order] * 0.5; + + lp[lp_order - 1] = lsp[lp_order - 1]; +} + void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd, const int16_t* lsp_prev, int lp_order) { int16_t lsp_1st[MAX_LP_ORDER]; // (0.15) diff -r 2dd67ed2f947 -r 1921e24d5886 lsp.h --- a/lsp.h Tue Sep 07 20:44:41 2010 +0000 +++ b/lsp.h Tue Sep 07 20:46:29 2010 +0000 @@ -76,6 +76,11 @@ void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order); /** + * LSP to LP conversion (5.2.4 of AMR-WB) + */ +void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order); + +/** * \brief Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729) * \param[out] lp_1st decoded LP coefficients for first subframe (-0x8000 <= (3.12) < 0x8000) * \param[out] lp_2nd decoded LP coefficients for second subframe (-0x8000 <= (3.12) < 0x8000) diff -r 2dd67ed2f947 -r 1921e24d5886 sipr.c --- a/sipr.c Tue Sep 07 20:44:41 2010 +0000 +++ b/sipr.c Tue Sep 07 20:46:29 2010 +0000 @@ -209,32 +209,6 @@ } } -static void lsp2lpc_sipr(const double *lsp, float *Az) -{ - int lp_half_order = LP_FILTER_ORDER >> 1; - double buf[(LP_FILTER_ORDER >> 1) + 1]; - double pa[(LP_FILTER_ORDER >> 1) + 1]; - double *qa = buf + 1; - int i,j; - - qa[-1] = 0.0; - - ff_lsp2polyf(lsp , pa, lp_half_order ); - ff_lsp2polyf(lsp + 1, qa, lp_half_order - 1); - - for (i = 1, j = LP_FILTER_ORDER - 1; i < lp_half_order; i++, j--) { - double paf = pa[i] * (1 + lsp[LP_FILTER_ORDER - 1]); - double qaf = (qa[i] - qa[i-2]) * (1 - lsp[LP_FILTER_ORDER - 1]); - Az[i-1] = (paf + qaf) * 0.5; - Az[j-1] = (paf - qaf) * 0.5; - } - - Az[lp_half_order - 1] = (1.0 + lsp[LP_FILTER_ORDER - 1]) * - pa[lp_half_order] * 0.5; - - Az[LP_FILTER_ORDER - 1] = lsp[LP_FILTER_ORDER - 1]; -} - static void sipr_decode_lp(float *lsfnew, const float *lsfold, float *Az, int num_subfr) { @@ -247,7 +221,7 @@ for (j = 0; j < LP_FILTER_ORDER; j++) lsfint[j] = lsfold[j] * (1 - t) + t * lsfnew[j]; - lsp2lpc_sipr(lsfint, Az); + ff_amrwb_lsp2lpc(lsfint, Az, LP_FILTER_ORDER); Az += LP_FILTER_ORDER; t += t0; }