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()
+
+