6b0679ff70a6225e146178e15730e33d877ba9b0

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

23 #ifndef FFMPEG_ACELP_FILTERS_H

24 #define FFMPEG_ACELP_FILTERS_H

26 #include <stdint.h>

28 /**

29 * low-pass Finite Impulse Response filter coefficients.

30 *

31 * Hamming windowed sinc filter with cutoff freq 3/40 of the sampling freq,

32 * the coefficients are scaled by 2^15.

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.

36 */

39 /**

40 * Generic FIR interpolation routine.

41 * @param out [out] buffer for interpolated data

42 * @param in input data

43 * @param filter_coeffs interpolation filter coefficients (0.15)

44 * @param precision sub sample factor, that is the precision of the position

45 * @param frac_pos fractional part of position [0..precision-1]

46 * @param filter_length filter length

47 * @param length length of output

48 *

49 * filter_coeffs contains coefficients of the right half of the symmetric

50 * interpolation filter. filter_coeffs[0] should the central (unpaired) coefficient.

51 * See ff_acelp_interp_filter for an example.

52 *

53 */

63 /**

64 * Circularly convolve fixed vector with a phase dispersion impulse

65 * response filter (D.6.2 of G.729 and 6.1.5 of AMR).

66 * @param fc_out vector with filter applied

67 * @param fc_in source vector

68 * @param filter phase filter coefficients

69 *

70 * fc_out[n] = sum(i,0,len-1){ fc_in[i] * filter[(len + n - i)%len] }

71 *

72 * \note fc_in and fc_out should not overlap!

73 */

80 /**

81 * LP synthesis filter.

82 * @param out [out] pointer to output buffer

83 * @param filter_coeffs filter coefficients (-0x8000 <= (3.12) < 0x8000)

84 * @param in input signal

85 * @param buffer_length amount of data to process

86 * @param filter_length filter length (10 for 10th order LP filter)

87 * @param stop_on_overflow 1 - return immediately if overflow occurs

88 * 0 - ignore overflows

89 * @param rounder the amount to add for rounding (usually 0x800 or 0xfff)

90 *

91 * @return 1 if overflow occurred, 0 - otherwise

92 *

93 * @note Output buffer must contain 10 samples of past

94 * speech data before pointer.

95 *

96 * Routine applies 1/A(z) filter to given speech data.

97 */

108 /**

109 * high-pass filtering and upscaling (4.2.5 of G.729).

110 * @param out [out] output buffer for filtered speech data

111 * @param hpf_f [in/out] past filtered data from previous (2 items long)

112 * frames (-0x20000000 <= (14.13) < 0x20000000)

113 * @param in speech data to process

114 * @param length input data size

115 *

116 * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] +

117 * 1.9330735 * out[i-1] - 0.93589199 * out[i-2]

118 *

119 * The filter has a cut-off frequency of 1/80 of the sampling freq

120 *

121 * @note Two items before the top of the out buffer must contain two items from the

122 * tail of the previous subframe.

123 *

124 * @remark It is safe to pass the same array in in and out parameters.

125 *

126 * @remark AMR uses mostly the same filter (cut-off frequency 60Hz, same formula,

127 * but constants differs in 5th sign after comma). Fortunately in

128 * fixed-point all coefficients are the same as in G.729. Thus this

129 * routine can be used for the fixed-point AMR decoder, too.

130 */