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@416
|
31 FilterConfig config { a.size()-1, a.data(), b.data() };
|
c@416
|
32 Filter f(config);
|
c@416
|
33
|
c@416
|
34 int n = expected.size();
|
c@416
|
35 vector<double> out(n, 0.0);
|
c@416
|
36
|
c@416
|
37 f.process(in.data(), out.data(), n);
|
c@416
|
38
|
c@416
|
39 double thresh = 1e-12;
|
c@416
|
40
|
c@416
|
41 for (int i = 0; i < n; ++i) {
|
c@416
|
42 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
|
c@416
|
43 }
|
c@416
|
44 }
|
c@416
|
45
|
c@416
|
46 BOOST_AUTO_TEST_CASE(iir_chunked)
|
c@416
|
47 {
|
c@416
|
48 vector<double> a(iir_a);
|
c@416
|
49 vector<double> b(iir_b);
|
c@416
|
50 vector<double> expected(iir_expected);
|
c@416
|
51
|
c@416
|
52 FilterConfig config { a.size()-1, a.data(), b.data() };
|
c@416
|
53 Filter f(config);
|
c@416
|
54
|
c@416
|
55 int n = expected.size();
|
c@416
|
56 vector<double> out(n, 0.0);
|
c@416
|
57
|
c@416
|
58 int j = 0;
|
c@416
|
59 int i = 0;
|
c@416
|
60 while (j < n) {
|
c@416
|
61 if (++i == 4) {
|
c@416
|
62 i = 1;
|
c@416
|
63 }
|
c@416
|
64 if (j + i >= n) {
|
c@416
|
65 i = n - j;
|
c@416
|
66 }
|
c@416
|
67 f.process(in.data() + j, out.data() + j, i);
|
c@416
|
68 j += i;
|
c@416
|
69 }
|
c@416
|
70
|
c@416
|
71 double thresh = 1e-12;
|
c@416
|
72
|
c@416
|
73 for (int i = 0; i < n; ++i) {
|
c@416
|
74 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
|
c@416
|
75 }
|
c@416
|
76 }
|
c@416
|
77
|
c@416
|
78 BOOST_AUTO_TEST_CASE(fir)
|
c@416
|
79 {
|
c@416
|
80 vector<double> a(fir_b.size(), 0.0); //!!!
|
c@416
|
81 vector<double> b(fir_b);
|
c@416
|
82 vector<double> expected(fir_expected);
|
c@416
|
83
|
c@416
|
84 FilterConfig config { b.size()-1, a.data(), b.data() };
|
c@416
|
85 Filter f(config);
|
c@416
|
86
|
c@416
|
87 int n = expected.size();
|
c@416
|
88 vector<double> out(n, 0.0);
|
c@416
|
89
|
c@416
|
90 f.process(in.data(), out.data(), n);
|
c@416
|
91
|
c@416
|
92 double thresh = 1e-4;
|
c@416
|
93
|
c@416
|
94 for (int i = 0; i < n; ++i) {
|
c@416
|
95 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
|
c@416
|
96 }
|
c@416
|
97 }
|
c@416
|
98
|
c@416
|
99 BOOST_AUTO_TEST_SUITE_END()
|
c@416
|
100
|