annotate tests/TestFilter.cpp @ 417:fa851e147e3f

Faster filter implementation with explicit FIR support
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 07 Oct 2015 10:36:09 +0100
parents 1f3244a6884c
children 2de6184b2ce0
rev   line source
c@416 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@416 2
c@416 3 #include "dsp/signalconditioning/Filter.h"
c@416 4
c@416 5 #define BOOST_TEST_DYN_LINK
c@416 6 #define BOOST_TEST_MAIN
c@416 7
c@416 8 #include <boost/test/unit_test.hpp>
c@416 9
c@416 10 #include <stdexcept>
c@416 11
c@416 12 using namespace std;
c@416 13
c@416 14 BOOST_AUTO_TEST_SUITE(TestFilter)
c@416 15
c@416 16 static vector<double> in { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
c@416 17
c@416 18 static vector<double> iir_a { 1,5.75501989315662,16.326056867468,28.779190797823,34.2874379215653,28.137815126537,15.6064643257793,5.37874515231553,0.913800050254382,0.0,0.0 };
c@416 19 static vector<double> iir_b { 0.0031954608137085,0.0180937089815597,0.0508407778575426,0.0895040074158415,0.107385387168148,0.0895040074158415,0.0508407778575426,0.0180937089815597,0.0031954608137085,0.0,0.0 };
c@416 20 static vector<double> iir_expected { 0.003195460813709, 0.006094690058282, 0.009370240771381, 0.012857578361690, 0.015328760300750, 0.019107809614909, 0.022257958968869, 0.024598034053011, 0.029106103380941, 0.031152166476509, 0.034424013713795, 0.038775350541015, 0.039924063374886, 0.044846280036012, 0.047614917256999, 0.049338485830505 };
c@416 21
c@416 22 static vector<double> fir_b { -1.5511e-18,-0.022664,1.047e-17,0.27398,0.49737,0.27398,1.047e-17,-0.022664,-1.5511e-18 };
c@416 23 static vector<double> fir_expected { -1.5511e-18,-0.022664,-0.045328,0.20599,0.95467,1.9773,3,4,5,6,7,8,9,10,11,12 };
c@416 24
c@416 25 BOOST_AUTO_TEST_CASE(iir)
c@416 26 {
c@416 27 vector<double> a(iir_a);
c@416 28 vector<double> b(iir_b);
c@416 29 vector<double> expected(iir_expected);
c@416 30
c@417 31 Filter f({ a, b });
c@416 32
c@416 33 int n = expected.size();
c@416 34 vector<double> out(n, 0.0);
c@416 35
c@416 36 f.process(in.data(), out.data(), n);
c@416 37
c@416 38 double thresh = 1e-12;
c@416 39
c@416 40 for (int i = 0; i < n; ++i) {
c@416 41 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
c@416 42 }
c@416 43 }
c@416 44
c@416 45 BOOST_AUTO_TEST_CASE(iir_chunked)
c@416 46 {
c@416 47 vector<double> a(iir_a);
c@416 48 vector<double> b(iir_b);
c@416 49 vector<double> expected(iir_expected);
c@416 50
c@417 51 Filter f({ a, b });
c@416 52
c@416 53 int n = expected.size();
c@416 54 vector<double> out(n, 0.0);
c@416 55
c@416 56 int j = 0;
c@416 57 int i = 0;
c@416 58 while (j < n) {
c@416 59 if (++i == 4) {
c@416 60 i = 1;
c@416 61 }
c@416 62 if (j + i >= n) {
c@416 63 i = n - j;
c@416 64 }
c@416 65 f.process(in.data() + j, out.data() + j, i);
c@416 66 j += i;
c@416 67 }
c@416 68
c@416 69 double thresh = 1e-12;
c@416 70
c@416 71 for (int i = 0; i < n; ++i) {
c@416 72 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
c@416 73 }
c@416 74 }
c@416 75
c@416 76 BOOST_AUTO_TEST_CASE(fir)
c@416 77 {
c@416 78 vector<double> b(fir_b);
c@416 79 vector<double> expected(fir_expected);
c@416 80
c@417 81 Filter f({ {}, b });
c@416 82
c@416 83 int n = expected.size();
c@416 84 vector<double> out(n, 0.0);
c@416 85
c@416 86 f.process(in.data(), out.data(), n);
c@416 87
c@416 88 double thresh = 1e-4;
c@416 89
c@416 90 for (int i = 0; i < n; ++i) {
c@416 91 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
c@416 92 }
c@416 93 }
c@416 94
c@416 95 BOOST_AUTO_TEST_SUITE_END()
c@416 96