comparison tests/TestFFT.cpp @ 129:6ec45e85ed81 kissfft

Drop in kissfft to replace the "old" fft, and add tests for newly-supported sizes
author Chris Cannam
date Tue, 15 Oct 2013 11:38:18 +0100
parents 4920d100b290
children 8d2d04f2fb51
comparison
equal deleted inserted replaced
128:5023f521732c 129:6ec45e85ed81
4 4
5 #define BOOST_TEST_DYN_LINK 5 #define BOOST_TEST_DYN_LINK
6 #define BOOST_TEST_MAIN 6 #define BOOST_TEST_MAIN
7 7
8 #include <boost/test/unit_test.hpp> 8 #include <boost/test/unit_test.hpp>
9
10 #include <stdexcept>
9 11
10 BOOST_AUTO_TEST_SUITE(TestFFT) 12 BOOST_AUTO_TEST_SUITE(TestFFT)
11 13
12 #define COMPARE_CONST(a, n) \ 14 #define COMPARE_CONST(a, n) \
13 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ 15 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
314 im[3] = 999; 316 im[3] = 999;
315 FFTReal(4).inverse(re, im, back); 317 FFTReal(4).inverse(re, im, back);
316 COMPARE_ARRAY(back, in); 318 COMPARE_ARRAY(back, in);
317 } 319 }
318 320
321 BOOST_AUTO_TEST_CASE(sizes)
322 {
323 // Complex supports any size. A single test with an odd size
324 // will do here, without getting too much into our expectations
325 // about supported butterflies etc
326
327 double in[] = { 1, 1, 1 };
328 double re[] = { 999, 999, 999 };
329 double im[] = { 999, 999, 999 };
330 FFT(3).process(false, in, 0, re, im);
331 BOOST_CHECK_EQUAL(re[0], 3.0);
332 BOOST_CHECK_EQUAL(re[1], 0.0);
333 BOOST_CHECK_EQUAL(re[2], 0.0);
334 COMPARE_CONST(im, 0.0);
335 double back[3];
336 double backim[3];
337 FFT(3).process(true, re, im, back, backim);
338 COMPARE_ARRAY(back, in);
339 COMPARE_CONST(backim, 0.0);
340 }
341
342 BOOST_AUTO_TEST_CASE(r_sizes)
343 {
344 // Real supports any even size, but not odd ones
345
346 BOOST_CHECK_THROW(FFTReal r(3), std::invalid_argument);
347
348 double in[] = { 1, 1, 1, 1, 1, 1 };
349 double re[] = { 999, 999, 999, 999, 999, 999 };
350 double im[] = { 999, 999, 999, 999, 999, 999 };
351 FFTReal(6).forward(in, re, im);
352 BOOST_CHECK_EQUAL(re[0], 6.0);
353 BOOST_CHECK_EQUAL(re[1], 0.0);
354 BOOST_CHECK_EQUAL(re[2], 0.0);
355 BOOST_CHECK_EQUAL(re[3], 0.0);
356 BOOST_CHECK_EQUAL(re[4], 0.0);
357 BOOST_CHECK_EQUAL(re[5], 0.0);
358 COMPARE_CONST(im, 0.0);
359 double back[6];
360 FFTReal(6).inverse(re, im, back);
361 COMPARE_ARRAY(back, in);
362 }
363
319 BOOST_AUTO_TEST_SUITE_END() 364 BOOST_AUTO_TEST_SUITE_END()
320 365