Mercurial > hg > qm-dsp
comparison tests/TestFilter.cpp @ 192:3780b91297ea
Add filter test
author | Chris Cannam |
---|---|
date | Wed, 07 Oct 2015 10:07:30 +0100 |
parents | |
children | ca658c7215a9 |
comparison
equal
deleted
inserted
replaced
191:857ca50ca25f | 192:3780b91297ea |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 #include "dsp/signalconditioning/Filter.h" | |
4 | |
5 #define BOOST_TEST_DYN_LINK | |
6 #define BOOST_TEST_MAIN | |
7 | |
8 #include <boost/test/unit_test.hpp> | |
9 | |
10 #include <stdexcept> | |
11 | |
12 using namespace std; | |
13 | |
14 BOOST_AUTO_TEST_SUITE(TestFilter) | |
15 | |
16 static vector<double> in { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; | |
17 | |
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 }; | |
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 }; | |
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 }; | |
21 | |
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 }; | |
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 }; | |
24 | |
25 BOOST_AUTO_TEST_CASE(iir) | |
26 { | |
27 vector<double> a(iir_a); | |
28 vector<double> b(iir_b); | |
29 vector<double> expected(iir_expected); | |
30 | |
31 FilterConfig config { a.size()-1, a.data(), b.data() }; | |
32 Filter f(config); | |
33 | |
34 int n = expected.size(); | |
35 vector<double> out(n, 0.0); | |
36 | |
37 f.process(in.data(), out.data(), n); | |
38 | |
39 double thresh = 1e-12; | |
40 | |
41 for (int i = 0; i < n; ++i) { | |
42 BOOST_CHECK_SMALL(out[i] - expected[i], thresh); | |
43 } | |
44 } | |
45 | |
46 BOOST_AUTO_TEST_CASE(iir_chunked) | |
47 { | |
48 vector<double> a(iir_a); | |
49 vector<double> b(iir_b); | |
50 vector<double> expected(iir_expected); | |
51 | |
52 FilterConfig config { a.size()-1, a.data(), b.data() }; | |
53 Filter f(config); | |
54 | |
55 int n = expected.size(); | |
56 vector<double> out(n, 0.0); | |
57 | |
58 int j = 0; | |
59 int i = 0; | |
60 while (j < n) { | |
61 if (++i == 4) { | |
62 i = 1; | |
63 } | |
64 if (j + i >= n) { | |
65 i = n - j; | |
66 } | |
67 f.process(in.data() + j, out.data() + j, i); | |
68 j += i; | |
69 } | |
70 | |
71 double thresh = 1e-12; | |
72 | |
73 for (int i = 0; i < n; ++i) { | |
74 BOOST_CHECK_SMALL(out[i] - expected[i], thresh); | |
75 } | |
76 } | |
77 | |
78 BOOST_AUTO_TEST_CASE(fir) | |
79 { | |
80 vector<double> a(fir_b.size(), 0.0); //!!! | |
81 vector<double> b(fir_b); | |
82 vector<double> expected(fir_expected); | |
83 | |
84 FilterConfig config { b.size()-1, a.data(), b.data() }; | |
85 Filter f(config); | |
86 | |
87 int n = expected.size(); | |
88 vector<double> out(n, 0.0); | |
89 | |
90 f.process(in.data(), out.data(), n); | |
91 | |
92 double thresh = 1e-4; | |
93 | |
94 for (int i = 0; i < n; ++i) { | |
95 BOOST_CHECK_SMALL(out[i] - expected[i], thresh); | |
96 } | |
97 } | |
98 | |
99 BOOST_AUTO_TEST_SUITE_END() | |
100 |