Mercurial > hg > qm-dsp
comparison tests/TestFFT.cpp @ 384:279991b6ebe7
Complex fft tests
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 01 Nov 2013 17:11:50 +0000 |
parents | 3c7338aff6a8 |
children | 8c86761a5533 |
comparison
equal
deleted
inserted
replaced
383:a96ea7f01a43 | 384:279991b6ebe7 |
---|---|
119 im[3] = 999; | 119 im[3] = 999; |
120 FFTReal(4).inverse(re, im, back); | 120 FFTReal(4).inverse(re, im, back); |
121 COMPARE_ARRAY(back, in); | 121 COMPARE_ARRAY(back, in); |
122 } | 122 } |
123 | 123 |
124 BOOST_AUTO_TEST_CASE(c_dc) | |
125 { | |
126 // DC-only signal. The DC bin is purely real | |
127 double rin[] = { 1, 1, 1, 1 }; | |
128 double iin[] = { 1, 1, 1, 1 }; | |
129 double re[] = { 999, 999, 999, 999 }; | |
130 double im[] = { 999, 999, 999, 999 }; | |
131 FFT(4).process(false, rin, iin, re, im); | |
132 BOOST_CHECK_EQUAL(re[0], 4.0); | |
133 BOOST_CHECK_EQUAL(re[1], 0.0); | |
134 BOOST_CHECK_EQUAL(re[2], 0.0); | |
135 BOOST_CHECK_EQUAL(re[3], 0.0); | |
136 BOOST_CHECK_EQUAL(im[0], 4.0); | |
137 BOOST_CHECK_EQUAL(im[1], 0.0); | |
138 BOOST_CHECK_EQUAL(im[2], 0.0); | |
139 BOOST_CHECK_EQUAL(im[3], 0.0); | |
140 double back[4]; | |
141 double backim[4]; | |
142 FFT(4).process(true, re, im, back, backim); | |
143 COMPARE_ARRAY(back, rin); | |
144 COMPARE_ARRAY(backim, iin); | |
145 } | |
146 | |
124 BOOST_AUTO_TEST_CASE(sine) | 147 BOOST_AUTO_TEST_CASE(sine) |
125 { | 148 { |
126 // Sine. Output is purely imaginary | 149 // Sine. Output is purely imaginary |
127 double in[] = { 0, 1, 0, -1 }; | 150 double in[] = { 0, 1, 0, -1 }; |
128 double re[] = { 999, 999, 999, 999 }; | 151 double re[] = { 999, 999, 999, 999 }; |
196 re[3] = 999; | 219 re[3] = 999; |
197 im[3] = 999; | 220 im[3] = 999; |
198 FFTReal(4).inverse(re, im, back); | 221 FFTReal(4).inverse(re, im, back); |
199 COMPARE_ARRAY(back, in); | 222 COMPARE_ARRAY(back, in); |
200 } | 223 } |
224 | |
225 BOOST_AUTO_TEST_CASE(c_cosine) | |
226 { | |
227 // Cosine. Output is purely real | |
228 double rin[] = { 1, 0, -1, 0 }; | |
229 double iin[] = { 1, 0, -1, 0 }; | |
230 double re[] = { 999, 999, 999, 999 }; | |
231 double im[] = { 999, 999, 999, 999 }; | |
232 FFT(4).process(false, rin, iin, re, im); | |
233 BOOST_CHECK_EQUAL(re[0], 0.0); | |
234 BOOST_CHECK_EQUAL(re[1], 2.0); | |
235 BOOST_CHECK_EQUAL(re[2], 0.0); | |
236 BOOST_CHECK_EQUAL(re[3], 2.0); | |
237 BOOST_CHECK_EQUAL(im[0], 0.0); | |
238 BOOST_CHECK_EQUAL(im[1], 2.0); | |
239 BOOST_CHECK_EQUAL(im[2], 0.0); | |
240 BOOST_CHECK_EQUAL(im[3], 2.0); | |
241 double back[4]; | |
242 double backim[4]; | |
243 FFT(4).process(true, re, im, back, backim); | |
244 COMPARE_ARRAY(back, rin); | |
245 COMPARE_ARRAY(backim, iin); | |
246 } | |
201 | 247 |
202 BOOST_AUTO_TEST_CASE(sineCosine) | 248 BOOST_AUTO_TEST_CASE(sineCosine) |
203 { | 249 { |
204 // Sine and cosine mixed | 250 // Sine and cosine mixed |
205 double in[] = { 0.5, 1, -0.5, -1 }; | 251 double in[] = { 0.5, 1, -0.5, -1 }; |
240 // check conjugates are reconstructed | 286 // check conjugates are reconstructed |
241 re[3] = 999; | 287 re[3] = 999; |
242 im[3] = 999; | 288 im[3] = 999; |
243 FFTReal(4).inverse(re, im, back); | 289 FFTReal(4).inverse(re, im, back); |
244 COMPARE_ARRAY(back, in); | 290 COMPARE_ARRAY(back, in); |
291 } | |
292 | |
293 BOOST_AUTO_TEST_CASE(c_sineCosine) | |
294 { | |
295 double rin[] = { 1, 0, -1, 0 }; | |
296 double iin[] = { 0, 1, 0, -1 }; | |
297 double re[] = { 999, 999, 999, 999 }; | |
298 double im[] = { 999, 999, 999, 999 }; | |
299 FFT(4).process(false, rin, iin, re, im); | |
300 BOOST_CHECK_EQUAL(re[0], 0.0); | |
301 BOOST_CHECK_EQUAL(re[1], 4.0); | |
302 BOOST_CHECK_EQUAL(re[2], 0.0); | |
303 BOOST_CHECK_EQUAL(re[3], 0.0); | |
304 COMPARE_CONST(im, 0.0); | |
305 double back[4]; | |
306 double backim[4]; | |
307 FFT(4).process(true, re, im, back, backim); | |
308 COMPARE_ARRAY(back, rin); | |
309 COMPARE_ARRAY(backim, iin); | |
245 } | 310 } |
246 | 311 |
247 BOOST_AUTO_TEST_CASE(nyquist) | 312 BOOST_AUTO_TEST_CASE(nyquist) |
248 { | 313 { |
249 double in[] = { 1, -1, 1, -1 }; | 314 double in[] = { 1, -1, 1, -1 }; |