00001 #ifndef qtsFFT_H 00002 #define qtsFFT_H 00003 00004 #include "PlotLine.h" 00005 00006 00007 class FFTReal; 00008 00009 class qtsFFT 00010 { 00011 00012 public: 00013 00014 qtsFFT(long n); 00015 ~qtsFFT(); 00016 00017 PlotLine * do_FFTqts(PlotLine *r); 00018 PlotLine * do_iFFTqts(PlotLine *f); 00019 00020 private: 00021 00022 int length; 00023 00024 double * fftReal; // qtsFFT arrays 00025 double * fftFreq; 00026 00027 // 00028 // FFTReal by Laurent de Soras 00029 // Modified to nested class for inclusion in this module 00030 // -- jim nolen jnolen1@mindspring.com, 29 Nov 2004 00031 // 00032 00033 // --- nested Class FFTReal ---- 00034 class FFTReal 00035 { 00036 public: 00037 00038 /* Change this typedef to use a different floating point type in your FFTs 00039 (i.e. float, double or long double). */ 00040 typedef double flt_t; 00041 00042 explicit FFTReal (const long length); 00043 ~FFTReal (); 00044 void do_fft (flt_t f [], const flt_t x []) const; 00045 void do_ifft (const flt_t f [], flt_t x []) const; 00046 void rescale (flt_t x []) const; 00047 00048 private: 00049 00050 /* Bit-reversed look-up table nested class */ 00051 class BitReversedLUT 00052 { 00053 public: 00054 00055 explicit BitReversedLUT (const int nbr_bits); 00056 ~BitReversedLUT (); 00057 const long * get_ptr () const 00058 { 00059 return (_ptr); 00060 } 00061 private: 00062 long * _ptr; 00063 }; 00064 00065 /* Trigonometric look-up table nested class */ 00066 class TrigoLUT 00067 { 00068 public: 00069 00070 explicit TrigoLUT (const int nbr_bits); 00071 ~TrigoLUT (); 00072 const flt_t * get_ptr (const int level) const 00073 { 00074 return (_ptr + (1L << (level - 1)) - 4); 00075 }; 00076 private: 00077 flt_t * _ptr; 00078 }; 00079 00080 const long _length; 00081 const int _nbr_bits; 00082 const BitReversedLUT _bit_rev_lut; 00083 const TrigoLUT _trigo_lut; 00084 const flt_t _sqrt2_2; 00085 flt_t * _buffer_ptr; 00086 00087 }; 00088 00089 const FFTReal _ftt_Real; 00090 00091 }; 00092 00093 #endif 00094 00095