00001 /*************************************************************************** 00002 fft.h - description 00003 ------------------- 00004 begin : Mon Jul 1 2002 00005 copyright : (C) 2002 by Peter Haase 00006 email : mail@p-haase.de 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU Lesser General Public * 00013 * License as published by the Free Software Foundation; either * 00014 * version 2.1 of the License, or (at your option) any later version. * 00015 * * 00016 * This library is distributed in the hope that it will be useful, * 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00019 * Lesser General Public License for more details. * 00020 * * 00021 * You should have received a copy of the GNU Lesser General Public * 00022 * License along with this library; if not, write to the Free Software * 00023 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * 00024 * MA 02111-1307 USA * 00025 * * 00026 ***************************************************************************/ 00027 #ifndef FFT_MYHEADER 00028 #define FFT_MYHEADER 00029 00030 #include <stdexcept> 00031 #include <vector> 00032 00033 #include "phbib.h" 00034 #include "signals.h" 00035 #include "misc.h" 00036 00037 00038 00039 namespace simthlib 00040 { 00041 00042 using simth::Complex; 00043 00048 //-------------------------------------------------------------------- 00049 // 00050 // class FastFourierTrans 00051 // 00052 // 00053 // Konstruktoren 00054 // FastFourierTrans(): einmalige Erstellung des Sinus-Arrays 00055 // 00056 // Funktionen 00057 // sinus_array(): Zeiger auf Feld mit Sinuswerten zurueckgeben 00058 // Transform(Sequence &inseq, Sequence* &outseq, 00059 // int space, int fac, flag_FFT isign) : 00060 // inseq: Eingangssequence 00061 // outseq: Ausgangssequence 00062 // space: Abtastschrittweite 00063 // fac: Oversamplingfaktor 00064 // isign: Flag fuer FFT (-1) bzw. IFFT (1) 00065 // FFT und IFFT : siehe Transformation ohne isign-Flag 00066 // 00067 //-------------------------------------------------------------------- 00068 00088 class FastFourierTrans 00089 { 00090 00091 public: 00092 00095 enum FFT_type {FT = -1, IFT = 1}; 00096 00097 00100 FastFourierTrans() : MAX_FFT_LEN(4096) { MakeSinusArray(); } 00101 00104 ~FastFourierTrans() { delete [] sinus; } 00105 00108 void FFT(const simth::Array<Complex> &inseq, 00109 simth::Array<Complex>* outseq, int space, int fac) const; 00110 00113 void IFFT(const simth::Array<Complex> &inseq, 00114 simth::Array<Complex>* outseq, int space, int fac) const; 00115 00116 private: 00117 00120 double *sinus; 00121 00124 const int MAX_FFT_LEN; 00125 00128 void MakeSinusArray(void); 00129 00132 int GetNewLength(int len, int space, int fac) const; 00133 00137 void Transform(const simth::Array<Complex> &inseq, 00138 simth::Array<Complex> *outseq, 00139 int space, int fac, FFT_type isign) const; 00140 00141 00142 00143 }; 00144 00145 00146 00147 } 00148 00149 00150 00151 #endif