kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit ee0dac52a55548a0ad9e51431458417f5b65631c
parent 5e77b9254c2b3e54bd8092b32879ed876aae2a85
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date:   Sun, 21 Oct 2018 18:15:31 +0300

biquad_filter<T> implementation

Diffstat:
Mexamples/biquads.cpp | 16+++++++++++++++-
Minclude/kfr/dsp/biquad.hpp | 33++++++++++++++++++++++++---------
2 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/examples/biquads.cpp b/examples/biquads.cpp @@ -77,8 +77,22 @@ int main() // apply filter filter.apply(output); } + plot_save("biquad_custom_filter_lowpass", output, + options + ", title='Biquad Low pass filter (0.2, 0.9) (using expression_filter)'"); + + { + // filter initialization + biquad_params<fbase> bq[] = { biquad_lowpass(0.2, 0.9) }; + biquad_filter<fbase> filter(bq); + + // prepare data + output = unitimpulse(); + + // apply filter + filter.apply(output); + } plot_save("biquad_filter_lowpass", output, - options + ", title='Biquad Low pass filter (0.2, 0.9) (using filter)'"); + options + ", title='Biquad Low pass filter (0.2, 0.9) (using biquad_filter)'"); return 0; } diff --git a/include/kfr/dsp/biquad.hpp b/include/kfr/dsp/biquad.hpp @@ -157,8 +157,8 @@ struct expression_biquads_l : public expression_base<E1> const vec<T, filters>& in) { const vec<T, filters> out = bq.b0 * in + state.s1; - state.s1 = state.s2 + bq.b1 * in - bq.a1 * out; - state.s2 = bq.b2 * in - bq.a2 * out; + state.s1 = state.s2 + bq.b1 * in - bq.a1 * out; + state.s2 = bq.b2 * in - bq.a2 * out; return out; } biquad_block<T, filters> bq; @@ -181,7 +181,7 @@ struct expression_biquads : expression_base<E1> for (size_t i = 0; i < filters - 1; i++) { const vec<T, 1> in = i < size ? this->argument_first(cinput, i, vec_t<T, 1>()) : 0; - state.out = process(bq, state, insertleft(in[0], state.out)); + state.out = process(bq, state, insertleft(in[0], state.out)); } } CMT_INLINE void end_block(cinput_t cinput, size_t) const { state = saved_state; } @@ -219,8 +219,8 @@ struct expression_biquads : expression_base<E1> for (; i < std::min(width, block_end - index); i++) { const vec<T, 1> in = this->argument_first(cinput, index + i, vec_t<T, 1>()); - state.out = process(bq, state, insertleft(in[0], state.out)); - out[i] = state.out[filters - 1]; + state.out = process(bq, state, insertleft(in[0], state.out)); + out[i] = state.out[filters - 1]; } saved_state = state; for (; i < width; i++) @@ -235,8 +235,8 @@ struct expression_biquads : expression_base<E1> vec<T, filters> in) { const vec<T, filters> out = bq.b0 * in + state.s1; - state.s1 = state.s2 + bq.b1 * in - bq.a1 * out; - state.s2 = bq.b2 * in - bq.a2 * out; + state.s1 = state.s2 + bq.b1 * in - bq.a1 * out; + state.s2 = bq.b2 * in - bq.a2 * out; return out; } biquad_block<T, filters> bq; @@ -245,7 +245,7 @@ struct expression_biquads : expression_base<E1> mutable biquad_state<T, filters> saved_state; mutable size_t block_end; }; -} +} // namespace internal /** * @brief Returns template expressions that applies biquad filter to the input. @@ -301,4 +301,19 @@ CMT_INLINE expression_pointer<T> biquad(const biquad_params<T>* bq, size_t count }, [&] { return to_pointer(zeros<T>()); }); } -} + +template <typename T> +class biquad_filter : public expression_filter<T> +{ +public: + biquad_filter(const biquad_params<T>* bq, size_t count) + : expression_filter<T>(to_pointer(biquad(bq, count, placeholder<T>()))) + { + } + + template <size_t N> + biquad_filter(const biquad_params<T> (&bq)[N]) : biquad_filter(bq, N) + { + } +}; +} // namespace kfr