acelp_filters.h

Go to the documentation of this file.
00001 /*
00002  * various filters for ACELP-based codecs
00003  *
00004  * Copyright (c) 2008 Vladimir Voroshilov
00005  *
00006  * This file is part of FFmpeg.
00007  *
00008  * FFmpeg is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * FFmpeg is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with FFmpeg; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  */
00022 
00023 #ifndef FFMPEG_ACELP_FILTERS_H
00024 #define FFMPEG_ACELP_FILTERS_H
00025 
00026 #include <stdint.h>
00027 
00028 /**
00029  * low-pass FIR (Finite Impulse Response) filter coefficients
00030  *
00031  *   A similar filter is named b30 in G.729.
00032  *
00033  *   G.729 specification says:
00034  *     b30 is based on Hamming windowed sinc functions, truncated at +/-29 and
00035  *     padded with zeros at +/-30 b30[30]=0.
00036  *     The filter has a cut-off frequency (-3 dB) at 3600 Hz in the oversampled
00037  *     domain.
00038  *
00039  *   After some analysis, I found this approximation:
00040  *
00041  *                                    PI * x
00042  *   Hamm(x,N) = 0.53836-0.46164*cos(--------)
00043  *                                      N-1
00044  *                                      ---
00045  *                                       2
00046  *
00047  *                                                             PI * x
00048  *   Hamm'(x,k) = Hamm(x - k, 2*k+1) =  0.53836 + 0.46164*cos(--------)
00049  *                                                                k
00050  *
00051  *             sin(PI * x)
00052  *   Sinc(x) = ----------- (normalized sinc function)
00053  *               PI * x
00054  *
00055  *   h(t,B) = 2 * B * Sinc(2 * B * t) (impulse response of sinc low-pass filter)
00056  *
00057  *   b(k,B, n) = Hamm'(n, k) * h(n, B)
00058  *
00059  *
00060  *       3600
00061  *   B = ----
00062  *       8000
00063  *
00064  *   3600 - cut-off frequency
00065  *   8000 - sampling rate
00066  *   k    - filter order
00067  *
00068  *   ff_acelp_interp_filter[6*i+j] = b(10, 3600/8000, i+j/6)
00069  *
00070  * The filter assumes the following order of fractions (X - integer delay):
00071  *
00072  * 1/3 precision: X     1/3      2/3      X     1/3      2/3      X
00073  * 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
00074  *
00075  * The filter can be used for 1/3 precision, too, by
00076  * passing 2*pitch_delay_frac as third parameter to the interpolation routine.
00077  *
00078  */
00079 extern const int16_t ff_acelp_interp_filter[61];
00080 
00081 /**
00082  * \brief Generic interpolation routine
00083  * \param out [out] buffer for interpolated data
00084  * \param in input data
00085  * \param filter_coeffs interpolation filter coefficients (0.15)
00086  * \param precision filter is able to interpolate with 1/precision precision of pitch delay
00087  * \param pitch_delay_frac pitch delay, fractional part [0..precision-1]
00088  * \param filter_length filter length
00089  * \param length length of speech data to process
00090  *
00091  * filter_coeffs contains coefficients of the positive half of the symmetric
00092  * interpolation filter. filter_coeffs[0] should the central (unpaired) coefficient.
00093  * See ff_acelp_interp_filter for an example.
00094  *
00095  */
00096 void ff_acelp_interpolate(
00097         int16_t* out,
00098         const int16_t* in,
00099         const int16_t* filter_coeffs,
00100         int precision,
00101         int pitch_delay_frac,
00102         int filter_length,
00103         int length);
00104 
00105 /**
00106  * \brief Circularly convolve fixed vector with a phase dispersion impulse
00107  *        response filter (D.6.2 of G.729 and 6.1.5 of AMR).
00108  * \param fc_out vector with filter applied
00109  * \param fc_in source vector
00110  * \param filter phase filter coefficients
00111  *
00112  *  fc_out[n] = sum(i,0,len-1){ fc_in[i] * filter[(len + n - i)%len] }
00113  *
00114  * \note fc_in and fc_out should not overlap!
00115  */
00116 void ff_acelp_convolve_circ(
00117         int16_t* fc_out,
00118         const int16_t* fc_in,
00119         const int16_t* filter,
00120         int subframe_size);
00121 
00122 /**
00123  * \brief LP synthesis filter
00124  * \param out [out] pointer to output buffer
00125  * \param filter_coeffs filter coefficients (-0x8000 <= (3.12) < 0x8000)
00126  * \param in input signal
00127  * \param buffer_length amount of data to process
00128  * \param filter_length filter length (10 for 10th order LP filter)
00129  * \param stop_on_overflow   1 - return immediately if overflow occurs
00130  *                           0 - ignore overflows
00131  * \param rounder the amount to add for rounding (usually 0x800 or 0xfff)
00132  *
00133  * \return 1 if overflow occurred, 0 - otherwise
00134  *
00135  * \note Output buffer must contain 10 samples of past
00136  *       speech data before pointer.
00137  *
00138  * Routine applies 1/A(z) filter to given speech data.
00139  */
00140 int ff_acelp_lp_synthesis_filter(
00141         int16_t *out,
00142         const int16_t* filter_coeffs,
00143         const int16_t* in,
00144         int buffer_length,
00145         int filter_length,
00146         int stop_on_overflow,
00147         int rounder);
00148 
00149 /**
00150  * \brief Calculates coefficients of weighted A(z/weight) filter.
00151  * \param out [out] weighted A(z/weight) result
00152  *                  filter (-0x8000 <= (3.12) < 0x8000)
00153  * \param in source filter (-0x8000 <= (3.12) < 0x8000)
00154  * \param weight_pow array containing weight^i (-0x8000 <= (0.15) < 0x8000)
00155  * \param filter_length filter length (11 for 10th order LP filter)
00156  *
00157  * out[i]=weight_pow[i]*in[i] , i=0..9
00158  */
00159 void ff_acelp_weighted_filter(
00160         int16_t *out,
00161         const int16_t* in,
00162         const int16_t *weight_pow,
00163         int filter_length);
00164 
00165 /**
00166  * \brief high-pass filtering and upscaling (4.2.5 of G.729)
00167  * \param out [out] output buffer for filtered speech data
00168  * \param hpf_f [in/out] past filtered data from previous (2 items long)
00169  *                       frames (-0x20000000 <= (14.13) < 0x20000000)
00170  * \param in speech data to process
00171  * \param length input data size
00172  *
00173  * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] +
00174  *          1.9330735 * out[i-1] - 0.93589199 * out[i-2]
00175  *
00176  * The filter has a cut-off frequency of 100Hz
00177  *
00178  * \note Two items before the top of the out buffer must contain two items from the
00179  *       tail of the previous subframe.
00180  *
00181  * \remark It is safe to pass the same array in in and out parameters.
00182  *
00183  * \remark AMR uses mostly the same filter (cut-off frequency 60Hz, same formula,
00184  *         but constants differs in 5th sign after comma). Fortunately in
00185  *         fixed-point all coefficients are the same as in G.729. Thus this
00186  *         routine can be used for the fixed-point AMR decoder, too.
00187  */
00188 void ff_acelp_high_pass_filter(
00189         int16_t* out,
00190         int hpf_f[2],
00191         const int16_t* in,
00192         int length);
00193 
00194 #endif /* FFMPEG_ACELP_FILTERS_H */

Generated on Thu Aug 28 16:44:14 2008 for libextractor by  doxygen 1.5.1