]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/lpc.h
ensure that no GPL code is linked to LGPL only libavcodec
[ffmpeg] / libavcodec / lpc.h
index 96f9f856f29f9e4e23c9c66c32c0e37f5542733c..05a1deea67656a61e84fa0aef91ec2fe234c28c0 100644 (file)
@@ -45,4 +45,58 @@ int ff_lpc_calc_coefs(DSPContext *s,
                       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 */