** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.14 2000/07/06 18:37:24 kevin Exp $
+** $Id: filter.cpp,v 1.15 2000/07/07 15:30:59 kevin Exp $
**
** 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
m_vecFourierSinTable = NULL;
m_vecFilter = NULL;
- if (m_idFilterMethod == FILTER_METHOD_FFT)
- m_idFilterMethod = FILTER_METHOD_FFTW;
+ if (m_idFilterMethod == FILTER_METHOD_FFT) {
+#if HAVE_FFTW
+ m_idFilterMethod = FILTER_METHOD_RFFTW;
+#else
+ m_fail = true;
+ m_failMessage = "FFT not yet implemented";
+ return;
+#endif
+ }
- if (m_idFilterMethod == FILTER_METHOD_FOURIER || FILTER_METHOD_FOURIER_TABLE || m_idFilterMethod == FILTER_METHOD_FFT || m_idFilterMethod == FILTER_METHOD_FFTW || m_idFilterMethod == FILTER_METHOD_RFFTW) {
+ if (m_idFilterMethod == FILTER_METHOD_FOURIER || FILTER_METHOD_FOURIER_TABLE || m_idFilterMethod == FILTER_METHOD_FFT
+#if HAVE_FFTW
+ || m_idFilterMethod == FILTER_METHOD_FFTW || m_idFilterMethod == FILTER_METHOD_RFFTW
+#endif
+ ) {
m_nFilterPoints = m_nSignalPoints;
if (m_zeropad > 0) {
double logBase2 = log(m_nSignalPoints) / log(2);
fmID = FILTER_METHOD_FOURIER_TABLE;
else if (strcasecmp (filterMethodName, FILTER_METHOD_FFT_STR) == 0)
fmID = FILTER_METHOD_FFT;
+#if HAVE_FFTW
else if (strcasecmp (filterMethodName, FILTER_METHOD_FFTW_STR) == 0)
fmID = FILTER_METHOD_FFTW;
else if (strcasecmp (filterMethodName, FILTER_METHOD_RFFTW_STR) == 0)
fmID = FILTER_METHOD_RFFTW;
+#endif
return (fmID);
}
return (FILTER_METHOD_FOURIER_TABLE_STR);
else if (fmID == FILTER_METHOD_FFT)
return (FILTER_METHOD_FFT_STR);
+#if HAVE_FFTW
else if (fmID == FILTER_METHOD_FFTW)
return (FILTER_METHOD_FFTW_STR);
else if (fmID == FILTER_METHOD_RFFTW)
return (FILTER_METHOD_RFFTW_STR);
+#endif
return (name);
}
inputSignal[i] = 0; // zeropad
complex<double> fftSignal[m_nFilterPoints];
finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, -1);
- complex<double> filteredSignal[m_nFilterPoints];
- dotProduct (m_vecFilter, fftSignal, filteredSignal, m_nFilterPoints);
+ for (int i = 0; i < m_nFilterPoints; i++)
+ fftSignal[i] *= m_vecFilter[i];
double inverseFourier[m_nFilterPoints];
- finiteFourierTransform (filteredSignal, inverseFourier, m_nFilterPoints, 1);
+ finiteFourierTransform (fftSignal, inverseFourier, m_nFilterPoints, 1);
for (int i = 0; i < m_nSignalPoints; i++)
output[i] = inverseFourier[i];
} else if (m_idFilterMethod == FILTER_METHOD_FOURIER_TABLE) {
inputSignal[i] = 0; // zeropad
complex<double> fftSignal[m_nFilterPoints];
finiteFourierTransform (inputSignal, fftSignal, -1);
- complex<double> filteredSignal[m_nFilterPoints];
- dotProduct (m_vecFilter, fftSignal, filteredSignal, m_nFilterPoints);
+ for (int i = 0; i < m_nFilterPoints; i++)
+ fftSignal[i] *= m_vecFilter[i];
double inverseFourier[m_nFilterPoints];
- finiteFourierTransform (filteredSignal, inverseFourier, 1);
+ finiteFourierTransform (fftSignal, inverseFourier, 1);
for (int i = 0; i < m_nSignalPoints; i++)
output[i] = inverseFourier[i];
}
}
-void
-SignalFilter::dotProduct (const double v1[], const complex<double> v2[], complex<double> output[], const int n)
-{
- for (int i = 0; i < n; i++)
- output[i] = v1[i] * v2[i];
-}