c6472f88851e222ae4951fde5bd9f6d73a9043a5
[ctsim.git] / include / procsignal.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **      Name:         filter.h
5 **      Purpose:      Signal filter header file
6 **      Programmer:   Kevin Rosenberg
7 **      Date Started: June 2000
8 **
9 **  This is part of the CTSim program
10 **  Copyright (c) 1983-2001 Kevin Rosenberg
11 **
12 **  $Id: procsignal.h,v 1.16 2001/03/13 14:53:43 kevin Exp $
13 **
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.
17 **
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.
22 **
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 ******************************************************************************/
27
28 #ifndef PROCSIGNAL_H
29 #define PROCSIGNAL_H
30
31
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif
35 #ifdef HAVE_FFTW
36 #include <fftw.h>
37 #include <rfftw.h>
38 #endif
39
40 #include <complex>
41
42 class SignalFilter;
43 class SGP;
44
45 typedef std::complex<double> CTSimComplex;
46
47
48 class ProcessSignal {
49  public:
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;
55 #if HAVE_FFTW
56     static const int FILTER_METHOD_FFTW;
57     static const int FILTER_METHOD_RFFTW;
58 #endif
59
60     static const int FILTER_GENERATION_INVALID;
61     static const int FILTER_GENERATION_DIRECT;
62     static const int FILTER_GENERATION_INVERSE_FOURIER;
63
64     enum {
65       FORWARD = -1,
66       BACKWARD = 1,
67     };
68
69     ProcessSignal (const char* szFilterName, const char* szFilterMethodName,double bw, double signalIncrement, 
70       int n, double param, const char* szDomainName, const char* szFilterGenerationName, 
71       const int zeropad, const int preinterpolationFactor, const int iTraceLevel, int iGeometry, 
72       double dFocalLength, double dSourceDetectorLength, SGP* pSGP = NULL);
73
74     ~ProcessSignal();
75
76     void filterSignal (const float input[], double output[]) const;
77
78     bool fail(void) const       {return m_fail;}
79     const std::string& failMessage(void) const {return m_failMessage;}
80
81     void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
82
83     int getNFilterPoints (void) const  { return m_nFilterPoints; }
84     const double getFilterMin(void) const {return m_dFilterMin;}
85     const double getFilterMax(void) const {return m_dFilterMax;}
86     const double getFilterIncrement(void) const {return m_dFilterInc;}
87     double* getFilter(void) {return m_adFilter;}
88     const double* getFilter(void) const {return m_adFilter;}
89
90     const int idFilterGeneration() const { return m_idFilterGeneration;}
91
92     static const int getFilterGenerationCount() {return s_iFilterGenerationCount;}
93     static const char* const* getFilterGenerationNameArray() {return s_aszFilterGenerationName;}
94     static const char* const* getFilterGenerationTitleArray() {return s_aszFilterGenerationTitle;}
95     static int convertFilterGenerationNameToID (const char* const fgName);
96     static const char* convertFilterGenerationIDToName (const int idFG);
97     static const char* convertFilterGenerationIDToTitle (const int idFG);
98   
99     static const int getFilterMethodCount() {return s_iFilterMethodCount;}
100     static const char* const* getFilterMethodNameArray() {return s_aszFilterMethodName;}
101     static const char* const* getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
102     static int convertFilterMethodNameToID (const char* const filterMethodName);
103     static const char* convertFilterMethodIDToName (const int idFilterMethod);
104     static const char* convertFilterMethodIDToTitle (const int idFilterMethod);
105
106     // transforms using direct trigometric calculation
107     static void finiteFourierTransform (const double input[], double output[], const int n, const int direction);
108     static void finiteFourierTransform (const double input[], std::complex<double> output[], const int n, const int direction);
109     static void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int n, const int direction);
110     static void finiteFourierTransform (const std::complex<double> input[], double output[], const int n, const int direction);
111
112     static int addZeropadFactor (int n, int iZeropad);
113
114  private:
115          std::string m_nameFilterMethod;
116          std::string m_nameFilterGeneration;
117     int m_idFilterMethod;
118     int m_idFilterGeneration;
119     int m_nSignalPoints;
120     double* m_adFourierCosTable;
121     double* m_adFourierSinTable;
122     int m_nFilterPoints;
123     double m_dSignalInc;
124     double m_dFilterInc;
125     double m_dFilterMin;
126     double m_dFilterMax;
127     double* m_adFilter;
128     bool m_bFrequencyFiltering;
129
130     // Variables also kept in SignalFilter class
131     int m_idFilter;
132     int m_idDomain;
133
134     int m_traceLevel;
135     double m_dBandwidth;
136     double m_dFilterParam;
137     int m_iZeropad;
138     int m_nOutputPoints;
139     int m_iPreinterpolationFactor;
140     int m_idGeometry;
141     double m_dFocalLength;
142     double m_dSourceDetectorLength;
143
144     bool m_fail;
145     std::string m_failMessage;
146
147     static const char* const s_aszFilterMethodName[];
148     static const char* const s_aszFilterMethodTitle[];
149     static const int s_iFilterMethodCount;
150     static const char* const s_aszFilterGenerationName[];
151     static const char* const s_aszFilterGenerationTitle[];
152     static const int s_iFilterGenerationCount;
153
154 #ifdef HAVE_FFTW
155     fftw_real* m_adRealFftInput, *m_adRealFftSignal;
156     rfftw_plan m_realPlanForward, m_realPlanBackward;
157     fftw_complex* m_adComplexFftInput, *m_adComplexFftSignal;
158     fftw_plan m_complexPlanForward, m_complexPlanBackward;
159 #endif
160
161     void init (const int idFilter, int idFilterMethod, double dBandwidth, double dSignalIncrement, 
162       int nSignalPoints, double dFilterParam, const int idDomain, int idFilterGeneration, const int iZeropad, 
163       const int iPreinterpolationFactor, const int iTraceLevel, const int iGeometry, double dFocalLength, 
164       double dSourceDetectorLength, SGP* pSGP);
165
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;
171
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;
175
176 };
177
178
179 #endif