1 #ifndef FFTWTRANSFORM_HPP
2 #define FFTWTRANSFORM_HPP 1
7 #include <boost/range.hpp>
12 #define FFTWTRANSFORM_USE_INIT 1
153 namespace Transform {
158 fftw_plan forwardPlan;
159 fftw_plan inversePlan;
172 template <
typename Iterator1,
typename Iterator2>
174 init_ (Iterator1 first1, Iterator1 last1, Iterator2 first2)
176 forwardPlan = fftw_plan_dft_r2c_1d (std::distance(first1, last1)
178 , reinterpret_cast<fftw_complex*>(&(*first2))
181 inversePlan = fftw_plan_dft_c2r_1d ( std::distance(first1, last1)
182 , reinterpret_cast<fftw_complex*>(&(*first2))
184 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT);
215 template <
typename Iterator1,
typename Iterator2>
217 #ifndef FFTWTRANSFORM_USE_INIT
218 : forwardPlan( fftw_plan_dft_r2c_1d ( std::distance(first1, last1)
220 , reinterpret_cast<fftw_complex*>(&(*first2))
222 , inversePlan( fftw_plan_dft_c2r_1d ( std::distance(first1, last1)
223 , reinterpret_cast<fftw_complex*>(&(*first2))
225 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT) )
230 init_(first1, last1, first2);
236 template <
typename RandomAccessRange1,
typename RandomAccessRange2>
238 #ifndef FFTWTRANSFORM_USE_INIT
239 : forwardPlan( fftw_plan_dft_r2c_1d ( boost::distance(range1)
240 , &(*boost::begin(range1))
241 , reinterpret_cast<fftw_complex*>(&(*boost::begin(range2)))
243 , inversePlan( fftw_plan_dft_c2r_1d ( boost::distance(range1)
244 , reinterpret_cast<fftw_complex*>(&(*boost::begin(range2)))
245 , &(*boost::begin(range1))
246 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT) )
250 init_(boost::begin(range1), boost::end(range1), boost::begin(range2));
257 fftw_destroy_plan(forwardPlan);
258 fftw_destroy_plan(inversePlan);
262 exec_transform (
void)
264 fftw_execute(forwardPlan);
268 exec_inverse_transform (
void)
270 fftw_execute(inversePlan);
282 fftw_complex* first_;
288 fftw_plan forwardPlan;
289 fftw_plan inversePlan;
302 template <
typename Iterator1,
typename Iterator2>
304 init_ (Iterator1 first1, Iterator1 last1, Iterator2 first2)
307 length_ = std::distance(first1, last1);
308 last_ = &(*(first2 + length_ / 2 + 1));
310 forwardPlan = fftw_plan_dft_r2c_1d ( length_
316 inversePlan = fftw_plan_dft_c2r_1d ( length_
320 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT);
353 template <
typename Iterator1,
typename Iterator2>
355 #ifndef FFTWTRANSFORM_USE_INIT
357 , length_(std::distance(first1, last1))
358 , last_(first_ + length_ / 2 + 1)
359 , forwardPlan( fftw_plan_dft_r2c_1d ( length_
364 , inversePlan( fftw_plan_dft_c2r_1d ( length_
368 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT) )
373 init_(first1, last1, first2);
379 template <
typename RandomAccessRange1,
typename RandomAccessRange2>
381 #ifndef FFTWTRANSFORM_USE_INIT
382 : first_(boost::begin(range2))
383 , length_(boost::distance(range1))
384 , last_(boost::end(range2))
385 , forwardPlan( fftw_plan_dft_r2c_1d ( length_
386 , &(*boost::begin(range1))
390 , inversePlan( fftw_plan_dft_c2r_1d ( length_
393 , &(*boost::begin(range1))
394 , FFTW_ESTIMATE | FFTW_PRESERVE_INPUT) )
398 init_(boost::begin(range1), boost::end(range1), boost::begin(range2));
405 fftw_destroy_plan(forwardPlan);
406 fftw_destroy_plan(inversePlan);
410 exec_transform (
void)
412 fftw_execute(forwardPlan);
416 exec_inverse_transform (
void)
418 fftw_execute(inversePlan);
425 for (
auto iter (first_); iter != last_; ++iter) {
426 (*iter)[0] /= double(length_);
427 (*iter)[1] /= double(length_);