annotate acelp_filters.h @ 7855:9a135b6a1dc7 libavcodec

Correct order of parsing for pulse scalefactor band and offset to match the specification. Patch by Alex Converse (alex converse gmail com)
author superdump
date Sat, 13 Sep 2008 18:47:43 +0000
parents c4a4495715dd
children 611a21e4b01b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
1 /*
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
2 * various filters for ACELP-based codecs
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
3 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
4 * Copyright (c) 2008 Vladimir Voroshilov
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
5 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
6 * This file is part of FFmpeg.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
7 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
12 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
16 * Lesser General Public License for more details.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
17 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
21 */
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
22
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7654
diff changeset
23 #ifndef AVCODEC_ACELP_FILTERS_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7654
diff changeset
24 #define AVCODEC_ACELP_FILTERS_H
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
25
6796
b03cd8d29d60 acelp_filters.h needs stdint.h
mru
parents: 6775
diff changeset
26 #include <stdint.h>
b03cd8d29d60 acelp_filters.h needs stdint.h
mru
parents: 6775
diff changeset
27
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
28 /**
7643
cb997823ead5 Cleanup comment for ff_acelp_interp_filter.
michael
parents: 7642
diff changeset
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
cb997823ead5 Cleanup comment for ff_acelp_interp_filter.
michael
parents: 7642
diff changeset
33 * This array only contains the right half of the filter.
cb997823ead5 Cleanup comment for ff_acelp_interp_filter.
michael
parents: 7642
diff changeset
34 * This filter is likely identical to the one used in G.729, though this
cb997823ead5 Cleanup comment for ff_acelp_interp_filter.
michael
parents: 7642
diff changeset
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
333b850a1945 Clarify how generic ff_acelp_interpolate() is.
michael
parents: 7646
diff changeset
40 * Generic FIR interpolation routine.
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
41 * @param out [out] buffer for interpolated data
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
4fa4dde521b0 Typo and grammar fix
superdump
parents: 7164
diff changeset
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 */
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
54 void ff_acelp_interpolate(
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
55 int16_t* out,
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
56 const int16_t* in,
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
57 const int16_t* filter_coeffs,
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
58 int precision,
7648
4df1c17c034c Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents: 7647
diff changeset
59 int frac_pos,
6856
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
60 int filter_length,
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
61 int length);
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
62
94465a2c3b34 Move pitch vector interpolation code to acelp_filters
voroshil
parents: 6814
diff changeset
63 /**
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
64 * Circularly convolve fixed vector with a phase dispersion impulse
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
65 * response filter (D.6.2 of G.729 and 6.1.5 of AMR).
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
66 * @param fc_out vector with filter applied
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
67 * @param fc_in source vector
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
68 * @param filter phase filter coefficients
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
69 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
70 * fc_out[n] = sum(i,0,len-1){ fc_in[i] * filter[(len + n - i)%len] }
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
71 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
72 * \note fc_in and fc_out should not overlap!
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
73 */
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
74 void ff_acelp_convolve_circ(
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
75 int16_t* fc_out,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
76 const int16_t* fc_in,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
77 const int16_t* filter,
7650
1e4ae5de68a4 Rename subframe_size to a name that is not specific to some specific use
michael
parents: 7648
diff changeset
78 int len);
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
79
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
80 /**
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
81 * LP synthesis filter.
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
82 * @param out [out] pointer to output buffer
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
83 * @param filter_coeffs filter coefficients (-0x8000 <= (3.12) < 0x8000)
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
84 * @param in input signal
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
85 * @param buffer_length amount of data to process
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
86 * @param filter_length filter length (10 for 10th order LP filter)
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
87 * @param stop_on_overflow 1 - return immediately if overflow occurs
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
88 * 0 - ignore overflows
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
89 * @param rounder the amount to add for rounding (usually 0x800 or 0xfff)
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
90 *
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
91 * @return 1 if overflow occurred, 0 - otherwise
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
92 *
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
93 * @note Output buffer must contain 10 samples of past
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
94 * speech data before pointer.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
95 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
96 * Routine applies 1/A(z) filter to given speech data.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
97 */
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
98 int ff_acelp_lp_synthesis_filter(
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
99 int16_t *out,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
100 const int16_t* filter_coeffs,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
101 const int16_t* in,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
102 int buffer_length,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
103 int filter_length,
7161
2b763a495c07 Add a rounding parameter to ff_acelp_lp_synthesis_filter()
vitor
parents: 6856
diff changeset
104 int stop_on_overflow,
2b763a495c07 Add a rounding parameter to ff_acelp_lp_synthesis_filter()
vitor
parents: 6856
diff changeset
105 int rounder);
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
106
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
107
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
108 /**
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
109 * high-pass filtering and upscaling (4.2.5 of G.729).
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
110 * @param out [out] output buffer for filtered speech data
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
111 * @param hpf_f [in/out] past filtered data from previous (2 items long)
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
112 * frames (-0x20000000 <= (14.13) < 0x20000000)
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
113 * @param in speech data to process
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
114 * @param length input data size
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
115 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
116 * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] +
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
117 * 1.9330735 * out[i-1] - 0.93589199 * out[i-2]
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
118 *
7654
999b818c33cc Mention cut-off freq of ff_acelp_high_pass_filter() instead of some
michael
parents: 7651
diff changeset
119 * The filter has a cut-off frequency of 1/80 of the sampling freq
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
120 *
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
121 * @note Two items before the top of the out buffer must contain two items from the
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
122 * tail of the previous subframe.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
123 *
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
124 * @remark It is safe to pass the same array in in and out parameters.
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
125 *
7642
1fbf9b2060ce Make doxygen comments consistent with the rest of FFmpeg.
michael
parents: 7249
diff changeset
126 * @remark AMR uses mostly the same filter (cut-off frequency 60Hz, same formula,
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
127 * but constants differs in 5th sign after comma). Fortunately in
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
128 * fixed-point all coefficients are the same as in G.729. Thus this
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
129 * routine can be used for the fixed-point AMR decoder, too.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
130 */
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
131 void ff_acelp_high_pass_filter(
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
132 int16_t* out,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
133 int hpf_f[2],
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
134 const int16_t* in,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
135 int length);
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
136
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7654
diff changeset
137 #endif /* AVCODEC_ACELP_FILTERS_H */