Mercurial > hg > qm-dsp
changeset 166:36bcde3c13d8
Median filter test
author | Chris Cannam |
---|---|
date | Mon, 07 Apr 2014 13:43:48 +0100 |
parents | ec9f5b9801bd |
children | a82362d50144 |
files | tests/Makefile tests/TestMedianFilter.cpp |
diffstat | 2 files changed, 103 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/Makefile Fri Apr 04 13:49:59 2014 +0100 +++ b/tests/Makefile Mon Apr 07 13:43:48 2014 +0100 @@ -2,16 +2,19 @@ CFLAGS := -I.. $(CFLAGS) CXXFLAGS := -I.. -Wall -g $(CXXFLAGS) -LDFLAGS := $(LDFLAGS) -lboost_unit_test_framework +LDFLAGS := $(LDFLAGS) -lboost_unit_test_framework -lpthread LIBS := ../libqm-dsp.a -TESTS := test-mathutilities test-window test-fft test-pvoc test-resampler +TESTS := test-mathutilities test-window test-fft test-pvoc test-resampler test-medianfilter #VG := valgrind all: $(TESTS) for t in $(TESTS); do echo "Running $$t"; $(VG) ./"$$t" || exit 1; done +test-medianfilter: TestMedianFilter.o $(LIBS) + $(CXX) -o $@ $^ $(LDFLAGS) + test-mathutilities: TestMathUtilities.o $(LIBS) $(CXX) -o $@ $^ $(LDFLAGS) @@ -28,6 +31,7 @@ $(CXX) -o $@ $^ $(LDFLAGS) TestMathUtilities.o: $(LIBS) +TestMedianFilter.o: $(LIBS) TestWindow.o: $(LIBS) TestFFT.o: $(LIBS) TestPhaseVocoder.o: $(LIBS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/TestMedianFilter.cpp Mon Apr 07 13:43:48 2014 +0100 @@ -0,0 +1,97 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +#include "maths/MedianFilter.h" + +#include <cmath> + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MAIN + +#include <boost/test/unit_test.hpp> + +BOOST_AUTO_TEST_SUITE(TestMedianFilter) + +BOOST_AUTO_TEST_CASE(odd) +{ + // A median filter of size N always retains a pool of N elements, + // which start out all-zero. So the output median will remain zero + // until N/2 elements have been pushed. + MedianFilter<double> f(3); + f.push(1); // 0 0 1 + BOOST_CHECK_EQUAL(f.get(), 0); + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(-3); // 0 1 -3 + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(5); // 1 -3 5 + BOOST_CHECK_EQUAL(f.get(), 1); + f.push(7); // -3 5 7 + BOOST_CHECK_EQUAL(f.get(), 5); + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // 5 7 3 + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // 7 3 3 + BOOST_CHECK_EQUAL(f.get(), 3); +} + +BOOST_AUTO_TEST_CASE(even) +{ + // Our median does not halve the difference (should it??), it just + // returns the next element from the input set + MedianFilter<double> f(4); + f.push(1); // 0 0 0 1 + BOOST_CHECK_EQUAL(f.get(), 0); + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(-3); // 0 0 1 -3 + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(5); // 0 1 -3 5 + BOOST_CHECK_EQUAL(f.get(), 1); + f.push(7); // 1 -3 5 7 + BOOST_CHECK_EQUAL(f.get(), 5); + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // -3 5 7 3 + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // 5 7 3 3 + BOOST_CHECK_EQUAL(f.get(), 5); +} + +BOOST_AUTO_TEST_CASE(odd75) +{ + MedianFilter<double> f(5, 75.f); + f.push(1); // 0 0 0 0 1 + BOOST_CHECK_EQUAL(f.get(), 0); + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(-3); // 0 0 0 1 -3 + BOOST_CHECK_EQUAL(f.get(), 0); + f.push(5); // 0 0 1 -3 5 + BOOST_CHECK_EQUAL(f.get(), 1); + f.push(7); // 0 1 -3 5 7 + BOOST_CHECK_EQUAL(f.get(), 5); + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // 0 -3 5 7 3 + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(3); // 0 5 7 3 3 + BOOST_CHECK_EQUAL(f.get(), 5); +} + +BOOST_AUTO_TEST_CASE(even75) +{ + MedianFilter<double> f(4, 75.f); + f.push(1); // 0 0 0 1 + BOOST_CHECK_EQUAL(f.get(), 1); + BOOST_CHECK_EQUAL(f.get(), 1); + f.push(-3); // 0 0 1 -3 + BOOST_CHECK_EQUAL(f.get(), 1); + f.push(5); // 0 1 -3 5 + BOOST_CHECK_EQUAL(f.get(), 5); + f.push(7); // 1 -3 5 7 + BOOST_CHECK_EQUAL(f.get(), 7); + BOOST_CHECK_EQUAL(f.get(), 7); + f.push(3); // -3 5 7 3 + BOOST_CHECK_EQUAL(f.get(), 7); + f.push(3); // 5 7 3 3 + BOOST_CHECK_EQUAL(f.get(), 7); +} + +BOOST_AUTO_TEST_SUITE_END() + +