17TEST_CASE(
"1D c2c FFT with FFTW, float",
"[math::ft]" )
21 SECTION(
"out-of-place, forward, default constructed, raw interface" )
23 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 1> fft;
30 fft( out.data(), in.data() );
32 float sin = in.abs2().sum();
33 float sout = out.abs2().sum() / out.rows();
36 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
39 SECTION(
"out-of-place, forward, default constructed, eigen interface" )
41 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 1> fft;
50 float sin = in.abs2().sum();
51 float sout = out.abs2().sum() / out.rows();
54 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
57 SECTION(
"out-of-place, forward, plan constructor" )
59 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 1> fft( 1024 );
66 float sin = in.abs2().sum();
67 float sout = out.abs2().sum() / out.rows();
70 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
73 SECTION(
"out-of-place, backward" )
82 float sin = in.abs2().sum() / in.rows();
83 float sout = out.abs2().sum();
86 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
89 SECTION(
"in-place, forward" )
96 float sin = in.abs2().sum();
100 float sout = in.abs2().sum() / in.rows();
102 float rmsdiff = ( in - incheck ).abs2().sum();
105 REQUIRE( rmsdiff > 0 );
108 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
111 SECTION(
"in-place, backward" )
120 float sin = in.abs2().sum();
124 float sout = in.abs2().sum() / in.rows();
126 float rmsdiff = ( in - incheck ).abs2().sum();
129 REQUIRE( rmsdiff > 0 );
132 REQUIRE_THAT( sin, Catch::Matchers::WithinRel( sout, 5e-6f ) );
144 SECTION(
"out-of-place, forward, default constructed, raw interface" )
146 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 2> fft;
148 fft.plan( 128, 128 );
153 fft( out.data(), in.data() );
155 float sin = in.abs2().sum() * ( out.rows() * out.cols() );
156 float sout = out.abs2().sum();
159 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );
162 SECTION(
"out-of-place, forward, default constructed, eigen interface" )
164 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 2> fft;
166 fft.plan( 128, 128 );
173 float sin = in.abs2().sum();
174 float sout = out.abs2().sum() / ( out.rows() * out.cols() );
177 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );
180 SECTION(
"out-of-place, forward, plan constructor" )
182 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 2> fft( 128, 128 );
190 float sin = in.abs2().sum();
191 float sout = out.abs2().sum() / ( in.rows() * out.cols() );
194 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );
197 SECTION(
"out-of-place, backward" )
206 float sin = in.abs2().sum() / ( in.rows() * in.cols() );
207 float sout = out.abs2().sum();
210 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );
213 SECTION(
"in-place, forward" )
215 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 2> fft( 128,
223 float sin = in.abs2().sum();
227 float sout = in.abs2().sum() / ( in.rows() * in.cols() );
229 float rmsdiff = ( in - incheck ).abs2().sum();
232 REQUIRE( rmsdiff > 0 );
235 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );
238 SECTION(
"in-place, backward" )
240 mx::math::ft::fftT<std::complex<float>, std::complex<float>, 2> fft( 128,
250 float sin = in.abs2().sum();
254 float sout = in.abs2().sum() / ( in.rows() * in.cols() );
256 float rmsdiff = ( in - incheck ).abs2().sum();
259 REQUIRE( rmsdiff > 0 );
262 REQUIRE_THAT( sin, Catch::Matchers::WithinAbs( sout, ( sin ) * ( 1e-3 ) ) );