comparison tests/TestFFT.cpp @ 159:8d2d04f2fb51

Complex fft tests
author Chris Cannam
date Fri, 01 Nov 2013 17:11:50 +0000
parents 6ec45e85ed81
children 8c86761a5533
comparison
equal deleted inserted replaced
158:9b91f770e7ba 159:8d2d04f2fb51
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 };