summaryrefslogtreecommitdiff
path: root/libavcodec/lpc.h
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-10-27 22:29:56 +0300
committerMartin Storsjö <martin@martin.st>2012-10-29 21:53:13 +0200
commit39ef66f5300c2a42acc29937f5417bc2efe09752 (patch)
treedd27803719b6476c59edca60a06eeefc3b19ea74 /libavcodec/lpc.h
parentdc5793062e7a0f6d195fc403d7ce242729b4ea4a (diff)
lpc: Add a function for calculating reflection coefficients from autocorrelation coefficients
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/lpc.h')
-rw-r--r--libavcodec/lpc.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/libavcodec/lpc.h b/libavcodec/lpc.h
index cbee46f5db..0e54f0dfab 100644
--- a/libavcodec/lpc.h
+++ b/libavcodec/lpc.h
@@ -111,6 +111,37 @@ void ff_lpc_end(LPCContext *s);
#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.
*/