diff --git a/docs/docs/bq_gallery.md b/docs/docs/bq_gallery.md index 2d31fe69..9677a8cb 100644 --- a/docs/docs/bq_gallery.md +++ b/docs/docs/bq_gallery.md @@ -7,8 +7,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_highshelf(0.3, +9.0) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_highshelf(0.3, +9.0) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_highshelf", output, options + ", title='Biquad high shelf filter (0.3, +9)'"); ``` Result @@ -22,8 +22,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_lowpass(0.2, 0.9) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_lowpass(0.2, 0.9) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_lowpass", output, options + ", title='Biquad Low pass filter (0.2, 0.9)'"); ``` Result @@ -38,8 +38,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_lowshelf(0.3, -1.0) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_lowshelf(0.3, -1.0) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_lowshelf", output, options + ", title='Biquad low shelf filter (0.3, -1)'"); ``` Result @@ -53,9 +53,9 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_notch(0.1, 0.5), biquad_notch(0.2, 0.5), biquad_notch(0.3, 0.5), +biquad_section bq[] = { biquad_notch(0.1, 0.5), biquad_notch(0.2, 0.5), biquad_notch(0.3, 0.5), biquad_notch(0.4, 0.5) }; -output = biquad(bq, unitimpulse()); +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_notch", output, options + ", title='Four Biquad Notch filters'"); ``` Result @@ -68,8 +68,8 @@ Code ```c++ linenums="1" const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_peak(0.3, 0.5, +9.0) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_peak(0.3, 0.5, +9.0) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_peak", output, options + ", title='Biquad Peak filter (0.2, 0.5, +9)'"); ``` Result @@ -83,8 +83,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_peak(0.3, 3.0, -2.0) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_peak(0.3, 3.0, -2.0) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_peak2", output, options + ", title='Biquad Peak filter (0.3, 3, -2)'"); ``` Result @@ -98,8 +98,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_bandpass(0.25, 0.2) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_bandpass(0.25, 0.2) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_bandpass", output, options + ", title='Biquad band pass (0.25, 0.2)'"); ``` Result @@ -113,8 +113,8 @@ Code const std::string options = "phaseresp=True"; univector output; -biquad_params bq[] = { biquad_highpass(0.3, 0.1) }; -output = biquad(bq, unitimpulse()); +biquad_section bq[] = { biquad_highpass(0.3, 0.1) }; +output = iir(unitimpulse(), iir_params{ bq }); plot_save("biquad_highpass", output, options + ", title='Biquad High pass filter (0.3, 0.1)'"); ``` Result diff --git a/docs/docs/iir_gallery.md b/docs/docs/iir_gallery.md index 6d0ba4e3..bbd50d56 100644 --- a/docs/docs/iir_gallery.md +++ b/docs/docs/iir_gallery.md @@ -19,12 +19,11 @@ Code ```c++ linenums="1" const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192"; -constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(bessel(24), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(bessel(24), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("bessel_lowpass24", output, options + ", title='24th-order Bessel filter, lowpass 1khz'"); ``` @@ -41,9 +40,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(bessel(12), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(bessel(12), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("bessel_lowpass12", output, options + ", title='12th-order Bessel filter, lowpass 1khz'"); ``` @@ -59,9 +58,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(bessel(6), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(bessel(6), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("bessel_lowpass6", output, options + ", title='6th-order Bessel filter, lowpass 1khz'"); ``` Result @@ -76,9 +75,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(butterworth(24), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(butterworth(24), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_lowpass24", output, options + ", title='24th-order Butterworth filter, lowpass 1khz'"); ``` @@ -95,9 +94,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(butterworth(12), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(butterworth(12), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_lowpass12", output, options + ", title='12th-order Butterworth filter, lowpass 1khz'"); ``` @@ -113,9 +112,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_highpass(butterworth(12), 1000, 48000); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_highpass(butterworth(12), 1000, 48000); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_highpass12", output, options + ", title='12th-order Butterworth filter, highpass 1khz'"); ``` @@ -131,9 +130,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_bandpass(butterworth(12), 0.1, 0.2); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_bandpass(butterworth(12), 0.1, 0.2); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_bandpass12", output, options + ", title='12th-order Butterworth filter, bandpass'"); ``` @@ -149,9 +148,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_bandstop(butterworth(12), 0.1, 0.2); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_bandstop(butterworth(12), 0.1, 0.2); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_bandstop12", output, options + ", title='12th-order Butterworth filter, bandstop'"); ``` @@ -167,9 +166,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_bandpass(butterworth(4), 0.005, 0.9); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_bandpass(butterworth(4), 0.005, 0.9); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("butterworth_bandpass4", output, options + ", title='4th-order Butterworth filter, bandpass'"); ``` Result @@ -184,9 +183,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(chebyshev1(8, 2), 0.09); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(chebyshev1(8, 2), 0.09); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("chebyshev1_lowpass8", output, options + ", title='8th-order Chebyshev type I filter, lowpass'"); ``` @@ -202,9 +201,9 @@ const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 1 constexpr size_t maxorder = 32; univector output; -zpk filt = iir_lowpass(chebyshev2(8, 80), 0.09); -std::vector> bqs = to_sos(filt); -output = biquad(bqs, unitimpulse()); +zpk filt = iir_lowpass(chebyshev2(8, 80), 0.09); +iir_params bqs = to_sos(filt); +output = iir(unitimpulse(), iir_params{ bqs }); plot_save("chebyshev2_lowpass8", output, options + ", title='8th-order Chebyshev type II filter, lowpass'"); ``` diff --git a/examples/biquads.cpp b/examples/biquads.cpp index 9b001a91..9ce11e07 100644 --- a/examples/biquads.cpp +++ b/examples/biquads.cpp @@ -20,74 +20,74 @@ int main() univector output; { - biquad_params bq[] = { biquad_notch(0.1, 0.5), biquad_notch(0.2, 0.5), biquad_notch(0.3, 0.5), - biquad_notch(0.4, 0.5) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_notch(0.1, 0.5), biquad_notch(0.2, 0.5), biquad_notch(0.3, 0.5), + biquad_notch(0.4, 0.5) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_notch", output, options + ", title='Four Biquad Notch filters'"); { - biquad_params bq[] = { biquad_lowpass(0.2, 0.9) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_lowpass(0.2, 0.9) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_lowpass", output, options + ", title='Biquad Low pass filter (0.2, 0.9)'"); { - biquad_params bq[] = { biquad_highpass(0.3, 0.1) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_highpass(0.3, 0.1) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_highpass", output, options + ", title='Biquad High pass filter (0.3, 0.1)'"); { - biquad_params bq[] = { biquad_peak(0.3, 0.5, +9.0) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_peak(0.3, 0.5, +9.0) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_peak", output, options + ", title='Biquad Peak filter (0.2, 0.5, +9)'"); { - biquad_params bq[] = { biquad_peak(0.3, 3.0, -2.0) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_peak(0.3, 3.0, -2.0) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_peak2", output, options + ", title='Biquad Peak filter (0.3, 3, -2)'"); { - biquad_params bq[] = { biquad_lowshelf(0.3, -1.0) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_lowshelf(0.3, -1.0) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_lowshelf", output, options + ", title='Biquad low shelf filter (0.3, -1)'"); { - biquad_params bq[] = { biquad_highshelf(0.3, +9.0) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_highshelf(0.3, +9.0) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_highshelf", output, options + ", title='Biquad high shelf filter (0.3, +9)'"); { - biquad_params bq[] = { biquad_bandpass(0.25, 0.2) }; - output = biquad(bq, unitimpulse()); + biquad_section bq[] = { biquad_bandpass(0.25, 0.2) }; + output = iir(unitimpulse(), iir_params{ bq }); } plot_save("biquad_bandpass", output, options + ", title='Biquad band pass (0.25, 0.2)'"); { - biquad_params bq[] = { biquad_bandpass(0.25, 0.2) }; + biquad_section bq[] = { biquad_bandpass(0.25, 0.2) }; std::vector data(output.size(), 0.f); data[0] = 1.f; - output = biquad(bq, make_univector(data)); + output = iir(make_univector(data), iir_params{ bq }); } plot_save("biquad_bandpass_stdvector", output, options + ", title='Biquad band pass (0.25, 0.2)'"); { - biquad_params bq[] = { biquad_bandpass(0.25, 0.2) }; - fbase data[output.size()] = { 0 }; // .size() is constexpr - data[0] = 1.f; - output = biquad(bq, make_univector(data)); + biquad_section bq[] = { biquad_bandpass(0.25, 0.2) }; + fbase data[output.size()] = { 0 }; // .size() is constexpr + data[0] = 1.f; + output = iir(make_univector(data), iir_params{ bq }); } plot_save("biquad_bandpass_carray", output, options + ", title='Biquad band pass (0.25, 0.2)'"); { // filter initialization - biquad_params bq[] = { biquad_lowpass(0.2, 0.9) }; - expression_filter filter = to_filter(biquad(bq, placeholder())); + biquad_section bq[] = { biquad_lowpass(0.2, 0.9) }; + expression_filter filter = to_filter(iir(placeholder(), iir_params{ bq })); // prepare data output = unitimpulse(); @@ -100,8 +100,8 @@ int main() { // filter initialization - biquad_params bq[] = { biquad_lowpass(0.2, 0.9) }; - biquad_filter filter(bq); + biquad_section bq[] = { biquad_lowpass(0.2, 0.9) }; + iir_filter filter(bq); // prepare data output = unitimpulse(); @@ -110,7 +110,7 @@ int main() filter.apply(output); } plot_save("biquad_filter_lowpass", output, - options + ", title='Biquad Low pass filter (0.2, 0.9) (using biquad_filter)'"); + options + ", title='Biquad Low pass filter (0.2, 0.9) (using iir_filter)'"); println("SVG plots have been saved to svg directory"); diff --git a/examples/ccv.cpp b/examples/ccv.cpp index 246d22b1..7f2236d4 100644 --- a/examples/ccv.cpp +++ b/examples/ccv.cpp @@ -47,7 +47,7 @@ int main() auto toc = std::chrono::high_resolution_clock::now(); auto const ccv_time_complex = std::chrono::duration_cast>(toc - tic); tic = toc; - filtered_cnoise_fir = kfr::fir(cnoise, taps127); + filtered_cnoise_fir = kfr::fir(cnoise, fir_params{ taps127 }); toc = std::chrono::high_resolution_clock::now(); auto const fir_time_complex = std::chrono::duration_cast>(toc - tic); auto const cdiff = rms(cabs(filtered_cnoise_fir - filtered_cnoise_ccv)); @@ -58,7 +58,7 @@ int main() toc = std::chrono::high_resolution_clock::now(); auto const ccv_time_real = std::chrono::duration_cast>(toc - tic); tic = toc; - filtered_noise_fir = kfr::fir(noise, taps127); + filtered_noise_fir = kfr::fir(noise, fir_params{ taps127 }); toc = std::chrono::high_resolution_clock::now(); auto const fir_time_real = std::chrono::duration_cast>(toc - tic); auto const diff = rms(filtered_noise_fir - filtered_noise_ccv); diff --git a/examples/fir.cpp b/examples/fir.cpp index 2fd687f1..ccdf3cba 100644 --- a/examples/fir.cpp +++ b/examples/fir.cpp @@ -105,7 +105,7 @@ int main() univector noise = truncate(gen_random_range(random_init(1, 2, 3, 4), -1.f, +1.f), 10000); // Apply band stop filter - univector filtered_noise = fir(noise, taps127); + univector filtered_noise = fir(noise, fir_params{ taps127 }); #if PYTHON_IS_INSTALLED // Plot results diff --git a/include/kfr/dsp/biquad_design.hpp b/include/kfr/dsp/biquad_design.hpp index f2035c2e..27f93626 100644 --- a/include/kfr/dsp/biquad_design.hpp +++ b/include/kfr/dsp/biquad_design.hpp @@ -40,7 +40,7 @@ inline namespace CMT_ARCH_NAME * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_allpass(identity frequency, identity Q) +KFR_FUNCTION biquad_section biquad_allpass(identity frequency, identity Q) { const T alpha = std::sin(frequency) / 2.0 * Q; const T cs = std::cos(frequency); @@ -61,7 +61,7 @@ KFR_FUNCTION biquad_params biquad_allpass(identity frequency, identity * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_lowpass(identity frequency, identity Q) +KFR_FUNCTION biquad_section biquad_lowpass(identity frequency, identity Q) { const T K = std::tan(c_pi * frequency); const T K2 = K * K; @@ -81,7 +81,7 @@ KFR_FUNCTION biquad_params biquad_lowpass(identity frequency, identity * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_highpass(identity frequency, identity Q) +KFR_FUNCTION biquad_section biquad_highpass(identity frequency, identity Q) { const T K = std::tan(c_pi * frequency); const T K2 = K * K; @@ -101,7 +101,7 @@ KFR_FUNCTION biquad_params biquad_highpass(identity frequency, identity * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_bandpass(identity frequency, identity Q) +KFR_FUNCTION biquad_section biquad_bandpass(identity frequency, identity Q) { const T K = std::tan(c_pi * frequency); const T K2 = K * K; @@ -121,7 +121,7 @@ KFR_FUNCTION biquad_params biquad_bandpass(identity frequency, identity * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_notch(identity frequency, identity Q) +KFR_FUNCTION biquad_section biquad_notch(identity frequency, identity Q) { const T K = std::tan(c_pi * frequency); const T K2 = K * K; @@ -142,9 +142,9 @@ KFR_FUNCTION biquad_params biquad_notch(identity frequency, identity Q) * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_peak(identity frequency, identity Q, identity gain) +KFR_FUNCTION biquad_section biquad_peak(identity frequency, identity Q, identity gain) { - biquad_params result; + biquad_section result; const T K = std::tan(c_pi * frequency); const T K2 = K * K; const T V = std::exp(std::abs(gain) * (1.0 / 20.0) * c_log_10); @@ -179,9 +179,9 @@ KFR_FUNCTION biquad_params biquad_peak(identity frequency, identity Q, * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_lowshelf(identity frequency, identity gain) +KFR_FUNCTION biquad_section biquad_lowshelf(identity frequency, identity gain) { - biquad_params result; + biquad_section result; const T K = std::tan(c_pi * frequency); const T K2 = K * K; const T V = std::exp(std::fabs(gain) * (1.0 / 20.0) * c_log_10); @@ -216,9 +216,9 @@ KFR_FUNCTION biquad_params biquad_lowshelf(identity frequency, identity * @return Biquad filter coefficients */ template -KFR_FUNCTION biquad_params biquad_highshelf(identity frequency, identity gain) +KFR_FUNCTION biquad_section biquad_highshelf(identity frequency, identity gain) { - biquad_params result; + biquad_section result; const T K = std::tan(c_pi * frequency); const T K2 = K * K; const T V = std::exp(std::fabs(gain) * (1.0 / 20.0) * c_log_10); diff --git a/include/kfr/dsp/dcremove.hpp b/include/kfr/dsp/dcremove.hpp index d017e3a8..259ae417 100644 --- a/include/kfr/dsp/dcremove.hpp +++ b/include/kfr/dsp/dcremove.hpp @@ -34,7 +34,7 @@ namespace kfr template >> KFR_INTRINSIC expression_iir<1, T, E1> dcremove(E1&& e1, double cutoff = 0.00025) { - const biquad_params bqs[1] = { biquad_highpass(cutoff, 0.5) }; + const biquad_section bqs[1] = { biquad_highpass(cutoff, 0.5) }; return expression_iir<1, T, E1>(bqs, std::forward(e1)); } diff --git a/include/kfr/dsp/ebu.hpp b/include/kfr/dsp/ebu.hpp index dbb4991f..b3cfbcdb 100644 --- a/include/kfr/dsp/ebu.hpp +++ b/include/kfr/dsp/ebu.hpp @@ -186,11 +186,11 @@ struct lra_vec : public univector template KFR_INTRINSIC expression_handle make_kfilter(int samplerate) { - const biquad_params bq[] = { + const biquad_section bq[] = { biquad_highshelf(T(1681.81 / samplerate), T(+4.0)), biquad_highpass(T(38.1106678246655 / samplerate), T(0.5)).normalized_all() }; - return to_handle(biquad(bq, placeholder())); + return to_handle(iir(placeholder(), iir_params{ bq })); } template diff --git a/include/kfr/dsp/iir_design.hpp b/include/kfr/dsp/iir_design.hpp index 86e8a399..bc911b42 100644 --- a/include/kfr/dsp/iir_design.hpp +++ b/include/kfr/dsp/iir_design.hpp @@ -886,7 +886,7 @@ KFR_FUNCTION vec zpk2tf_poly(const complex& x, const complex& y) } template -KFR_FUNCTION biquad_params zpk2tf(const zero_pole_pairs& pairs, identity k) +KFR_FUNCTION biquad_section zpk2tf(const zero_pole_pairs& pairs, identity k) { vec zz = k * zpk2tf_poly(pairs.z1, pairs.z2); vec pp = zpk2tf_poly(pairs.p1, pairs.p2); @@ -1082,7 +1082,7 @@ template KFR_FUNCTION iir_params to_sos(const zpk& filter) { if (filter.p.empty() && filter.z.empty()) - return { biquad_params(filter.k, T(0.), T(0.), T(1.), T(0.), 0) }; + return { biquad_section(filter.k, T(0.), T(0.), T(1.), T(0.), 0) }; zpk filt = filter; size_t length = std::max(filter.p.size(), filter.z.size()); diff --git a/src/capi/capi.cpp b/src/capi/capi.cpp index b610227d..4c0491c8 100644 --- a/src/capi/capi.cpp +++ b/src/capi/capi.cpp @@ -430,8 +430,8 @@ extern "C" return try_fn( [&]() { - return reinterpret_cast( - new biquad_filter(reinterpret_cast*>(sos), sos_count)); + return reinterpret_cast(new iir_filter( + iir_params{ reinterpret_cast*>(sos), sos_count })); }, nullptr); } @@ -440,8 +440,8 @@ extern "C" return try_fn( [&]() { - return reinterpret_cast(new biquad_filter( - reinterpret_cast*>(sos), sos_count)); + return reinterpret_cast(new iir_filter( + iir_params{ reinterpret_cast*>(sos), sos_count })); }, nullptr); } diff --git a/tests/unit/dsp/biquad.cpp b/tests/unit/dsp/biquad.cpp index 389c94fe..65d91af9 100644 --- a/tests/unit/dsp/biquad.cpp +++ b/tests/unit/dsp/biquad.cpp @@ -38,7 +38,7 @@ TEST(biquad_lowpass1) { using T = typename decltype(type)::type; - const biquad_params bq = biquad_lowpass(0.1, 0.7); + const biquad_section bq = biquad_lowpass(0.1, 0.7); constexpr size_t size = 32; @@ -66,11 +66,9 @@ TEST(biquad_lowpass1) +0xb.5f265b1be1728p-23, +0xd.d2cb83f8483f8p-24, }; - const univector ir = biquad(bq, unitimpulse()); - const univector ir2 = iir(unitimpulse(), iir_params{ bq }); + const univector ir = iir(unitimpulse(), iir_params{ bq }); CHECK(absmaxof(choose_array(test_vector_f32, test_vector_f64) - ir) == 0); - CHECK(absmaxof(choose_array(test_vector_f32, test_vector_f64) - ir2) == 0); }); } @@ -81,7 +79,7 @@ TEST(biquad_lowpass2) { using T = typename decltype(type)::type; - const biquad_params bq = biquad_lowpass(0.45, 0.2); + const biquad_section bq = biquad_lowpass(0.45, 0.2); constexpr size_t size = 32; @@ -109,16 +107,16 @@ TEST(biquad_lowpass2) +0xd.94f05f80af008p-15, -0xc.b66c0799b21a8p-15, }; - const univector ir = biquad(bq, unitimpulse()); + const univector ir = iir(unitimpulse(), iir_params{ bq }); CHECK(absmaxof(choose_array(test_vector_f32, test_vector_f64) - ir) == 0); }); } -TEST(biquad_filter) +TEST(iir_filter) { - biquad_params params[16]; - auto f = biquad_filter(params); + biquad_section params[16]; + auto f = iir_filter(iir_params{ params }); float buf[256]; f.apply(buf); } diff --git a/tests/unit/dsp/delay.cpp b/tests/unit/dsp/delay.cpp index 9d687566..a592e114 100644 --- a/tests/unit/dsp/delay.cpp +++ b/tests/unit/dsp/delay.cpp @@ -22,10 +22,10 @@ TEST(delay) CHECK_EXPRESSION(delay<3>(v1), 33, [](size_t i) { return i < 3 ? 0.f : (i - 3) + 100.f; }); delay_state state1; - CHECK_EXPRESSION(delay(state1, v1), 33, [](size_t i) { return i < 3 ? 0.f : (i - 3) + 100.f; }); + CHECK_EXPRESSION(delay(v1, std::ref(state1)), 33, [](size_t i) { return i < 3 ? 0.f : (i - 3) + 100.f; }); delay_state state2; - CHECK_EXPRESSION(delay(state2, v1), 33, [](size_t i) { return i < 3 ? 0.f : (i - 3) + 100.f; }); + CHECK_EXPRESSION(delay(v1, std::ref(state2)), 33, [](size_t i) { return i < 3 ? 0.f : (i - 3) + 100.f; }); } TEST(fracdelay) diff --git a/tests/unit/dsp/fir.cpp b/tests/unit/dsp/fir.cpp index 01237259..351a3966 100644 --- a/tests/unit/dsp/fir.cpp +++ b/tests/unit/dsp/fir.cpp @@ -100,7 +100,7 @@ TEST(fir) counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5); const univector taps{ 1, 2, -2, 0.5, 0.0625, 4 }; - CHECK_EXPRESSION(fir(data, taps), 100, + CHECK_EXPRESSION(fir(data, fir_params{ taps }), 100, [&](size_t index) -> T { T result = 0; @@ -111,7 +111,7 @@ TEST(fir) fir_state state(taps.ref()); - CHECK_EXPRESSION(fir(state, data), 100, + CHECK_EXPRESSION(fir(data, std::ref(state)), 100, [&](size_t index) -> T { T result = 0; @@ -131,7 +131,7 @@ TEST(fir) short_fir_state<9, T> state2(taps); - CHECK_EXPRESSION(short_fir(state2, data), 100, + CHECK_EXPRESSION(short_fir(data, std::ref(state2)), 100, [&](size_t index) -> T { T result = 0; @@ -140,7 +140,7 @@ TEST(fir) return result; }); - CHECK_EXPRESSION(moving_sum(data), 100, + CHECK_EXPRESSION(moving_sum(data, taps.size()), 100, [&](size_t index) -> T { T result = 0; @@ -151,7 +151,7 @@ TEST(fir) moving_sum_state msstate1; - CHECK_EXPRESSION(moving_sum(msstate1, data), 100, + CHECK_EXPRESSION(moving_sum(data, std::ref(msstate1)), 100, [&](size_t index) -> T { T result = 0; @@ -162,7 +162,7 @@ TEST(fir) moving_sum_state msstate2(133); - CHECK_EXPRESSION(moving_sum(msstate2, data), 100, + CHECK_EXPRESSION(moving_sum(data, std::ref(msstate2)), 100, [&](size_t index) -> T { T result = 0; @@ -181,7 +181,7 @@ TEST(fir_different) // const univector taps{ 1, 2, -2, 0.5, 0.0625, 4 }; const univector taps{ 1, 2, 3, 4 }; - CHECK_EXPRESSION(fir(data, taps), 100, + CHECK_EXPRESSION(fir(data, fir_params{ taps }), 100, [&](size_t index) -> float { double result = 0.0; @@ -207,7 +207,7 @@ TEST(fir_complex) counter() * complex{ 0.f, 1.f } + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5f); const univector taps{ 1, 2, -2, 0.5, 0.0625, 4 }; - CHECK_EXPRESSION(fir(data, taps), 100, + CHECK_EXPRESSION(fir(data, fir_params{ taps }), 100, [&](size_t index) -> complex { std::complex result = 0.0;