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
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 }