00001
00002
00004 #ifndef __fft__
00005 #define __fft__
00006
00007 #include "CUtils.h"
00008
00009
00010 #ifdef __CINT__
00011 typedef struct {char a[7];} __float128;
00012 #endif
00013
00014 #include "fftw3.h"
00015
00016 using namespace std;
00017
00018
00024 class fft {
00025
00026 public:
00027
00045 fft(const int aSize_t, const string aPlan = "FFTW_ESTIMATE", const string aType="c2c");
00046
00050 virtual ~fft(void);
00058 inline void Forward(void){ fftw_execute(FFT_Forward); };
00059
00063 inline void Backward(void){ fftw_execute(FFT_Backward); };
00064
00072 bool Forward(double *aRe_t, double *aIm_t);
00073
00079 bool Forward(double *aRe_t);
00080
00087 bool Backward(double *aRe_f, double *aIm_f);
00088
00094 bool Backward(double *aRe_f);
00095
00100 inline double GetNorm2_f(const int aIndex){
00101 return x_f[aIndex][0]*x_f[aIndex][0] + x_f[aIndex][1]*x_f[aIndex][1];
00102 };
00103
00108 inline double GetNorm2_t(const int aIndex){
00109 if(fType) return xc_t[aIndex][0]*xc_t[aIndex][0] + xc_t[aIndex][1]*xc_t[aIndex][1];
00110 return xr_t[aIndex]*xr_t[aIndex];
00111 };
00112
00117 inline double GetNorm_f(const int aIndex){
00118 return sqrt(GetNorm2_f(aIndex));
00119 };
00120
00126 inline double GetNorm_t(const int aIndex){
00127 return sqrt(GetNorm2_t(aIndex));
00128 };
00129
00134 inline double GetRe_f(const int aIndex){
00135 return x_f[aIndex][0];
00136 };
00137
00142 inline double GetRe_t(const int aIndex){
00143 if(fType) return xc_t[aIndex][0];
00144 return xr_t[aIndex];
00145 };
00146
00151 inline double GetIm_f(const int aIndex){
00152 return x_f[aIndex][1];
00153 };
00154
00159 inline double GetIm_t(const int aIndex){
00160 if(fType) return xc_t[aIndex][1];
00161 return 0.0;
00162 };
00163
00168 inline double GetPhase_f(const int aIndex){
00169 return atan2(x_f[aIndex][1], x_f[aIndex][0]);
00170 };
00171
00176 inline double GetPhase_t(const int aIndex){
00177 if(fType) return atan2(xc_t[aIndex][1], xc_t[aIndex][0]);
00178 else return 0.0;
00179 };
00180
00186 double* GetNorm2_f(const double aNorm=1.0);
00187
00193 double* GetNorm2_t(const double aNorm=1.0);
00194
00200 double* GetNorm_f(const double aNorm=1.0);
00201
00207 double* GetNorm_t(const double aNorm=1.0);
00208
00214 double* GetRe_f(const double aNorm=1.0);
00215
00221 double* GetRe_t(const double aNorm=1.0);
00222
00228 double* GetIm_f(const double aNorm=1.0);
00229
00235 double* GetIm_t(const double aNorm=1.0);
00236
00241 double* GetPhase_f(void);
00242
00247 double* GetPhase_t(void);
00248
00252 inline int GetSize_t(void){ return fSize_t; };
00253
00257 inline int GetSize_f(void){ return fSize_f; };
00258
00264 inline void SetRe_t(const int aIndex, const double aValue){
00265 if(fType) xc_t[aIndex][0]=aValue;
00266 else xr_t[aIndex]=aValue;
00267 };
00268
00274 inline void SetIm_t(const int aIndex, const double aValue){
00275 xc_t[aIndex][1]=aValue;
00276 };
00277
00283 inline void SetRe_f(const int aIndex, const double aValue){
00284 x_f[aIndex][0]=aValue;
00285 };
00286
00292 inline void SetIm_f(const int aIndex, const double aValue){
00293 x_f[aIndex][1]=aValue;
00294 };
00295
00296
00297 private:
00298 int fSize_t;
00299 int fSize_f;
00300 string fPlan;
00301 bool fType;
00302
00303 fftw_complex* xc_t;
00304 double* xr_t;
00305 fftw_complex* x_f;
00306 fftw_plan FFT_Forward;
00307 fftw_plan FFT_Backward;
00308
00309 };
00310
00311 #endif