summaryrefslogtreecommitdiff
path: root/libavcodec/lsp.c
diff options
context:
space:
mode:
authorMarcelo Galvăo Póvoa <marspeoplester@gmail.com>2010-09-07 20:46:29 +0000
committerVitor Sessak <vitor1001@gmail.com>2010-09-07 20:46:29 +0000
commit48ac225db2563fe534b1d9e999bf8e70d5a577f8 (patch)
treeaed733027f03e4d14b906a7c70b450a7eb681340 /libavcodec/lsp.c
parent1d96cc08652072730e64ecb45df81b608a015a38 (diff)
Move lsp2lpc_sipr() function to common code so it can be reused in a
AMRWB decoder. Patch by Marcelo Galvăo Póvoa. Originally committed as revision 25062 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/lsp.c')
-rw-r--r--libavcodec/lsp.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libavcodec/lsp.c b/libavcodec/lsp.c
index fa7152737a..98ca490a76 100644
--- a/libavcodec/lsp.c
+++ b/libavcodec/lsp.c
@@ -117,6 +117,32 @@ void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order)
}
}
+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)