diff lpc.h @ 7788:ffd4b1364b62 libavcodec

Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
author vitor
date Thu, 04 Sep 2008 11:03:14 +0000
parents c4a4495715dd
children da7996a575f3
line wrap: on
line diff
--- a/lpc.h	Wed Sep 03 19:04:46 2008 +0000
+++ b/lpc.h	Thu Sep 04 11:03:14 2008 +0000
@@ -45,4 +45,58 @@
                       int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc,
                       int omethod, int max_shift, int zero_shift);
 
+#ifdef LPC_USE_DOUBLE
+#define LPC_type double
+#else
+#define LPC_type float
+#endif
+
+/**
+ * Levinson-Durbin recursion.
+ * Produces LPC coefficients from autocorrelation data.
+ */
+static inline int compute_lpc_coefs(const LPC_type *autoc, int max_order,
+                                    LPC_type *lpc, int lpc_stride, int fail,
+                                    int normalize)
+{
+    int i, j;
+    LPC_type err;
+    LPC_type *lpc_last = lpc;
+
+    if (normalize)
+        err = *autoc++;
+
+    if (fail && (autoc[max_order - 1] == 0 || err <= 0))
+        return -1;
+
+    for(i=0; i<max_order; i++) {
+        LPC_type r = -autoc[i];
+
+        if (normalize) {
+            for(j=0; j<i; j++)
+                r -= lpc_last[j] * autoc[i-j-1];
+
+            r /= err;
+            err *= 1.0 - (r * r);
+        }
+
+        lpc[i] = r;
+
+        for(j=0; j < (i+1)>>1; j++) {
+            LPC_type f = lpc_last[    j];
+            LPC_type b = lpc_last[i-1-j];
+            lpc[    j] = f + r * b;
+            lpc[i-1-j] = b + r * f;
+        }
+
+        if (fail && err < 0)
+            return -1;
+
+        lpc_last = lpc;
+        lpc += lpc_stride;
+    }
+
+    return 0;
+}
+
 #endif /* AVCODEC_LPC_H */