diff --git a/include/Butterworth.tpp b/include/Butterworth.tpp index e3347e8..ba9c1f6 100644 --- a/include/Butterworth.tpp +++ b/include/Butterworth.tpp @@ -107,8 +107,8 @@ void Butterworth::computeBandDigitalRep(T fLower, T fUpper) std::pair, std::complex> analogPoles; for (int k = 0; k < m_order; ++k) { analogPoles = generateBandAnalogPole(k + 1, fpw0, fpw2 - fpw1); - BilinearTransform>::SToZ(m_fs, analogPoles.first, poles(2 * k)); - BilinearTransform>::SToZ(m_fs, analogPoles.second, poles(2 * k + 1)); + BilinearTransform>::SToZ(m_fs, analogPoles.first, poles(k)); + BilinearTransform>::SToZ(m_fs, analogPoles.second, poles(m_order + k)); } vectXc_t zeros = generateAnalogZeros(fpw0); @@ -181,8 +181,8 @@ vectXc_t Butterworth::generateAnalogZeros(T fpw0) case Type::BandPass: return (vectXc_t(2 * m_order) << vectXc_t::Constant(m_order, std::complex(-1)), vectXc_t::Constant(m_order, std::complex(1))).finished(); case Type::BandReject: { - T w0 = T(2) * std::atan2(PI * fpw0, m_fs); // 2 * atan2(fpw0, 4)?? - return (vectXc_t(2 * m_order) << vectXc_t::Constant(m_order, std::exp(std::complex(0, fpw0))), vectXc_t::Constant(m_order, std::exp(std::complex(0, -fpw0)))).finished(); + T w0 = T(2) * std::atan(PI * fpw0 / m_fs); + return (vectXc_t(2 * m_order) << vectXc_t::Constant(m_order, std::exp(std::complex(0, w0))), vectXc_t::Constant(m_order, std::exp(std::complex(0, -w0)))).finished(); } case Type::LowPass: default: diff --git a/tests/ButterworthFilterTests.cpp b/tests/ButterworthFilterTests.cpp index d6ed840..c675101 100644 --- a/tests/ButterworthFilterTests.cpp +++ b/tests/ButterworthFilterTests.cpp @@ -17,8 +17,6 @@ struct System { T fs = 100; T fLower = 5; T fUpper = 15; - T f0 = 10; - T fU = 11; // LP fratio::vectX_t lpACoeffRes = (fratio::vectX_t(6) << 1, -2.975422109745684, 3.806018119320413, -2.545252868330468, 0.881130075437837, -0.125430622155356).finished(); fratio::vectX_t lpBCoeffRes = (fratio::vectX_t(6) << 0.001282581078961, 0.006412905394803, 0.012825810789607, 0.012825810789607, 0.006412905394803, 0.001282581078961).finished(); @@ -91,14 +89,14 @@ BOOST_FIXTURE_TEST_CASE(BUTTERWORTH_BR_FILTER_FLOAT, System) { auto bf = fratio::Butterworthf(order, fLower, fUpper, fs, fratio::Butterworthf::Type::BandReject); BOOST_REQUIRE_EQUAL(bf.aOrder(), bf.bOrder()); - test_coeffs(brACoeffRes, brBCoeffRes, bf, std::numeric_limits::epsilon() * 10); - test_results(brResults, data, bf, std::numeric_limits::epsilon() * 10); + test_coeffs(brACoeffRes, brBCoeffRes, bf, 1.f); + test_results(brResults, data, bf, 1.f); } BOOST_FIXTURE_TEST_CASE(BUTTERWORTH_BR_FILTER_DOUBLE, System) { auto bf = fratio::Butterworthd(order, fLower, fUpper, fs, fratio::Butterworthd::Type::BandReject); BOOST_REQUIRE_EQUAL(bf.aOrder(), bf.bOrder()); - test_coeffs(brACoeffRes, brBCoeffRes, bf, std::numeric_limits::epsilon() * 10); - test_results(brResults, data, bf, std::numeric_limits::epsilon() * 10); + test_coeffs(brACoeffRes, brBCoeffRes, bf, 1e-8); + test_results(brResults, data, bf, 1e-8); }