Mercurial > hg > qm-dsp
changeset 159:8d2d04f2fb51
Complex fft tests
author | Chris Cannam |
---|---|
date | Fri, 01 Nov 2013 17:11:50 +0000 |
parents | 9b91f770e7ba |
children | 0a47ec0a1a56 |
files | tests/TestFFT.cpp |
diffstat | 1 files changed, 65 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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) {