diff options
author | Vladimir Voroshilov <voroshil@gmail.com> | 2008-05-24 17:18:42 +0000 |
---|---|---|
committer | Vladimir Voroshilov <voroshil@gmail.com> | 2008-05-24 17:18:42 +0000 |
commit | d347a046e24aac9fae1228f773b4fa68012a910d (patch) | |
tree | 3cef525126924569b029048590a3edfbb9e1e85f /libavcodec/acelp_filters.h | |
parent | 13b6729361d45b9f308d731dd6b82dac01428dc3 (diff) | |
download | ffmpeg-d347a046e24aac9fae1228f773b4fa68012a910d.tar.gz |
Move pitch vector interpolation code to acelp_filters
and convert it to a generic interpolation routine.
Originally committed as revision 13284 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/acelp_filters.h')
-rw-r--r-- | libavcodec/acelp_filters.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/libavcodec/acelp_filters.h b/libavcodec/acelp_filters.h index 9e497caec6..167faf72c3 100644 --- a/libavcodec/acelp_filters.h +++ b/libavcodec/acelp_filters.h @@ -26,6 +26,83 @@ #include <stdint.h> /** + * low-pass FIR (Finite Impulse Response) filter coefficients + * + * A similar filter is named b30 in G.729. + * + * G.729 specification says: + * b30 is based on Hamming windowed sinc functions, truncated at +/-29 and + * padded with zeros at +/-30 b30[30]=0. + * The filter has a cut-off frequency (-3 dB) at 3600 Hz in the oversampled + * domain. + * + * After some analysis, I found this approximation: + * + * PI * x + * Hamm(x,N) = 0.53836-0.46164*cos(--------) + * N-1 + * --- + * 2 + * + * PI * x + * Hamm'(x,k) = Hamm(x - k, 2*k+1) = 0.53836 + 0.46164*cos(--------) + * k + * + * sin(PI * x) + * Sinc(x) = ----------- (normalized sinc function) + * PI * x + * + * h(t,B) = 2 * B * Sinc(2 * B * t) (impulse response of sinc low-pass filter) + * + * b(k,B, n) = Hamm'(n, k) * h(n, B) + * + * + * 3600 + * B = ---- + * 8000 + * + * 3600 - cut-off frequency + * 8000 - sampling rate + * k - filter order + * + * ff_acelp_interp_filter[6*i+j] = b(10, 3600/8000, i+j/6) + * + * The filter assumes the following order of fractions (X - integer delay): + * + * 1/3 precision: X 1/3 2/3 X 1/3 2/3 X + * 1/6 precision: X 1/6 2/6 3/6 4/6 5/6 X 1/6 2/6 3/6 4/6 5/6 X + * + * The filter can be used for 1/3 precision, too, by + * passing 2*pitch_delay_frac as third parameter to the interpolation routine. + * + */ +extern const int16_t ff_acelp_interp_filter[61]; + +/** + * \brief Generic interpolation routine + * \param out [out] buffer for interpolated data + * \param in input data + * \param filter_coeffs interpolation filter coefficients (0.15) + * \param precision filter is able to interpolate with 1/precision precision of pitch delay + * \param pitch_delay_frac pitch delay, fractional part [0..precision-1] + * \param filter_length filter length + * \param length length of speech data to process + * + * filter_coeffs contains coefficients of the positive half of the symmetric + * interpolation filter. filter_coeffs[0] should the central (unpaired) coefficient. + * See ff_acelp_interp_filter fot example. + * + */ +void ff_acelp_interpolate( + int16_t* out, + const int16_t* in, + const int16_t* filter_coeffs, + int precision, + int pitch_delay_frac, + int filter_length, + int length); + +/** * \brief Circularly convolve fixed vector with a phase dispersion impulse * response filter (D.6.2 of G.729 and 6.1.5 of AMR). * \param fc_out vector with filter applied |