annotate tests/TestWindow.cpp @ 209:ccd2019190bf msvc

Some MSVC fixes, including (temporarily, probably) renaming the FFT source file to avoid getting it mixed up with the Vamp SDK one in our object dir
author Chris Cannam
date Thu, 01 Feb 2018 16:34:08 +0000
parents 152abaf17c62
children 2de6184b2ce0
rev   line source
Chris@118 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@110 2
Chris@110 3 #include "base/Window.h"
Chris@124 4 #include "base/KaiserWindow.h"
Chris@126 5 #include "base/SincWindow.h"
Chris@110 6
Chris@110 7 #include <iostream>
Chris@110 8
Chris@110 9 #define BOOST_TEST_DYN_LINK
Chris@110 10 #define BOOST_TEST_MAIN
Chris@110 11
Chris@110 12 #include <boost/test/unit_test.hpp>
Chris@110 13
Chris@110 14 BOOST_AUTO_TEST_SUITE(TestWindow)
Chris@110 15
Chris@110 16 using std::cout;
Chris@110 17 using std::endl;
Chris@110 18
Chris@110 19 #define COMPARE_ARRAY(a, b) \
Chris@110 20 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
Chris@110 21 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-4); \
Chris@110 22 }
Chris@110 23
Chris@110 24 void
Chris@110 25 testSymmetric(double *d, int n)
Chris@110 26 {
Chris@110 27 for (int i = 0; i <= n/2; ++i) {
Chris@110 28 BOOST_CHECK_CLOSE(d[i], d[n-i-1], 1e-10);
Chris@110 29 }
Chris@110 30 }
Chris@110 31
Chris@110 32 BOOST_AUTO_TEST_CASE(periodic)
Chris@110 33 {
Chris@110 34 // We can't actually test whether a function is periodic, given
Chris@110 35 // only one cycle of it! But we can make sure that all but the
Chris@110 36 // first sample is symmetric, which is what a symmetric window
Chris@110 37 // becomes when generated in periodic mode
Chris@110 38 double d[9];
Chris@110 39 for (int n = 8; n <= 9; ++n) {
Chris@110 40 for (int wt = (int)FirstWindow; wt <= (int)LastWindow; ++wt) {
Chris@110 41 for (int i = 0; i < n; ++i) d[i] = 1.0;
Chris@110 42 Window<double> w((WindowType)wt, n);
Chris@110 43 w.cut(d);
Chris@110 44 testSymmetric(d + 1, n - 1);
Chris@110 45 }
Chris@110 46 }
Chris@110 47 }
Chris@110 48
Chris@110 49 template <int N>
Chris@110 50 void testWindow(WindowType type, const double expected[N])
Chris@110 51 {
Chris@110 52 double d[N];
Chris@110 53 for (int i = 0; i < N; ++i) d[i] = 1.0;
Chris@110 54 Window<double> w(type, N);
Chris@110 55 w.cut(d);
Chris@110 56 COMPARE_ARRAY(d, expected);
Chris@111 57
Chris@111 58 double d0[N], d1[N];
Chris@111 59 for (int i = 0; i < N; ++i) d0[i] = 0.5 + (1.0 / (N * 2)) * (i + 1);
Chris@111 60 w.cut(d0, d1);
Chris@111 61 for (int i = 0; i < N; ++i) {
Chris@111 62 BOOST_CHECK_SMALL(d1[i] - d0[i] * expected[i], 1e-4);
Chris@111 63 }
Chris@110 64 }
Chris@110 65
Chris@110 66 BOOST_AUTO_TEST_CASE(bartlett)
Chris@110 67 {
Chris@110 68 double e1[] = { 1 };
Chris@110 69 testWindow<1>(BartlettWindow, e1);
Chris@110 70
Chris@110 71 double e2[] = { 0, 0 };
Chris@110 72 testWindow<2>(BartlettWindow, e2);
Chris@110 73
Chris@110 74 double e3[] = { 0, 2./3., 2./3. };
Chris@110 75 testWindow<3>(BartlettWindow, e3);
Chris@110 76
Chris@110 77 double e4[] = { 0, 1./2., 1., 1./2. };
Chris@110 78 testWindow<4>(BartlettWindow, e4);
Chris@110 79
Chris@110 80 double e5[] = { 0, 1./2., 1., 1., 1./2. };
Chris@110 81 testWindow<5>(BartlettWindow, e5);
Chris@110 82
Chris@110 83 double e6[] = { 0, 1./3., 2./3., 1., 2./3., 1./3. };
Chris@110 84 testWindow<6>(BartlettWindow, e6);
Chris@110 85 }
Chris@110 86
Chris@110 87 BOOST_AUTO_TEST_CASE(hamming)
Chris@110 88 {
Chris@110 89 double e1[] = { 1 };
Chris@110 90 testWindow<1>(HammingWindow, e1);
Chris@110 91
Chris@110 92 double e10[] = {
Chris@110 93 0.0800, 0.1679, 0.3979, 0.6821, 0.9121,
Chris@110 94 1.0000, 0.9121, 0.6821, 0.3979, 0.1679
Chris@110 95 };
Chris@110 96 testWindow<10>(HammingWindow, e10);
Chris@110 97 }
Chris@110 98
Chris@110 99 BOOST_AUTO_TEST_CASE(hann)
Chris@110 100 {
Chris@110 101 double e1[] = { 1 };
Chris@110 102 testWindow<1>(HanningWindow, e1);
Chris@110 103
Chris@110 104 double e10[] = {
Chris@110 105 0, 0.0955, 0.3455, 0.6545, 0.9045,
Chris@110 106 1.0000, 0.9045, 0.6545, 0.3455, 0.0955,
Chris@110 107 };
Chris@110 108 testWindow<10>(HanningWindow, e10);
Chris@110 109 }
Chris@110 110
Chris@110 111 BOOST_AUTO_TEST_CASE(blackman)
Chris@110 112 {
Chris@110 113 double e1[] = { 1 };
Chris@110 114 testWindow<1>(BlackmanWindow, e1);
Chris@110 115
Chris@110 116 double e10[] = {
Chris@110 117 0, 0.0402, 0.2008, 0.5098, 0.8492,
Chris@110 118 1.0000, 0.8492, 0.5098, 0.2008, 0.0402,
Chris@110 119 };
Chris@110 120 testWindow<10>(BlackmanWindow, e10);
Chris@110 121 }
Chris@157 122
Chris@157 123 BOOST_AUTO_TEST_CASE(blackmanHarris)
Chris@157 124 {
Chris@157 125 double e1[] = { 1 };
Chris@157 126 testWindow<1>(BlackmanHarrisWindow, e1);
Chris@157 127
Chris@157 128 double e10[] = {
Chris@157 129 0.0001, 0.0110, 0.1030, 0.3859, 0.7938,
Chris@157 130 1.0000, 0.7938, 0.3859, 0.1030, 0.0110,
Chris@157 131 };
Chris@157 132 testWindow<10>(BlackmanHarrisWindow, e10);
Chris@157 133 }
Chris@124 134
Chris@124 135 BOOST_AUTO_TEST_CASE(kaiser_4_10)
Chris@124 136 {
Chris@124 137 double d[10];
Chris@124 138 for (int i = 0; i < 10; ++i) d[i] = 1.0;
Chris@124 139 double e[] = {
Chris@124 140 0.0885, 0.2943, 0.5644, 0.8216, 0.9789,
Chris@124 141 0.9789, 0.8216, 0.5644, 0.2943, 0.0885
Chris@124 142 };
Chris@124 143 KaiserWindow::Parameters p;
Chris@124 144 p.length = 10;
Chris@124 145 p.beta = 4;
Chris@124 146 KaiserWindow k(p);
Chris@124 147 k.cut(d);
Chris@124 148 COMPARE_ARRAY(d, e);
Chris@124 149 }
Chris@110 150
Chris@124 151 BOOST_AUTO_TEST_CASE(kaiser_2p5_11)
Chris@124 152 {
Chris@124 153 double d[11];
Chris@124 154 for (int i = 0; i < 11; ++i) d[i] = 1.0;
Chris@124 155 double e[] = {
Chris@124 156 0.3040, 0.5005, 0.6929, 0.8546, 0.9622,
Chris@124 157 1.0000, 0.9622, 0.8546, 0.6929, 0.5005, 0.3040
Chris@124 158 };
Chris@124 159 KaiserWindow::Parameters p;
Chris@124 160 p.length = 11;
Chris@124 161 p.beta = 2.5;
Chris@124 162 KaiserWindow k(p);
Chris@124 163 k.cut(d);
Chris@124 164 COMPARE_ARRAY(d, e);
Chris@124 165 }
Chris@124 166
Chris@124 167 //!!! todo: tests for kaiser with attenuation and bandwidth parameters
Chris@126 168
Chris@126 169 template <int N>
Chris@126 170 void testSinc(double p, const double expected[N])
Chris@126 171 {
Chris@126 172 double d[N];
Chris@126 173 for (int i = 0; i < N; ++i) d[i] = 1.0;
Chris@126 174 SincWindow w(N, p);
Chris@126 175 w.cut(d);
Chris@126 176 COMPARE_ARRAY(d, expected);
Chris@126 177
Chris@126 178 double d0[N], d1[N];
Chris@126 179 for (int i = 0; i < N; ++i) d0[i] = 0.5 + (1.0 / (N * 2)) * (i + 1);
Chris@126 180 w.cut(d0, d1);
Chris@126 181 for (int i = 0; i < N; ++i) {
Chris@126 182 BOOST_CHECK_SMALL(d1[i] - d0[i] * expected[i], 1e-4);
Chris@126 183 }
Chris@126 184 }
Chris@126 185
Chris@126 186 BOOST_AUTO_TEST_CASE(sinc)
Chris@126 187 {
Chris@126 188 double e1[] = { 0, 0, 1, 0, 0 };
Chris@126 189 testSinc<5>(1, e1);
Chris@126 190
Chris@126 191 double e2[] = { 0, 0, 1, 0, 0 };
Chris@126 192 testSinc<5>(2, e2);
Chris@126 193
Chris@126 194 double e3[] = { -0.2122, 0.0, 0.6366, 1.0, 0.6366, 0, -0.2122 };
Chris@126 195 testSinc<7>(4, e3);
Chris@126 196
Chris@126 197 double e4[] = { -0.2122, 0, 0.6366, 1, 0.6366, 0 };
Chris@126 198 testSinc<6>(4, e4);
Chris@126 199 }
Chris@124 200
Chris@110 201 BOOST_AUTO_TEST_SUITE_END()
Chris@110 202