diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-10-27 23:29:56 +0400 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-10-29 23:53:13 +0400 |
commit | 39ef66f5300c2a42acc29937f5417bc2efe09752 (patch) | |
tree | dd27803719b6476c59edca60a06eeefc3b19ea74 /libavcodec | |
parent | dc5793062e7a0f6d195fc403d7ce242729b4ea4a (diff) |
lpc: Add a function for calculating reflection coefficients from autocorrelation coefficients
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/lpc.h | 31 |
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. */ |