]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blobdiff - libavcodec/lpc.h
frsh: Export information about the last RTP contract and VRES
[frescor/ffmpeg.git] / libavcodec / lpc.h
index 6c7c2eba939df86c7d50868702c9e5b534d84adc..05a1deea67656a61e84fa0aef91ec2fe234c28c0 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * LPC utility code
- * Copyright (c) 2006  Justin Ruggles <jruggle@earthlink.net>
+ * Copyright (c) 2006  Justin Ruggles <justin.ruggles@gmail.com>
  *
  * This file is part of FFmpeg.
  *
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef FFMPEG_LPC_H
-#define FFMPEG_LPC_H
+#ifndef AVCODEC_LPC_H
+#define AVCODEC_LPC_H
 
-#include <inttypes.h>
+#include <stdint.h>
+#include "dsputil.h"
 
 #define ORDER_METHOD_EST     0
 #define ORDER_METHOD_2LEVEL  1
  * Calculate LPC coefficients for multiple orders
  */
 int ff_lpc_calc_coefs(DSPContext *s,
-                      const int32_t *samples, int blocksize, int min_order, int max_order,
-                      int precision, int32_t coefs[][MAX_LPC_ORDER],
-                      int *shift, int use_lpc, int omethod, int max_shift, int zero_shift);
+                      const int32_t *samples, int blocksize, int min_order,
+                      int max_order, int precision,
+                      int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc,
+                      int omethod, int max_shift, int zero_shift);
 
-#endif /* FFMPEG_LPC_H */
+#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 */