r180: *** empty log message ***
[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.1 2000/08/19 23:00:05 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);
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);
64
65     ~ProcessSignal();
66
67     void filterSignal (const double input[], double output[]) const;
68     void filterSignal (const float input[], double output[]) 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
136     bool m_fail;
137     string m_failMessage;
138
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;
145
146 #ifdef HAVE_FFTW
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;
151 #endif
152
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);
154
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;
160
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;
163
164 };
165
166
167 #endif