X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fprocsignal.h;h=2c37de89ddc43ef17909606e599ffb50fca8dd27;hp=8995dd675c519fd8be57001fc5da64c7bfb136ad;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=2a39ee3b125e3e2e68bbba2ac15a65039456ff7e diff --git a/include/procsignal.h b/include/procsignal.h index 8995dd6..2c37de8 100644 --- a/include/procsignal.h +++ b/include/procsignal.h @@ -7,9 +7,9 @@ ** 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 @@ -39,8 +39,11 @@ #include - class SignalFilter; +class SGP; + +typedef std::complex CTSimComplex; + class ProcessSignal { public: @@ -58,17 +61,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;} + const std::string& failMessage(void) const {return m_failMessage;} void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; } @@ -82,33 +90,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,15 +137,18 @@ 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 @@ -150,14 +158,18 @@ class ProcessSignal { 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 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;