Mercurial > libavcodec.hg
annotate acelp_filters.h @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 0885e7a93ed4 |
children |
rev | line source |
---|---|
6772 | 1 /* |
2 * various filters for ACELP-based codecs | |
3 * | |
4 * Copyright (c) 2008 Vladimir Voroshilov | |
5 * | |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
7760 | 23 #ifndef AVCODEC_ACELP_FILTERS_H |
24 #define AVCODEC_ACELP_FILTERS_H | |
6772 | 25 |
6796 | 26 #include <stdint.h> |
27 | |
6772 | 28 /** |
7643 | 29 * low-pass Finite Impulse Response filter coefficients. |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
30 * |
7644
3d5972069016
Mention the fixed-point scale of the FIR filter coefficients.
michael
parents:
7643
diff
changeset
|
31 * Hamming windowed sinc filter with cutoff freq 3/40 of the sampling freq, |
3d5972069016
Mention the fixed-point scale of the FIR filter coefficients.
michael
parents:
7643
diff
changeset
|
32 * the coefficients are scaled by 2^15. |
7643 | 33 * This array only contains the right half of the filter. |
34 * This filter is likely identical to the one used in G.729, though this | |
35 * could not be determined from the original comments with certainity. | |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
36 */ |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
37 extern const int16_t ff_acelp_interp_filter[61]; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
38 |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
39 /** |
7647 | 40 * Generic FIR interpolation routine. |
12181 | 41 * @param[out] out buffer for interpolated data |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
42 * @param in input data |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
43 * @param filter_coeffs interpolation filter coefficients (0.15) |
7648
4df1c17c034c
Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents:
7647
diff
changeset
|
44 * @param precision sub sample factor, that is the precision of the position |
4df1c17c034c
Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents:
7647
diff
changeset
|
45 * @param frac_pos fractional part of position [0..precision-1] |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
46 * @param filter_length filter length |
7646
9b769aa9c665
Correct incorrect length parameter doxy for ff_acelp_interpolate().
michael
parents:
7645
diff
changeset
|
47 * @param length length of output |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
48 * |
7645
dcfbc11cfd7d
Right half is clearer than positive half for specifying which part of
michael
parents:
7644
diff
changeset
|
49 * filter_coeffs contains coefficients of the right half of the symmetric |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
50 * interpolation filter. filter_coeffs[0] should the central (unpaired) coefficient. |
7249 | 51 * See ff_acelp_interp_filter for an example. |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
52 * |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
53 */ |
9792 | 54 void ff_acelp_interpolate(int16_t* out, const int16_t* in, |
55 const int16_t* filter_coeffs, int precision, | |
56 int frac_pos, int filter_length, int length); | |
6772 | 57 |
58 /** | |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
59 * Floating point version of ff_acelp_interpolate() |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
60 */ |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
61 void ff_acelp_interpolatef(float *out, const float *in, |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
62 const float *filter_coeffs, int precision, |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
63 int frac_pos, int filter_length, int length); |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
64 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
65 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
66 /** |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
67 * high-pass filtering and upscaling (4.2.5 of G.729). |
12181 | 68 * @param[out] out output buffer for filtered speech data |
69 * @param[in,out] hpf_f past filtered data from previous (2 items long) | |
6772 | 70 * frames (-0x20000000 <= (14.13) < 0x20000000) |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
71 * @param in speech data to process |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
72 * @param length input data size |
6772 | 73 * |
74 * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] + | |
75 * 1.9330735 * out[i-1] - 0.93589199 * out[i-2] | |
76 * | |
7654
999b818c33cc
Mention cut-off freq of ff_acelp_high_pass_filter() instead of some
michael
parents:
7651
diff
changeset
|
77 * The filter has a cut-off frequency of 1/80 of the sampling freq |
6772 | 78 * |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
79 * @note Two items before the top of the out buffer must contain two items from the |
6772 | 80 * tail of the previous subframe. |
81 * | |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
82 * @remark It is safe to pass the same array in in and out parameters. |
6772 | 83 * |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
84 * @remark AMR uses mostly the same filter (cut-off frequency 60Hz, same formula, |
6772 | 85 * but constants differs in 5th sign after comma). Fortunately in |
86 * fixed-point all coefficients are the same as in G.729. Thus this | |
87 * routine can be used for the fixed-point AMR decoder, too. | |
88 */ | |
9792 | 89 void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], |
90 const int16_t* in, int length); | |
6772 | 91 |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
92 /** |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
93 * Apply an order 2 rational transfer function in-place. |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
94 * |
11648
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10463
diff
changeset
|
95 * @param out output buffer for filtered speech samples |
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10463
diff
changeset
|
96 * @param in input buffer containing speech data (may be the same as out) |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
97 * @param zero_coeffs z^-1 and z^-2 coefficients of the numerator |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
98 * @param pole_coeffs z^-1 and z^-2 coefficients of the denominator |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
99 * @param gain scale factor for final output |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
100 * @param mem intermediate values used by filter (should be 0 initially) |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
101 * @param n number of samples |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
102 */ |
11648
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10463
diff
changeset
|
103 void ff_acelp_apply_order_2_transfer_function(float *out, const float *in, |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
104 const float zero_coeffs[2], |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
105 const float pole_coeffs[2], |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
106 float gain, |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
107 float mem[2], int n); |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
108 |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
109 /** |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
110 * Apply tilt compensation filter, 1 - tilt * z-1. |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
111 * |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
112 * @param mem pointer to the filter's state (one single float) |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
113 * @param tilt tilt factor |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
114 * @param samples array where the filter is applied |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
115 * @param size the size of the samples array |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
116 */ |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
117 void ff_tilt_compensation(float *mem, float tilt, float *samples, int size); |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
118 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
119 |
7760 | 120 #endif /* AVCODEC_ACELP_FILTERS_H */ |