X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Facelp_filters.h;h=c5be5a6cb1a5869ba75e08f9549927a1e9684ffb;hb=86decad65240ea9e1bea177f1091f80d08b62402;hp=324be3b63d8b75dfd09a23d455e0f1d0c35617b3;hpb=5038ecb1f17099ad9dc1d1e79516d9f6550e1ebd;p=ffmpeg diff --git a/libavcodec/acelp_filters.h b/libavcodec/acelp_filters.h index 324be3b63d8..c5be5a6cb1a 100644 --- a/libavcodec/acelp_filters.h +++ b/libavcodec/acelp_filters.h @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef FFMPEG_ACELP_FILTERS_H -#define FFMPEG_ACELP_FILTERS_H +#ifndef AVCODEC_ACELP_FILTERS_H +#define AVCODEC_ACELP_FILTERS_H #include @@ -51,74 +51,17 @@ extern const int16_t ff_acelp_interp_filter[61]; * 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 frac_pos, - int filter_length, - int length); +void ff_acelp_interpolate(int16_t* out, const int16_t* in, + const int16_t* filter_coeffs, int precision, + int frac_pos, int filter_length, int length); /** - * 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 - * @param fc_in source vector - * @param filter phase filter coefficients - * - * fc_out[n] = sum(i,0,len-1){ fc_in[i] * filter[(len + n - i)%len] } - * - * \note fc_in and fc_out should not overlap! + * Floating point version of ff_acelp_interpolate() */ -void ff_acelp_convolve_circ( - int16_t* fc_out, - const int16_t* fc_in, - const int16_t* filter, - int len); +void ff_acelp_interpolatef(float *out, const float *in, + const float *filter_coeffs, int precision, + int frac_pos, int filter_length, int length); -/** - * LP synthesis filter. - * @param out [out] pointer to output buffer - * @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 (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 - * - * @note Output buffer must contain 10 samples of past - * speech data before pointer. - * - * Routine applies 1/A(z) filter to given speech data. - */ -int ff_acelp_lp_synthesis_filter( - int16_t *out, - const int16_t* filter_coeffs, - const int16_t* in, - int buffer_length, - int filter_length, - int stop_on_overflow, - int rounder); - -/** - * Calculates coefficients of weighted A(z/weight) filter. - * @param out [out] weighted A(z/weight) result - * filter (-0x8000 <= (3.12) < 0x8000) - * @param in source filter (-0x8000 <= (3.12) < 0x8000) - * @param weight_pow array containing weight^i (-0x8000 <= (0.15) < 0x8000) - * @param filter_length filter length (11 for 10th order LP filter) - * - * out[i]=weight_pow[i]*in[i] , i=0..9 - */ -void ff_acelp_weighted_filter( - int16_t *out, - const int16_t* in, - const int16_t *weight_pow, - int filter_length); /** * high-pass filtering and upscaling (4.2.5 of G.729). @@ -131,7 +74,7 @@ void ff_acelp_weighted_filter( * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] + * 1.9330735 * out[i-1] - 0.93589199 * out[i-2] * - * The filter has a cut-off frequency of 100Hz + * The filter has a cut-off frequency of 1/80 of the sampling freq * * @note Two items before the top of the out buffer must contain two items from the * tail of the previous subframe. @@ -143,10 +86,34 @@ void ff_acelp_weighted_filter( * fixed-point all coefficients are the same as in G.729. Thus this * routine can be used for the fixed-point AMR decoder, too. */ -void ff_acelp_high_pass_filter( - int16_t* out, - int hpf_f[2], - const int16_t* in, - int length); +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); + +/** + * Apply tilt compensation filter, 1 - tilt * z-1. + * + * @param mem pointer to the filter's state (one single float) + * @param tilt tilt factor + * @param samples array where the filter is applied + * @param size the size of the samples array + */ +void ff_tilt_compensation(float *mem, float tilt, float *samples, int size); + -#endif /* FFMPEG_ACELP_FILTERS_H */ +#endif /* AVCODEC_ACELP_FILTERS_H */