00001 /* Copyright 2001,2002 Matt Flax <flatmax@ieee.org> 00002 This file is part of the MFFM FFTw Wrapper library. 00003 00004 MFFM MFFM FFTw Wrapper library is free software; you can 00005 redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 MFFM FFTw Wrapper library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You have received a copy of the GNU General Public License 00016 along with the MFFM FFTw Wrapper library 00017 */ 00018 #ifndef COMPLEXFFT_H_ 00019 #define COMPLEXFFT_H_ 00020 00021 #include <fftw3.h> 00022 00023 #ifndef fftw_real 00024 #define fftw_real double 00025 #endif 00026 #define c_re(c) ((c)[0]) 00027 #define c_im(c) ((c)[1]) 00028 00029 #include <iomanip> 00030 using namespace std; 00031 00032 #define PLANTYPE FFTW_ESTIMATE 00033 00034 /// class complexFFTData controls and manipulates complex fft data 00035 class complexFFTData { 00036 public: 00037 /// Specifies the size of the data array 00038 int size; 00039 /// the input and output arrays 00040 fftw_complex *in, *out; 00041 /// the power_spectrum array 00042 fftw_real *power_spectrum; 00043 /// The total power (summed) of the power spectrum as used in the method compPowerSpec 00044 double totalPower; 00045 00046 /// Constructor with all memory to be allocated internally 00047 complexFFTData(int sz); 00048 /// Deconstructor 00049 ~complexFFTData(void); 00050 00051 /// Use this to change associated fft data (for fft'ing) 00052 void switchData(complexFFTData *d); 00053 00054 /// Limits the maximum to 'lim' and returns the last fft bin with max 00055 int limitHalfPowerSpec(double lim); 00056 00057 /// Returns the number of elements in the input and output arrays 00058 int getSize(){return size;} 00059 // int getHalfSize(){ if (!(size%2)) return size/2; else return size/2+1;} 00060 00061 /// This function computes the power spectrum and returns the max bin 00062 int compPowerSpec(); 00063 // int powerSpecDeriv(); // Find the derivative of the power spectrum 00064 }; 00065 00066 ///class complexFFT controls fftw plans and executes fwd/inv transforms 00067 class complexFFT { 00068 /// The fwd/inv plans 00069 fftw_plan fwdPlan, invPlan; 00070 /// Method to create the plans 00071 void createPlan(void); 00072 /// Method to destroy the plans 00073 void destroyPlan(void); 00074 protected: 00075 // int size; 00076 /// The pointer to the relevant data 00077 complexFFTData *data; 00078 public: 00079 00080 // complexFFT(int sz, char *ws=NULL); 00081 /// fft init ... data pointed to by 'd' 00082 complexFFT(complexFFTData *d); 00083 /// fft deconstructor 00084 ~complexFFT(); 00085 00086 /// Use this to change associated fft data (for fft'ing) 00087 void switchData(complexFFTData *d); 00088 00089 /// Forward transform the data (in to out) 00090 void fwdTransform(); // Forward fft 00091 /// Inverse transform the data (out to in) 00092 void invTransform(); // Inverse fft 00093 }; 00094 /** \example complexFFTExample.cc 00095 * This is an example of how to use the class. 00096 */ 00097 #endif // COMPLEXFFT_H_