From bb937155ec5c035865256a86e3659f9aa83fc5ba Mon Sep 17 00:00:00 2001 From: Colin McQuillan Date: Sat, 15 Aug 2009 11:22:55 +0000 Subject: [PATCH] Add a function that can apply an order 2 rational transfer function in-place. This function will be used in the upcoming AMR-NB floating point decoder for high-pass filtering. Patch by Colin McQuillan ( m.niloc googlemail com ) Originally committed as revision 19649 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/acelp_filters.c | 17 +++++++++++++++++ libavcodec/acelp_filters.h | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/libavcodec/acelp_filters.c b/libavcodec/acelp_filters.c index b31f301..2db69d5 100644 --- a/libavcodec/acelp_filters.c +++ b/libavcodec/acelp_filters.c @@ -93,3 +93,20 @@ void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], hpf_f[0] = tmp; } } + +void ff_acelp_apply_order_2_transfer_function(float *buf, + const float zero_coeffs[2], + const float pole_coeffs[2], + float gain, float mem[2], int n) +{ + int i; + float tmp; + + for (i = 0; i < n; i++) { + tmp = gain * buf[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1]; + buf[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1]; + + mem[1] = mem[0]; + mem[0] = tmp; + } +} diff --git a/libavcodec/acelp_filters.h b/libavcodec/acelp_filters.h index b7f6a3a..2cbe9bb 100644 --- a/libavcodec/acelp_filters.h +++ b/libavcodec/acelp_filters.h @@ -81,4 +81,20 @@ void ff_acelp_interpolate(int16_t* out, const int16_t* in, void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], const int16_t* in, int length); +/** + * Apply an order 2 rational transfer function in-place. + * + * @param samples [in/out] + * @param zero_coeffs z^-1 and z^-2 coefficients of the numerator + * @param pole_coeffs z^-1 and z^-2 coefficients of the denominator + * @param gain scale factor for final output + * @param mem intermediate values used by filter (should be 0 initially) + * @param n number of samples + */ +void ff_acelp_apply_order_2_transfer_function(float *samples, + const float zero_coeffs[2], + const float pole_coeffs[2], + float gain, + float mem[2], int n); + #endif /* AVCODEC_ACELP_FILTERS_H */ -- 2.7.4