e8e9679e3d247d814d601ac1518002f2ea6e922d
[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-2000 Kevin Rosenberg
11 **
12 **  $Id: procsignal.h,v 1.3 2000/08/27 20:32:54 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
43 class SignalFilter;
44
45 class ProcessSignal {
46  public:
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;
52 #if HAVE_FFTW
53     static const int FILTER_METHOD_FFTW;
54     static const int FILTER_METHOD_RFFTW;
55 #endif
56
57     static const int FILTER_GENERATION_INVALID;
58     static const int FILTER_GENERATION_DIRECT;
59     static const int FILTER_GENERATION_INVERSE_FOURIER;
60
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::TRACE_NONE, int iGeometry = Scanner::GEOMETRY_PARALLEL);
62
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::TRACE_NONE);
64
65     ~ProcessSignal();
66
67     void filterSignal (const double input[], double output[], int view =0) const;
68     void filterSignal (const float input[], double output[], int view = 0) const;
69
70     bool fail(void) const       {return m_fail;}
71     const string& failMessage(void) const {return m_failMessage;}
72
73     void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
74
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;}
81
82     const int idFilterGeneration() const { return m_idFilterGeneration;}
83
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);
90   
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);
97
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);
103
104
105     static void shuffleNaturalToFourierOrder (double* pdVector, const int n);
106
107     static void shuffleFourierToNaturalOrder (double* pdVector, const int n);
108
109  private:
110     string m_nameFilterMethod;
111     string m_nameFilterGeneration;
112     int m_idFilterMethod;
113     int m_idFilterGeneration;
114     int m_nSignalPoints;
115     double* m_adFourierCosTable;
116     double* m_adFourierSinTable;
117     int m_nFilterPoints;
118     double m_dSignalInc;
119     double m_dFilterInc;
120     double m_dFilterMin;
121     double m_dFilterMax;
122     double* m_adFilter;
123     bool m_bFrequencyFiltering;
124
125     // Variables also kept in SignalFilter class
126     int m_idFilter;
127     int m_idDomain;
128
129     int m_traceLevel;
130     double m_dBandwidth;
131     double m_dFilterParam;
132     int m_iZeropad;
133     int m_nOutputPoints;
134     int m_iPreinterpolationFactor;
135     int m_idGeometry;
136
137     bool m_fail;
138     string m_failMessage;
139
140     static const char* s_aszFilterMethodName[];
141     static const char* s_aszFilterMethodTitle[];
142     static const int s_iFilterMethodCount;
143     static const char* s_aszFilterGenerationName[];
144     static const char* s_aszFilterGenerationTitle[];
145     static const int s_iFilterGenerationCount;
146
147 #ifdef HAVE_FFTW
148     fftw_real* m_adRealFftInput, *m_adRealFftSignal;
149     rfftw_plan m_realPlanForward, m_realPlanBackward;
150     fftw_complex* m_adComplexFftInput, *m_adComplexFftSignal;
151     fftw_plan m_complexPlanForward, m_complexPlanBackward;
152 #endif
153
154     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);
155
156     // transforms that use precalculated trig tables, therefore don't 
157     // require number of data points (n) as an argument
158     void finiteFourierTransform (const double input[], complex<double> output[], const int direction) const;
159     void finiteFourierTransform (const complex<double> input[], complex<double> output[], const int direction) const;
160     void finiteFourierTransform (const complex<double> input[], double output[], const int direction) const;
161
162     double convolve (const double f[], const double dx, const int n, const int np) const;
163     double convolve (const float f[], const double dx, const int n, const int np) const;
164
165 };
166
167
168 #endif