/*****************************************************************************
** 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-2001 Kevin Rosenberg
**
-** $Id: procsignal.h,v 1.15 2001/03/01 07:30:49 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 "config.h"
#endif
#ifdef HAVE_FFTW
-#include <fftw.h>
-#include <rfftw.h>
+#include <fftw3.h>
#endif
#include <complex>
BACKWARD = 1,
};
- 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,
+ 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 float input[], double output[]) const;
- bool fail(void) const {return m_fail;}
+ bool fail(void) const {return m_fail;}
const std::string& failMessage(void) const {return m_failMessage;}
void setTraceLevel (int traceLevel) {m_traceLevel = traceLevel; }
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* const* getFilterMethodNameArray() {return s_aszFilterMethodName;}
static const char* const* getFilterMethodTitleArray() {return s_aszFilterMethodTitle;}
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 int addZeropadFactor (int n, int iZeropad);
private:
- std::string m_nameFilterMethod;
- std::string m_nameFilterGeneration;
+ std::string m_nameFilterMethod;
+ std::string m_nameFilterGeneration;
int m_idFilterMethod;
int m_idFilterGeneration;
int m_nSignalPoints;
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, const int iGeometry, double dFocalLength,
+ 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[], std::complex<double> output[], const int direction) const;
void finiteFourierTransform (const std::complex<double> input[], std::complex<double> output[], const int direction) const;