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:
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