#define BOOST_TEST_MODULE DigitalFilterTests #include "fratio.h" #include "warning_macro.h" #include DISABLE_CONVERSION_WARNING_BEGIN template struct System { std::vector data = { 1., 2., 3., 4. }; std::vector aCoeff = { 1., -0.99993717 }; std::vector bCoeff = { 0.99996859, -0.99996859 }; std::vector results = { 0.99996859, 1.999874351973491, 2.999717289867956, 3.999497407630634 }; }; DISABLE_CONVERSION_WARNING_END BOOST_FIXTURE_TEST_CASE(DIGITAL_FILTER_FLOAT, System) { auto gf = fratio::DigitalFilterf(aCoeff, bCoeff); BOOST_REQUIRE_EQUAL(aCoeff.size(), gf.aOrder()); BOOST_REQUIRE_EQUAL(bCoeff.size(), gf.bOrder()); std::vector filteredData; for (float d : data) filteredData.push_back(gf.stepFilter(d)); for (size_t i = 0; i < filteredData.size(); ++i) BOOST_CHECK_SMALL(std::abs(filteredData[i] - results[i]), 1e-6f); gf.resetFilter(); filteredData = gf.filter(data); for (size_t i = 0; i < filteredData.size(); ++i) BOOST_CHECK_SMALL(std::abs(filteredData[i] - results[i]), 1e-6f); } BOOST_FIXTURE_TEST_CASE(DIGITAL_FILTER_DOUBLE, System) { auto gf = fratio::DigitalFilterd(aCoeff, bCoeff); BOOST_REQUIRE_EQUAL(aCoeff.size(), gf.aOrder()); BOOST_REQUIRE_EQUAL(bCoeff.size(), gf.bOrder()); std::vector filteredData; for (double d : data) filteredData.push_back(gf.stepFilter(d)); for (size_t i = 0; i < filteredData.size(); ++i) BOOST_CHECK_SMALL(std::abs(filteredData[i] - results[i]), 1e-14); gf.resetFilter(); filteredData = gf.filter(data); for (size_t i = 0; i < filteredData.size(); ++i) BOOST_CHECK_SMALL(std::abs(filteredData[i] - results[i]), 1e-14); }