From 92d3d5d9e0a8281112a8e4dfd1e29e8993176e51 Mon Sep 17 00:00:00 2001 From: Arnaud TANGUY Date: Wed, 26 Jun 2024 14:17:25 +0200 Subject: [PATCH] Throw an exception if buffer size and convolution weigths do not match --- .../gram_savitzky_golay/gram_savitzky_golay.h | 7 +++++- tests/test_gram_savitzky_golay.cpp | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/gram_savitzky_golay/gram_savitzky_golay.h b/include/gram_savitzky_golay/gram_savitzky_golay.h index ade1688..54af46a 100644 --- a/include/gram_savitzky_golay/gram_savitzky_golay.h +++ b/include/gram_savitzky_golay/gram_savitzky_golay.h @@ -158,7 +158,12 @@ struct GRAM_SAVITZKY_GOLAY_DLLAPI SavitzkyGolayFilter template typename ContainerT::value_type filter(const ContainerT & v) const { - assert(v.size() != weights_.size() || v.size() < 1); + if(v.size() != weights_.size() || v.size() < 1) + { + throw std::runtime_error("The size of v (" + std::to_string(v.size()) + ") and the convolution weights (" + + std::to_string(weights_.size()) + + ") must be the same. Make sure that 2*m+1 = v.size()"); + } using T = typename ContainerT::value_type; T res = weights_[0] * v[0]; for(size_t i = 1; i < v.size(); ++i) diff --git a/tests/test_gram_savitzky_golay.cpp b/tests/test_gram_savitzky_golay.cpp index eb5ae0a..32194eb 100644 --- a/tests/test_gram_savitzky_golay.cpp +++ b/tests/test_gram_savitzky_golay.cpp @@ -167,3 +167,25 @@ BOOST_AUTO_TEST_CASE(TestPolynomialDerivative) BOOST_REQUIRE_CLOSE(result_order1, expected_result_order1, 10e-8); BOOST_REQUIRE_CLOSE(result_order2, expected_result_order2, 10e-8); } + +// Test derivation on a known polynomial function +BOOST_AUTO_TEST_CASE(TestWrongWindowSize) +{ + auto vec = std::vector(300, 0); + BOOST_REQUIRE_EQUAL(vec.size(), 300); + + // Window size is 2*m+1 + const size_t m = 151; + // Polynomial Order + const size_t n = 6; + // Initial Point Smoothing (ie evaluate polynomial at first point in the window) + // Points are defined in range [-m;m] + const size_t t = m; + // Derivation order? 0: no derivation, 1: first derivative, 2: second derivative... + const int d = 0; + + // Real-time filter (filtering at latest data point) + gram_sg::SavitzkyGolayFilter filter(m, t, n, d); + // Filter some data + BOOST_REQUIRE_THROW(filter.filter(vec), std::runtime_error); +}