1 /*****************************************************************************
5 ** Purpose: Signal filter header file
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: June 2000
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2000 Kevin Rosenberg
12 ** $Id: procsignal.h,v 1.2 2000/08/22 07:02:48 kevin Exp $
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License (version 2) as
16 ** published by the Free Software Foundation.
18 ** This program is distributed in the hope that it will be useful,
19 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ** GNU General Public License for more details.
23 ** You should have received a copy of the GNU General Public License
24 ** along with this program; if not, write to the Free Software
25 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 ******************************************************************************/
47 static const int FILTER_METHOD_INVALID;
48 static const int FILTER_METHOD_CONVOLUTION;
49 static const int FILTER_METHOD_FOURIER;
50 static const int FILTER_METHOD_FOURIER_TABLE;
51 static const int FILTER_METHOD_FFT;
53 static const int FILTER_METHOD_FFTW;
54 static const int FILTER_METHOD_RFFTW;
57 static const int FILTER_GENERATION_INVALID;
58 static const int FILTER_GENERATION_DIRECT;
59 static const int FILTER_GENERATION_INVERSE_FOURIER;
61 ProcessSignal (const char* szFilterName, const char* szFilterMethodName,double bw, double signalIncrement, int n, double param, const char* szDomainName, const char* szFilterGenerationName, const int zeropad = 0, const int preinterpolationFactor = 1, const int iTraceLevel = TRACE_NONE);
63 ProcessSignal (const int idFilter, int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, int idFilterGeneration, const int iZeropad = 0, const int iPreinterpolationFactor = 1, const int iTraceLevel = TRACE_NONE);
67 void filterSignal (const double input[], double output[]) const;
68 void filterSignal (const float input[], double output[]) const;
70 bool fail(void) const {return m_fail;}
71 const string& failMessage(void) const {return m_failMessage;}
73 void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
75 int getNFilterPoints (void) const { return m_nFilterPoints; }
76 const double getFilterMin(void) const {return m_dFilterMin;}
77 const double getFilterMax(void) const {return m_dFilterMax;}
78 const double getFilterIncrement(void) const {return m_dFilterInc;}
79 double* getFilter(void) {return m_adFilter;}
80 const double* getFilter(void) const {return m_adFilter;}
82 const int idFilterGeneration() const { return m_idFilterGeneration;}
84 static const int getFilterGenerationCount() {return s_iFilterGenerationCount;}
85 static const char** getFilterGenerationNameArray() {return s_aszFilterGenerationName;}
86 static const char** getFilterGenerationTitleArray() {return s_aszFilterGenerationTitle;}
87 static int convertFilterGenerationNameToID (const char* const fgName);
88 static const char* convertFilterGenerationIDToName (const int idFG);
89 static const char* convertFilterGenerationIDToTitle (const int idFG);
91 static const int getFilterMethodCount() {return s_iFilterMethodCount;}
92 static const char** getFilterMethodNameArray() {return s_aszFilterMethodName;}
93 static const char** getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
94 static int convertFilterMethodNameToID (const char* const filterMethodName);
95 static const char* convertFilterMethodIDToName (const int idFilterMethod);
96 static const char* convertFilterMethodIDToTitle (const int idFilterMethod);
98 // transforms using direct trigometric calculation
99 static void finiteFourierTransform (const double input[], double output[], const int n, const int direction);
100 static void finiteFourierTransform (const double input[], complex<double> output[], const int n, const int direction);
101 static void finiteFourierTransform (const complex<double> input[], complex<double> output[], const int n, const int direction);
102 static void finiteFourierTransform (const complex<double> input[], double output[], const int n, const int direction);
105 static void shuffleNaturalToFourierOrder (double* pdVector, const int n);
107 static void shuffleFourierToNaturalOrder (double* pdVector, const int n);
110 string m_nameFilterMethod;
111 string m_nameFilterGeneration;
112 int m_idFilterMethod;
113 int m_idFilterGeneration;
115 double* m_adFourierCosTable;
116 double* m_adFourierSinTable;
123 bool m_bFrequencyFiltering;
125 // Variables also kept in SignalFilter class
131 double m_dFilterParam;
134 int m_iPreinterpolationFactor;
137 string m_failMessage;
139 static const char* s_aszFilterMethodName[];
140 static const char* s_aszFilterMethodTitle[];
141 static const int s_iFilterMethodCount;
142 static const char* s_aszFilterGenerationName[];
143 static const char* s_aszFilterGenerationTitle[];
144 static const int s_iFilterGenerationCount;
147 fftw_real* m_adRealFftInput, *m_adRealFftSignal;
148 rfftw_plan m_realPlanForward, m_realPlanBackward;
149 fftw_complex* m_adComplexFftInput, *m_adComplexFftSignal;
150 fftw_plan m_complexPlanForward, m_complexPlanBackward;
153 void init (const int idFilter, int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, int idFilterGeneration, const int iZeropad, const int iPreinterpolationFactor, const int iTraceLevel);
155 // transforms that use precalculated trig tables, therefore don't
156 // require number of data points (n) as an argument
157 void finiteFourierTransform (const double input[], complex<double> output[], const int direction) const;
158 void finiteFourierTransform (const complex<double> input[], complex<double> output[], const int direction) const;
159 void finiteFourierTransform (const complex<double> input[], double output[], const int direction) const;
161 double convolve (const double f[], const double dx, const int n, const int np) const;
162 double convolve (const float f[], const double dx, const int n, const int np) const;