blob: 5ffa1ce53abd27a044dedbf7749989f77542420c
1 | /* |
2 | * IIR filter |
3 | * Copyright (c) 2008 Konstantin Shishkov |
4 | * |
5 | * This file is part of FFmpeg. |
6 | * |
7 | * FFmpeg is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either |
10 | * version 2.1 of the License, or (at your option) any later version. |
11 | * |
12 | * FFmpeg is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | * Lesser General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU Lesser General Public |
18 | * License along with FFmpeg; if not, write to the Free Software |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ |
21 | |
22 | /** |
23 | * @file |
24 | * IIR filter interface |
25 | */ |
26 | |
27 | #ifndef AVCODEC_IIRFILTER_H |
28 | #define AVCODEC_IIRFILTER_H |
29 | |
30 | #include <stddef.h> |
31 | #include <stdint.h> |
32 | |
33 | struct FFIIRFilterCoeffs; |
34 | struct FFIIRFilterState; |
35 | |
36 | enum IIRFilterType{ |
37 | FF_FILTER_TYPE_BESSEL, |
38 | FF_FILTER_TYPE_BIQUAD, |
39 | FF_FILTER_TYPE_BUTTERWORTH, |
40 | FF_FILTER_TYPE_CHEBYSHEV, |
41 | FF_FILTER_TYPE_ELLIPTIC, |
42 | }; |
43 | |
44 | enum IIRFilterMode{ |
45 | FF_FILTER_MODE_LOWPASS, |
46 | FF_FILTER_MODE_HIGHPASS, |
47 | FF_FILTER_MODE_BANDPASS, |
48 | FF_FILTER_MODE_BANDSTOP, |
49 | }; |
50 | |
51 | typedef struct FFIIRFilterContext { |
52 | /** |
53 | * Perform IIR filtering on floating-point input samples. |
54 | * |
55 | * @param coeffs pointer to filter coefficients |
56 | * @param state pointer to filter state |
57 | * @param size input length |
58 | * @param src source samples |
59 | * @param sstep source stride |
60 | * @param dst filtered samples (destination may be the same as input) |
61 | * @param dstep destination stride |
62 | */ |
63 | void (*filter_flt)(const struct FFIIRFilterCoeffs *coeffs, |
64 | struct FFIIRFilterState *state, int size, |
65 | const float *src, ptrdiff_t sstep, float *dst, ptrdiff_t dstep); |
66 | } FFIIRFilterContext; |
67 | |
68 | /** |
69 | * Initialize FFIIRFilterContext |
70 | */ |
71 | void ff_iir_filter_init(FFIIRFilterContext *f); |
72 | void ff_iir_filter_init_mips(FFIIRFilterContext *f); |
73 | |
74 | /** |
75 | * Initialize filter coefficients. |
76 | * |
77 | * @param avc a pointer to an arbitrary struct of which the first |
78 | * field is a pointer to an AVClass struct |
79 | * @param filt_type filter type (e.g. Butterworth) |
80 | * @param filt_mode filter mode (e.g. lowpass) |
81 | * @param order filter order |
82 | * @param cutoff_ratio cutoff to input frequency ratio |
83 | * @param stopband stopband to input frequency ratio (used by bandpass and bandstop filter modes) |
84 | * @param ripple ripple factor (used only in Chebyshev filters) |
85 | * |
86 | * @return pointer to filter coefficients structure or NULL if filter cannot be created |
87 | */ |
88 | struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(void *avc, |
89 | enum IIRFilterType filt_type, |
90 | enum IIRFilterMode filt_mode, |
91 | int order, float cutoff_ratio, |
92 | float stopband, float ripple); |
93 | |
94 | /** |
95 | * Create new filter state. |
96 | * |
97 | * @param order filter order |
98 | * |
99 | * @return pointer to new filter state or NULL if state creation fails |
100 | */ |
101 | struct FFIIRFilterState* ff_iir_filter_init_state(int order); |
102 | |
103 | /** |
104 | * Free filter coefficients. |
105 | * |
106 | * @param coeffs pointer allocated with ff_iir_filter_init_coeffs() |
107 | */ |
108 | void ff_iir_filter_free_coeffsp(struct FFIIRFilterCoeffs **coeffs); |
109 | |
110 | /** |
111 | * Free and zero filter state. |
112 | * |
113 | * @param state pointer to pointer allocated with ff_iir_filter_init_state() |
114 | */ |
115 | void ff_iir_filter_free_statep(struct FFIIRFilterState **state); |
116 | |
117 | /** |
118 | * Perform IIR filtering on signed 16-bit input samples. |
119 | * |
120 | * @param coeffs pointer to filter coefficients |
121 | * @param state pointer to filter state |
122 | * @param size input length |
123 | * @param src source samples |
124 | * @param sstep source stride |
125 | * @param dst filtered samples (destination may be the same as input) |
126 | * @param dstep destination stride |
127 | */ |
128 | void ff_iir_filter(const struct FFIIRFilterCoeffs *coeffs, struct FFIIRFilterState *state, |
129 | int size, const int16_t *src, ptrdiff_t sstep, int16_t *dst, ptrdiff_t dstep); |
130 | |
131 | /** |
132 | * Perform IIR filtering on floating-point input samples. |
133 | * |
134 | * @param coeffs pointer to filter coefficients |
135 | * @param state pointer to filter state |
136 | * @param size input length |
137 | * @param src source samples |
138 | * @param sstep source stride |
139 | * @param dst filtered samples (destination may be the same as input) |
140 | * @param dstep destination stride |
141 | */ |
142 | void ff_iir_filter_flt(const struct FFIIRFilterCoeffs *coeffs, |
143 | struct FFIIRFilterState *state, int size, |
144 | const float *src, ptrdiff_t sstep, |
145 | float *dst, ptrdiff_t dstep); |
146 | |
147 | #endif /* AVCODEC_IIRFILTER_H */ |
148 |