lpc: Add a function for calculating reflection coefficients from autocorrelation...
authorJustin Ruggles <justin.ruggles@gmail.com>
Sat, 27 Oct 2012 19:29:56 +0000 (22:29 +0300)
committerMartin Storsjö <martin@martin.st>
Mon, 29 Oct 2012 19:53:13 +0000 (21:53 +0200)
Signed-off-by: Martin Storsjö <martin@martin.st>
libavcodec/lpc.h

index cbee46f..0e54f0d 100644 (file)
@@ -110,6 +110,37 @@ void ff_lpc_end(LPCContext *s);
 #define LPC_TYPE float
 #endif
 
+/**
+ * Schur recursion.
+ * Produces reflection coefficients from autocorrelation data.
+ */
+static inline void compute_ref_coefs(const LPC_TYPE *autoc, int max_order,
+                                     LPC_TYPE *ref, LPC_TYPE *error)
+{
+    int i, j;
+    LPC_TYPE err;
+    LPC_TYPE gen0[MAX_LPC_ORDER], gen1[MAX_LPC_ORDER];
+
+    for (i = 0; i < max_order; i++)
+        gen0[i] = gen1[i] = autoc[i + 1];
+
+    err    = autoc[0];
+    ref[0] = -gen1[0] / err;
+    err   +=  gen1[0] * ref[0];
+    if (error)
+        error[0] = err;
+    for (i = 1; i < max_order; i++) {
+        for (j = 0; j < max_order - i; j++) {
+            gen1[j] = gen1[j + 1] + ref[i - 1] * gen0[j];
+            gen0[j] = gen1[j + 1] * ref[i - 1] + gen0[j];
+        }
+        ref[i] = -gen1[0] / err;
+        err   +=  gen1[0] * ref[i];
+        if (error)
+            error[i] = err;
+    }
+}
+
 /**
  * Levinson-Durbin recursion.
  * Produce LPC coefficients from autocorrelation data.