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 */
1.5.1