X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fprocsignal.h;h=9da33e0e09fd684e755950d45ec011c75fd1a4e8;hp=8995dd675c519fd8be57001fc5da64c7bfb136ad;hb=1a050c98763fbbc0662731b0b76953acede6f5d7;hpb=2a39ee3b125e3e2e68bbba2ac15a65039456ff7e diff --git a/include/procsignal.h b/include/procsignal.h index 8995dd6..9da33e0 100644 --- a/include/procsignal.h +++ b/include/procsignal.h @@ -1,15 +1,15 @@ /***************************************************************************** ** FILE IDENTIFICATION ** -** Name: filter.h +** Name: filter.h ** Purpose: Signal filter header file -** Programmer: Kevin Rosenberg -** Date Started: June 2000 +** Programmer: Kevin Rosenberg +** 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 @@ -33,14 +33,16 @@ #include "config.h" #endif #ifdef HAVE_FFTW -#include -#include +#include #endif #include - class SignalFilter; +class SGP; + +typedef std::complex CTSimComplex; + class ProcessSignal { public: @@ -58,17 +60,22 @@ class ProcessSignal { 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;} + bool fail(void) const {return m_fail;} + const std::string& failMessage(void) const {return m_failMessage;} void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; } @@ -82,33 +89,30 @@ class ProcessSignal { 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 output[], const int n, const int direction); - static void finiteFourierTransform (const complex input[], complex output[], const int n, const int direction); - static void finiteFourierTransform (const complex 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 output[], const int n, const int direction); + static void finiteFourierTransform (const std::complex input[], std::complex output[], const int n, const int direction); + static void finiteFourierTransform (const std::complex 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; @@ -132,32 +136,39 @@ class ProcessSignal { 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_real* m_adRealFftInput, *m_adRealFftSignal; - rfftw_plan m_realPlanForward, m_realPlanBackward; - fftw_complex* m_adComplexFftInput, *m_adComplexFftSignal; + double *m_adRealFftInput, *m_adRealFftOutput, *m_adRealFftSignal, *m_adRealFftBackwardOutput; + fftw_plan m_realPlanForward, m_realPlanBackward; + fftw_complex *m_adComplexFftInput, *m_adComplexFftOutput, *m_adComplexFftSignal, *m_adComplexFftBackwardOutput; 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 + // transforms that use precalculated trig tables, therefore don't // require number of data points (n) as an argument - void finiteFourierTransform (const double input[], complex output[], const int direction) const; - void finiteFourierTransform (const complex input[], complex output[], const int direction) const; - void finiteFourierTransform (const complex input[], double output[], const int direction) const; + void finiteFourierTransform (const double input[], std::complex output[], const int direction) const; + void finiteFourierTransform (const std::complex input[], std::complex output[], const int direction) const; + void finiteFourierTransform (const std::complex 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;