# HG changeset patch # User Chris Cannam # Date 1383325910 0 # Node ID 279991b6ebe7d1af2665764718d017353d2859dc # Parent a96ea7f01a431f2818338956bdff72c400889bf2 Complex fft tests diff -r a96ea7f01a43 -r 279991b6ebe7 tests/TestFFT.cpp --- a/tests/TestFFT.cpp Fri Nov 01 15:32:05 2013 +0000 +++ b/tests/TestFFT.cpp Fri Nov 01 17:11:50 2013 +0000 @@ -121,6 +121,29 @@ COMPARE_ARRAY(back, in); } +BOOST_AUTO_TEST_CASE(c_dc) +{ + // DC-only signal. The DC bin is purely real + double rin[] = { 1, 1, 1, 1 }; + double iin[] = { 1, 1, 1, 1 }; + double re[] = { 999, 999, 999, 999 }; + double im[] = { 999, 999, 999, 999 }; + FFT(4).process(false, rin, iin, re, im); + BOOST_CHECK_EQUAL(re[0], 4.0); + BOOST_CHECK_EQUAL(re[1], 0.0); + BOOST_CHECK_EQUAL(re[2], 0.0); + BOOST_CHECK_EQUAL(re[3], 0.0); + BOOST_CHECK_EQUAL(im[0], 4.0); + BOOST_CHECK_EQUAL(im[1], 0.0); + BOOST_CHECK_EQUAL(im[2], 0.0); + BOOST_CHECK_EQUAL(im[3], 0.0); + double back[4]; + double backim[4]; + FFT(4).process(true, re, im, back, backim); + COMPARE_ARRAY(back, rin); + COMPARE_ARRAY(backim, iin); +} + BOOST_AUTO_TEST_CASE(sine) { // Sine. Output is purely imaginary @@ -198,6 +221,29 @@ FFTReal(4).inverse(re, im, back); COMPARE_ARRAY(back, in); } + +BOOST_AUTO_TEST_CASE(c_cosine) +{ + // Cosine. Output is purely real + double rin[] = { 1, 0, -1, 0 }; + double iin[] = { 1, 0, -1, 0 }; + double re[] = { 999, 999, 999, 999 }; + double im[] = { 999, 999, 999, 999 }; + FFT(4).process(false, rin, iin, re, im); + BOOST_CHECK_EQUAL(re[0], 0.0); + BOOST_CHECK_EQUAL(re[1], 2.0); + BOOST_CHECK_EQUAL(re[2], 0.0); + BOOST_CHECK_EQUAL(re[3], 2.0); + BOOST_CHECK_EQUAL(im[0], 0.0); + BOOST_CHECK_EQUAL(im[1], 2.0); + BOOST_CHECK_EQUAL(im[2], 0.0); + BOOST_CHECK_EQUAL(im[3], 2.0); + double back[4]; + double backim[4]; + FFT(4).process(true, re, im, back, backim); + COMPARE_ARRAY(back, rin); + COMPARE_ARRAY(backim, iin); +} BOOST_AUTO_TEST_CASE(sineCosine) { @@ -243,6 +289,25 @@ FFTReal(4).inverse(re, im, back); COMPARE_ARRAY(back, in); } + +BOOST_AUTO_TEST_CASE(c_sineCosine) +{ + double rin[] = { 1, 0, -1, 0 }; + double iin[] = { 0, 1, 0, -1 }; + double re[] = { 999, 999, 999, 999 }; + double im[] = { 999, 999, 999, 999 }; + FFT(4).process(false, rin, iin, re, im); + BOOST_CHECK_EQUAL(re[0], 0.0); + BOOST_CHECK_EQUAL(re[1], 4.0); + BOOST_CHECK_EQUAL(re[2], 0.0); + BOOST_CHECK_EQUAL(re[3], 0.0); + COMPARE_CONST(im, 0.0); + double back[4]; + double backim[4]; + FFT(4).process(true, re, im, back, backim); + COMPARE_ARRAY(back, rin); + COMPARE_ARRAY(backim, iin); +} BOOST_AUTO_TEST_CASE(nyquist) {