2 Copyright (C) 2003-2013 Paul Brossier <piem@aubio.org>
4 This file is part of aubio.
6 aubio is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 aubio is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with aubio. If not, see <http://www.gnu.org/licenses/>.
21 #ifndef _AUBIO_FILTER_H
22 #define _AUBIO_FILTER_H
28 This object stores a digital filter of order \f$n\f$.
29 It contains the following data:
30 - \f$ n*1 b_i \f$ feedforward coefficients
31 - \f$ n*1 a_i \f$ feedback coefficients
32 - \f$ n*c x_i \f$ input signal
33 - \f$ n*c y_i \f$ output signal
35 For convenience, the samplerate of the input signal is also stored in the
38 Feedforward and feedback parameters can be modified using
39 aubio_filter_get_feedback() and aubio_filter_get_feedforward().
41 The function aubio_filter_do_outplace() computes the following output signal
42 \f$ y[n] \f$ from the input signal \f$ x[n] \f$:
45 y[n] = b_0 x[n] & + & b_1 x[n-1] + b_2 x[n-2] + ... + b_P x[n-P] \\
46 & - & a_1 y[n-1] - a_2 y[n-2] - ... - a_P y[n-P] \\
49 The function aubio_filter_do() executes the same computation but modifies
50 directly the input signal (in-place).
52 The function aubio_filter_do_filtfilt() version runs the filter twice, first
53 forward then backward, to compensate with the phase shifting of the forward
56 Some convenience functions are provided:
57 - new_aubio_filter_a_weighting() and aubio_filter_set_a_weighting(),
58 - new_aubio_filter_c_weighting() and aubio_filter_set_c_weighting().
59 - new_aubio_filter_biquad() and aubio_filter_set_biquad().
61 \example temporal/test-filter.c
72 typedef struct _aubio_filter_t aubio_filter_t;
74 /** filter input vector (in-place)
76 \param f filter object as returned by new_aubio_filter()
77 \param in input vector to filter
80 void aubio_filter_do (aubio_filter_t * f, fvec_t * in);
82 /** filter input vector (out-of-place)
84 \param f filter object as returned by new_aubio_filter()
85 \param in input vector to filter
86 \param out output vector to store filtered input
89 void aubio_filter_do_outplace (aubio_filter_t * f, fvec_t * in, fvec_t * out);
91 /** filter input vector forward and backward
93 \param f ::aubio_filter_t object as returned by new_aubio_filter()
94 \param in ::fvec_t input vector to filter
95 \param tmp memory space to use for computation
98 void aubio_filter_do_filtfilt (aubio_filter_t * f, fvec_t * in, fvec_t * tmp);
100 /** returns a pointer to feedback coefficients \f$ a_i \f$
102 \param f filter object to get parameters from
104 \return a pointer to the \f$ a_0 ... a_i ... a_P \f$ coefficients
107 lvec_t *aubio_filter_get_feedback (aubio_filter_t * f);
109 /** returns a pointer to feedforward coefficients \f$ b_i \f$
111 \param f filter object to get coefficients from
113 \return a pointer to the \f$ b_0 ... b_i ... b_P \f$ coefficients
116 lvec_t *aubio_filter_get_feedforward (aubio_filter_t * f);
118 /** get order of the filter
120 \param f filter to get order from
122 \return the order of the filter
125 uint_t aubio_filter_get_order (aubio_filter_t * f);
127 /** get sampling rate of the filter
129 \param f filter to get sampling rate from
131 \return the sampling rate of the filter, in Hz
134 uint_t aubio_filter_get_samplerate (aubio_filter_t * f);
136 /** get sampling rate of the filter
138 \param f filter to get sampling rate from
139 \param samplerate sample rate to set the filter to
141 \return the sampling rate of the filter, in Hz
144 uint_t aubio_filter_set_samplerate (aubio_filter_t * f, uint_t samplerate);
146 /** reset filter memory
148 \param f filter object as returned by new_aubio_filter()
151 void aubio_filter_do_reset (aubio_filter_t * f);
153 /** create new filter object
155 This function creates a new ::aubio_filter_t object, given the order of the
158 \param order order of the filter (number of coefficients)
160 \return the newly created filter object
163 aubio_filter_t *new_aubio_filter (uint_t order);
165 /** delete a filter object
167 \param f filter object to delete
170 void del_aubio_filter (aubio_filter_t * f);
176 #endif /* _AUBIO_FILTER_H */