X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Facelp_filters.h;h=8b6060fa1502974d57b14f8dfdfb5255a81e1edf;hb=fc4d335f6d5c4f211505b79371a8588a48376d21;hp=8c0689211564e67870993f140b1a234d9223af0b;hpb=40a655e306d253b393f465a437be566d28f4b25e;p=ffmpeg diff --git a/libavcodec/acelp_filters.h b/libavcodec/acelp_filters.h index 8c068921156..8b6060fa150 100644 --- a/libavcodec/acelp_filters.h +++ b/libavcodec/acelp_filters.h @@ -25,6 +25,83 @@ #include +/** + * 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 for an 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). @@ -48,9 +125,10 @@ void ff_acelp_convolve_circ( * \param filter_coeffs filter coefficients (-0x8000 <= (3.12) < 0x8000) * \param in input signal * \param buffer_length amount of data to process - * \param filter_length filter length (11 for 10th order LP filter) + * \param filter_length filter length (10 for 10th order LP filter) * \param stop_on_overflow 1 - return immediately if overflow occurs * 0 - ignore overflows + * \param rounder the amount to add for rounding (usually 0x800 or 0xfff) * * \return 1 if overflow occurred, 0 - otherwise * @@ -65,7 +143,8 @@ int ff_acelp_lp_synthesis_filter( const int16_t* in, int buffer_length, int filter_length, - int stop_on_overflow); + int stop_on_overflow, + int rounder); /** * \brief Calculates coefficients of weighted A(z/weight) filter. @@ -112,4 +191,4 @@ void ff_acelp_high_pass_filter( const int16_t* in, int length); -#endif // FFMPEG_ACELP_FILTERS_H +#endif /* FFMPEG_ACELP_FILTERS_H */