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.10 2001/01/01 10:14:34 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 ******************************************************************************/
45 typedef std::complex<double> CTSimComplex;
\r
50 static const int FILTER_METHOD_INVALID;
51 static const int FILTER_METHOD_CONVOLUTION;
52 static const int FILTER_METHOD_FOURIER;
53 static const int FILTER_METHOD_FOURIER_TABLE;
54 static const int FILTER_METHOD_FFT;
56 static const int FILTER_METHOD_FFTW;
57 static const int FILTER_METHOD_RFFTW;
60 static const int FILTER_GENERATION_INVALID;
61 static const int FILTER_GENERATION_DIRECT;
62 static const int FILTER_GENERATION_INVERSE_FOURIER;
69 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::TRACE_NONE, int iGeometry = Scanner::GEOMETRY_PARALLEL, double dFocalLength = 1., SGP* pSGP = NULL);
73 void filterSignal (const float input[], double output[]) const;
75 bool fail(void) const {return m_fail;}
76 const std::string& failMessage(void) const {return m_failMessage;}
78 void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
80 int getNFilterPoints (void) const { return m_nFilterPoints; }
81 const double getFilterMin(void) const {return m_dFilterMin;}
82 const double getFilterMax(void) const {return m_dFilterMax;}
83 const double getFilterIncrement(void) const {return m_dFilterInc;}
84 double* getFilter(void) {return m_adFilter;}
85 const double* getFilter(void) const {return m_adFilter;}
87 const int idFilterGeneration() const { return m_idFilterGeneration;}
89 static const int getFilterGenerationCount() {return s_iFilterGenerationCount;}
90 static const char** getFilterGenerationNameArray() {return s_aszFilterGenerationName;}
91 static const char** getFilterGenerationTitleArray() {return s_aszFilterGenerationTitle;}
92 static int convertFilterGenerationNameToID (const char* const fgName);
93 static const char* convertFilterGenerationIDToName (const int idFG);
94 static const char* convertFilterGenerationIDToTitle (const int idFG);
96 static const int getFilterMethodCount() {return s_iFilterMethodCount;}
97 static const char** getFilterMethodNameArray() {return s_aszFilterMethodName;}
98 static const char** getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
99 static int convertFilterMethodNameToID (const char* const filterMethodName);
100 static const char* convertFilterMethodIDToName (const int idFilterMethod);
101 static const char* convertFilterMethodIDToTitle (const int idFilterMethod);
103 // transforms using direct trigometric calculation
104 static void finiteFourierTransform (const double input[], double output[], const int n, const int direction);
105 static void finiteFourierTransform (const double input[], std::complex<double> output[], const int n, const int direction);
106 static void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int n, const int direction);
107 static void finiteFourierTransform (const std::complex<double> input[], double output[], const int n, const int direction);
110 static void shuffleNaturalToFourierOrder (float* pdVector, const int n);
\r
111 static void shuffleNaturalToFourierOrder (double* pdVector, const int n);
\r
112 static void shuffleNaturalToFourierOrder (std::complex<double>* pdVector, const int n);
\r
113 static void shuffleFourierToNaturalOrder (float* pdVector, const int n);
\r
114 static void shuffleFourierToNaturalOrder (double* pdVector, const int n);
\r
115 static void shuffleFourierToNaturalOrder (std::complex<double>* pdVector, const int n);
\r
119 std::string m_nameFilterMethod;
120 std::string m_nameFilterGeneration;
121 int m_idFilterMethod;
122 int m_idFilterGeneration;
124 double* m_adFourierCosTable;
125 double* m_adFourierSinTable;
132 bool m_bFrequencyFiltering;
134 // Variables also kept in SignalFilter class
140 double m_dFilterParam;
143 int m_iPreinterpolationFactor;
145 double m_dFocalLength;
148 std::string m_failMessage;
150 static const char* s_aszFilterMethodName[];
151 static const char* s_aszFilterMethodTitle[];
152 static const int s_iFilterMethodCount;
153 static const char* s_aszFilterGenerationName[];
154 static const char* s_aszFilterGenerationTitle[];
155 static const int s_iFilterGenerationCount;
158 fftw_real* m_adRealFftInput, *m_adRealFftSignal;
159 rfftw_plan m_realPlanForward, m_realPlanBackward;
160 fftw_complex* m_adComplexFftInput, *m_adComplexFftSignal;
161 fftw_plan m_complexPlanForward, m_complexPlanBackward;
164 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, const int iGeometry, double dFocalLength, SGP* pSGP);
166 // transforms that use precalculated trig tables, therefore don't
167 // require number of data points (n) as an argument
168 void finiteFourierTransform (const double input[], std::complex<double> output[], const int direction) const;
169 void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int direction) const;
170 void finiteFourierTransform (const std::complex<double> input[], double output[], const int direction) const;
172 double convolve (const double func[], const double filter[], const double dx, const int n, const int np) const;
173 double convolve (const double f[], const double dx, const int n, const int np) const;
174 double convolve (const float f[], const double dx, const int n, const int np) const;