Mercurial > hg > qm-dsp
comparison tests/TestWindow.cpp @ 110:87ad66aaed32
FFT and window tests
| author | Chris Cannam |
|---|---|
| date | Mon, 30 Sep 2013 16:50:38 +0100 |
| parents | |
| children | 469d234acb9e |
comparison
equal
deleted
inserted
replaced
| 109:627d364bbc82 | 110:87ad66aaed32 |
|---|---|
| 1 | |
| 2 #include "base/Window.h" | |
| 3 | |
| 4 #include <iostream> | |
| 5 | |
| 6 #define BOOST_TEST_DYN_LINK | |
| 7 #define BOOST_TEST_MAIN | |
| 8 | |
| 9 #include <boost/test/unit_test.hpp> | |
| 10 | |
| 11 BOOST_AUTO_TEST_SUITE(TestWindow) | |
| 12 | |
| 13 using std::cout; | |
| 14 using std::endl; | |
| 15 | |
| 16 #define COMPARE_ARRAY(a, b) \ | |
| 17 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ | |
| 18 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-4); \ | |
| 19 } | |
| 20 | |
| 21 void | |
| 22 testSymmetric(double *d, int n) | |
| 23 { | |
| 24 for (int i = 0; i <= n/2; ++i) { | |
| 25 BOOST_CHECK_CLOSE(d[i], d[n-i-1], 1e-10); | |
| 26 } | |
| 27 } | |
| 28 | |
| 29 BOOST_AUTO_TEST_CASE(periodic) | |
| 30 { | |
| 31 // We can't actually test whether a function is periodic, given | |
| 32 // only one cycle of it! But we can make sure that all but the | |
| 33 // first sample is symmetric, which is what a symmetric window | |
| 34 // becomes when generated in periodic mode | |
| 35 double d[9]; | |
| 36 for (int n = 8; n <= 9; ++n) { | |
| 37 for (int wt = (int)FirstWindow; wt <= (int)LastWindow; ++wt) { | |
| 38 for (int i = 0; i < n; ++i) d[i] = 1.0; | |
| 39 Window<double> w((WindowType)wt, n); | |
| 40 w.cut(d); | |
| 41 testSymmetric(d + 1, n - 1); | |
| 42 } | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 template <int N> | |
| 47 void testWindow(WindowType type, const double expected[N]) | |
| 48 { | |
| 49 double d[N]; | |
| 50 for (int i = 0; i < N; ++i) d[i] = 1.0; | |
| 51 Window<double> w(type, N); | |
| 52 w.cut(d); | |
| 53 COMPARE_ARRAY(d, expected); | |
| 54 } | |
| 55 | |
| 56 BOOST_AUTO_TEST_CASE(bartlett) | |
| 57 { | |
| 58 double e1[] = { 1 }; | |
| 59 testWindow<1>(BartlettWindow, e1); | |
| 60 | |
| 61 double e2[] = { 0, 0 }; | |
| 62 testWindow<2>(BartlettWindow, e2); | |
| 63 | |
| 64 double e3[] = { 0, 2./3., 2./3. }; | |
| 65 testWindow<3>(BartlettWindow, e3); | |
| 66 | |
| 67 double e4[] = { 0, 1./2., 1., 1./2. }; | |
| 68 testWindow<4>(BartlettWindow, e4); | |
| 69 | |
| 70 double e5[] = { 0, 1./2., 1., 1., 1./2. }; | |
| 71 testWindow<5>(BartlettWindow, e5); | |
| 72 | |
| 73 double e6[] = { 0, 1./3., 2./3., 1., 2./3., 1./3. }; | |
| 74 testWindow<6>(BartlettWindow, e6); | |
| 75 } | |
| 76 | |
| 77 BOOST_AUTO_TEST_CASE(hamming) | |
| 78 { | |
| 79 double e1[] = { 1 }; | |
| 80 testWindow<1>(HammingWindow, e1); | |
| 81 | |
| 82 double e10[] = { | |
| 83 0.0800, 0.1679, 0.3979, 0.6821, 0.9121, | |
| 84 1.0000, 0.9121, 0.6821, 0.3979, 0.1679 | |
| 85 }; | |
| 86 testWindow<10>(HammingWindow, e10); | |
| 87 } | |
| 88 | |
| 89 BOOST_AUTO_TEST_CASE(hann) | |
| 90 { | |
| 91 double e1[] = { 1 }; | |
| 92 testWindow<1>(HanningWindow, e1); | |
| 93 | |
| 94 double e10[] = { | |
| 95 0, 0.0955, 0.3455, 0.6545, 0.9045, | |
| 96 1.0000, 0.9045, 0.6545, 0.3455, 0.0955, | |
| 97 }; | |
| 98 testWindow<10>(HanningWindow, e10); | |
| 99 } | |
| 100 | |
| 101 BOOST_AUTO_TEST_CASE(blackman) | |
| 102 { | |
| 103 double e1[] = { 1 }; | |
| 104 testWindow<1>(BlackmanWindow, e1); | |
| 105 | |
| 106 double e10[] = { | |
| 107 0, 0.0402, 0.2008, 0.5098, 0.8492, | |
| 108 1.0000, 0.8492, 0.5098, 0.2008, 0.0402, | |
| 109 }; | |
| 110 testWindow<10>(BlackmanWindow, e10); | |
| 111 } | |
| 112 | |
| 113 BOOST_AUTO_TEST_SUITE_END() | |
| 114 |
