Chris@166: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@166: Chris@166: #include "maths/MedianFilter.h" Chris@166: Chris@166: #include Chris@166: Chris@166: #define BOOST_TEST_DYN_LINK Chris@166: #define BOOST_TEST_MAIN Chris@166: Chris@166: #include Chris@166: Chris@166: BOOST_AUTO_TEST_SUITE(TestMedianFilter) Chris@166: Chris@166: BOOST_AUTO_TEST_CASE(odd) Chris@166: { Chris@166: // A median filter of size N always retains a pool of N elements, Chris@166: // which start out all-zero. So the output median will remain zero Chris@166: // until N/2 elements have been pushed. Chris@166: MedianFilter f(3); Chris@166: f.push(1); // 0 0 1 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(-3); // 0 1 -3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(5); // 1 -3 5 Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: f.push(7); // -3 5 7 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // 5 7 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // 7 3 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 3); Chris@166: } Chris@166: Chris@166: BOOST_AUTO_TEST_CASE(even) Chris@166: { Chris@166: // Our median does not halve the difference (should it??), it just Chris@166: // returns the next element from the input set Chris@166: MedianFilter f(4); Chris@166: f.push(1); // 0 0 0 1 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(-3); // 0 0 1 -3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(5); // 0 1 -3 5 Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: f.push(7); // 1 -3 5 7 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // -3 5 7 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // 5 7 3 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: } Chris@166: Chris@166: BOOST_AUTO_TEST_CASE(odd75) Chris@166: { Chris@166: MedianFilter f(5, 75.f); Chris@166: f.push(1); // 0 0 0 0 1 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(-3); // 0 0 0 1 -3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 0); Chris@166: f.push(5); // 0 0 1 -3 5 Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: f.push(7); // 0 1 -3 5 7 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // 0 -3 5 7 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(3); // 0 5 7 3 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: } Chris@166: Chris@166: BOOST_AUTO_TEST_CASE(even75) Chris@166: { Chris@166: MedianFilter f(4, 75.f); Chris@166: f.push(1); // 0 0 0 1 Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: f.push(-3); // 0 0 1 -3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 1); Chris@166: f.push(5); // 0 1 -3 5 Chris@166: BOOST_CHECK_EQUAL(f.get(), 5); Chris@166: f.push(7); // 1 -3 5 7 Chris@166: BOOST_CHECK_EQUAL(f.get(), 7); Chris@166: BOOST_CHECK_EQUAL(f.get(), 7); Chris@166: f.push(3); // -3 5 7 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 7); Chris@166: f.push(3); // 5 7 3 3 Chris@166: BOOST_CHECK_EQUAL(f.get(), 7); Chris@166: } Chris@166: Chris@166: BOOST_AUTO_TEST_SUITE_END() Chris@166: Chris@166: