Browse code

Do not hardcode filter order in ff_acelp_lspd2lpc()

Originally committed as revision 20485 to svn://svn.ffmpeg.org/ffmpeg/trunk

Vitor Sessak authored on 2009/11/09 21:06:19
Showing 3 changed files
... ...
@@ -155,20 +155,19 @@ static void lsp2polyf(const double *lsp, double *f, int lp_half_order)
155 155
     }
156 156
 }
157 157
 
158
-void ff_acelp_lspd2lpc(const double *lsp, float *lpc)
158
+void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
159 159
 {
160
-    double pa[6], qa[6];
161
-    int   i;
160
+    double pa[lp_half_order+1], qa[lp_half_order+1];
161
+    float *lpc2 = lpc + (lp_half_order << 1) - 1;
162 162
 
163
-    lsp2polyf(lsp,     pa, 5);
164
-    lsp2polyf(lsp + 1, qa, 5);
163
+    lsp2polyf(lsp,     pa, lp_half_order);
164
+    lsp2polyf(lsp + 1, qa, lp_half_order);
165 165
 
166
-    for (i=4; i>=0; i--)
167
-    {
168
-        double paf = pa[i+1] + pa[i];
169
-        double qaf = qa[i+1] - qa[i];
166
+    while (lp_half_order--) {
167
+        double paf = pa[lp_half_order+1] + pa[lp_half_order];
168
+        double qaf = qa[lp_half_order+1] - qa[lp_half_order];
170 169
 
171
-        lpc[i  ] = 0.5*(paf+qaf);
172
-        lpc[9-i] = 0.5*(paf-qaf);
170
+        lpc [ lp_half_order] = 0.5*(paf+qaf);
171
+        lpc2[-lp_half_order] = 0.5*(paf-qaf);
173 172
     }
174 173
 }
... ...
@@ -86,8 +86,10 @@ void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd
86 86
  * @param lsp line spectral pairs in cosine domain
87 87
  * @param lpc linear predictive coding coefficients
88 88
  *
89
+ * @note buffers should have a minimux size of 2*lp_half_order elements.
90
+ *
89 91
  * TIA/EIA/IS-733 2.4.3.3.5
90 92
  */
91
-void ff_acelp_lspd2lpc(const double *lsp, float *lpc);
93
+void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order);
92 94
 
93 95
 #endif /* AVCODEC_LSP_H */
... ...
@@ -578,7 +578,7 @@ static void lspf2lpc(const float *lspf, float *lpc)
578 578
     for (i=0; i<10; i++)
579 579
         lsp[i] = cos(M_PI * lspf[i]);
580 580
 
581
-    ff_acelp_lspd2lpc(lsp, lpc);
581
+    ff_acelp_lspd2lpc(lsp, lpc, 5);
582 582
 
583 583
     for (i=0; i<10; i++)
584 584
     {