** Date Started: June 2000
**
** This is part of the CTSim program
-** Copyright (C) 1983-2000 Kevin Rosenberg
+** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: procsignal.h,v 1.2 2000/08/22 07:02:48 kevin Exp $
+** $Id$
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
#include <complex>
-
class SignalFilter;
+class SGP;
+
+typedef std::complex<double> CTSimComplex;
+
class ProcessSignal {
public:
static const int FILTER_GENERATION_DIRECT;
static const int FILTER_GENERATION_INVERSE_FOURIER;
- 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);
+ enum {
+ FORWARD = -1,
+ BACKWARD = 1,
+ };
- 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);
+ ProcessSignal (const char* szFilterName, const char* szFilterMethodName,double bw, double signalIncrement,
+ int n, double param, const char* szDomainName, const char* szFilterGenerationName,
+ const int zeropad, const int preinterpolationFactor, const int iTraceLevel, int iGeometry,
+ double dFocalLength, double dSourceDetectorLength, SGP* pSGP = NULL);
~ProcessSignal();
- void filterSignal (const double input[], double output[]) const;
void filterSignal (const float input[], double output[]) const;
bool fail(void) const {return m_fail;}
- const string& failMessage(void) const {return m_failMessage;}
+ const std::string& failMessage(void) const {return m_failMessage;}
void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
const int idFilterGeneration() const { return m_idFilterGeneration;}
static const int getFilterGenerationCount() {return s_iFilterGenerationCount;}
- static const char** getFilterGenerationNameArray() {return s_aszFilterGenerationName;}
- static const char** getFilterGenerationTitleArray() {return s_aszFilterGenerationTitle;}
+ static const char* const* getFilterGenerationNameArray() {return s_aszFilterGenerationName;}
+ static const char* const* getFilterGenerationTitleArray() {return s_aszFilterGenerationTitle;}
static int convertFilterGenerationNameToID (const char* const fgName);
static const char* convertFilterGenerationIDToName (const int idFG);
static const char* convertFilterGenerationIDToTitle (const int idFG);
static const int getFilterMethodCount() {return s_iFilterMethodCount;}
- static const char** getFilterMethodNameArray() {return s_aszFilterMethodName;}
- static const char** getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
+ static const char* const* getFilterMethodNameArray() {return s_aszFilterMethodName;}
+ static const char* const* getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
static int convertFilterMethodNameToID (const char* const filterMethodName);
static const char* convertFilterMethodIDToName (const int idFilterMethod);
static const char* convertFilterMethodIDToTitle (const int idFilterMethod);
// transforms using direct trigometric calculation
static void finiteFourierTransform (const double input[], double output[], const int n, const int direction);
- static void finiteFourierTransform (const double input[], complex<double> output[], const int n, const int direction);
- static void finiteFourierTransform (const complex<double> input[], complex<double> output[], const int n, const int direction);
- static void finiteFourierTransform (const complex<double> input[], double output[], const int n, const int direction);
-
-
- static void shuffleNaturalToFourierOrder (double* pdVector, const int n);
+ static void finiteFourierTransform (const double input[], std::complex<double> output[], const int n, const int direction);
+ static void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int n, const int direction);
+ static void finiteFourierTransform (const std::complex<double> input[], double output[], const int n, const int direction);
- static void shuffleFourierToNaturalOrder (double* pdVector, const int n);
+ static int addZeropadFactor (int n, int iZeropad);
private:
- string m_nameFilterMethod;
- string m_nameFilterGeneration;
+ std::string m_nameFilterMethod;
+ std::string m_nameFilterGeneration;
int m_idFilterMethod;
int m_idFilterGeneration;
int m_nSignalPoints;
int m_iZeropad;
int m_nOutputPoints;
int m_iPreinterpolationFactor;
+ int m_idGeometry;
+ double m_dFocalLength;
+ double m_dSourceDetectorLength;
bool m_fail;
- string m_failMessage;
+ std::string m_failMessage;
- static const char* s_aszFilterMethodName[];
- static const char* s_aszFilterMethodTitle[];
+ static const char* const s_aszFilterMethodName[];
+ static const char* const s_aszFilterMethodTitle[];
static const int s_iFilterMethodCount;
- static const char* s_aszFilterGenerationName[];
- static const char* s_aszFilterGenerationTitle[];
+ static const char* const s_aszFilterGenerationName[];
+ static const char* const s_aszFilterGenerationTitle[];
static const int s_iFilterGenerationCount;
#ifdef HAVE_FFTW
fftw_plan m_complexPlanForward, m_complexPlanBackward;
#endif
- 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);
+ 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,
+ double dSourceDetectorLength, SGP* pSGP);
// transforms that use precalculated trig tables, therefore don't
// require number of data points (n) as an argument
- void finiteFourierTransform (const double input[], complex<double> output[], const int direction) const;
- void finiteFourierTransform (const complex<double> input[], complex<double> output[], const int direction) const;
- void finiteFourierTransform (const complex<double> input[], double output[], const int direction) const;
+ void finiteFourierTransform (const double input[], std::complex<double> output[], const int direction) const;
+ void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int direction) const;
+ void finiteFourierTransform (const std::complex<double> input[], double output[], const int direction) const;
+ double convolve (const double func[], const double filter[], const double dx, const int n, const int np) const;
double convolve (const double f[], const double dx, const int n, const int np) const;
double convolve (const float f[], const double dx, const int n, const int np) const;