• Main Page
  • Classes
  • Files
  • File List
  • File Members

fft.cpp

Go to the documentation of this file.
00001 #include "fft.hpp"
00002 #include <cassert>
00003 
00004 namespace
00005 {
00007     int smallprimes(int x)
00008     {
00009         int p[3] = {2, 3, 5};
00010         for (int i = 0; i < 3; ++i)
00011             while (x%p[i] == 0)
00012                 x /= p[i];
00013         return x;
00014     }
00015 
00017     int padded_size(int x)
00018     {
00019         while (smallprimes(x)!=1)
00020             x++;
00021 
00022         return x;
00023     }
00024 }
00025 
00026 complex_vec padded_FFT(real_vec& in)
00027 {
00028     assert(in.size() > 0);
00029     const size_t n = in.size();
00030     const size_t padded = n > 256 ? padded_size(n) : n;
00031     in.resize(padded);
00032 
00033     complex_vec out(padded/2+1);
00034 
00035     fftwf_plan plan = fftwf_plan_dft_r2c_1d(padded,
00036             &in[0], (fftwf_complex*)&out[0], FFTW_ESTIMATE);
00037     fftwf_execute(plan);
00038     fftwf_destroy_plan(plan);
00039 
00040     in.resize(n);
00041     return out;
00042 }
00043 
00044 real_vec padded_IFFT(complex_vec& in)
00045 {
00046     assert(in.size() > 1);
00047     const size_t n = (in.size()-1)*2;
00048     const size_t padded = n > 256 ? padded_size(n) : n;
00049     in.resize(padded/2+1);
00050 
00051     real_vec out(padded);
00052 
00053     // note: fftw3 destroys the input array for c2r transform
00054     fftwf_plan plan = fftwf_plan_dft_c2r_1d(padded,
00055             (fftwf_complex*)&in[0], &out[0], FFTW_ESTIMATE);
00056     fftwf_execute(plan);
00057     fftwf_destroy_plan(plan);
00058 
00059     in.resize(n/2+1);
00060     return out;
00061 }

Generated by  doxygen 1.7.1