+const char *
+SignalFilter::convertFilterMethodIDToTitle (const int fmID)
+{
+ static const char *title = "";
+
+ if (fmID >= 0 && fmID < s_iFilterMethodCount)
+ return (s_aszFilterTitle [fmID]);
+
+ return (title);
+}
+
+int
+SignalFilter::convertDomainNameToID (const char* const domainName)
+{
+ int dID = DOMAIN_INVALID;
+
+ for (int i = 0; i < s_iDomainCount; i++)
+ if (strcasecmp (domainName, s_aszDomainName[i]) == 0) {
+ dID = i;
+ break;
+ }
+
+ return (dID);
+}
+
+const char *
+SignalFilter::convertDomainIDToName (const int domainID)
+{
+ static const char *name = "";
+
+ if (domainID >= 0 && domainID < s_iDomainCount)
+ return (s_aszDomainName [domainID]);
+
+ return (name);
+}
+
+const char *
+SignalFilter::convertDomainIDToTitle (const int domainID)
+{
+ static const char *title = "";
+
+ if (domainID >= 0 && domainID < s_iDomainCount)
+ return (s_aszDomainTitle [domainID]);
+
+ return (title);
+}
+
+void
+SignalFilter::filterSignal (const float input[], double output[]) const
+{
+ if (m_idFilterMethod == FILTER_METHOD_CONVOLUTION) {
+ for (int i = 0; i < m_nSignalPoints; i++)
+ output[i] = convolve (input, m_signalInc, i, m_nSignalPoints);
+ } else if (m_idFilterMethod == FILTER_METHOD_FOURIER) {
+ double inputSignal[m_nFilterPoints];
+ for (int i = 0; i < m_nSignalPoints; i++)
+ inputSignal[i] = input[i];
+ for (int i = m_nSignalPoints; i < m_nFilterPoints; i++)
+ inputSignal[i] = 0; // zeropad
+ complex<double> fftSignal[m_nFilterPoints];
+ finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, -1);
+ for (int i = 0; i < m_nFilterPoints; i++)
+ fftSignal[i] *= m_vecFilter[i];
+ double inverseFourier[m_nFilterPoints];
+ 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) {
+ double inputSignal[m_nFilterPoints];
+ for (int i = 0; i < m_nSignalPoints; i++)
+ inputSignal[i] = input[i];
+ for (int i = m_nSignalPoints; i < m_nFilterPoints; i++)
+ inputSignal[i] = 0; // zeropad
+ complex<double> fftSignal[m_nFilterPoints];
+ finiteFourierTransform (inputSignal, fftSignal, -1);
+ for (int i = 0; i < m_nFilterPoints; i++)
+ fftSignal[i] *= m_vecFilter[i];
+ double inverseFourier[m_nFilterPoints];
+ finiteFourierTransform (fftSignal, inverseFourier, 1);
+ for (int i = 0; i < m_nSignalPoints; i++)
+ output[i] = inverseFourier[i];
+ }
+#if HAVE_FFTW
+ else if (m_idFilterMethod == FILTER_METHOD_RFFTW) {
+ for (int i = 0; i < m_nSignalPoints; i++)
+ m_vecRealFftInput[i] = input[i];
+
+ fftw_real fftOutput [ m_nFilterPoints ];
+ rfftw_one (m_realPlanForward, m_vecRealFftInput, fftOutput);
+ for (int i = 0; i < m_nFilterPoints; i++)
+ m_vecRealFftSignal[i] = m_vecFilter[i] * fftOutput[i];
+ for (int i = m_nFilterPoints; i < m_nOutputPoints; i++)
+ m_vecRealFftSignal[i] = 0;
+
+ fftw_real ifftOutput [ m_nOutputPoints ];
+ rfftw_one(m_realPlanBackward, m_vecRealFftSignal, ifftOutput);
+ for (int i = 0; i < m_nSignalPoints * m_preinterpolationFactor; i++)
+ output[i] = ifftOutput[i];
+ } else if (m_idFilterMethod == FILTER_METHOD_FFTW) {
+ for (int i = 0; i < m_nSignalPoints; i++)
+ m_vecComplexFftInput[i].re = input[i];
+
+ fftw_complex fftOutput [ m_nFilterPoints ];
+ fftw_one(m_complexPlanForward, m_vecComplexFftInput, fftOutput);
+ for (int i = 0; i < m_nFilterPoints; i++) {
+ m_vecComplexFftSignal[i].re = m_vecFilter[i] * fftOutput[i].re;
+ m_vecComplexFftSignal[i].im = m_vecFilter[i] * fftOutput[i].im;
+ }
+ fftw_complex ifftOutput [ m_nOutputPoints ];
+ fftw_one(m_complexPlanBackward, m_vecComplexFftSignal, ifftOutput);
+ for (int i = 0; i < m_nSignalPoints * m_preinterpolationFactor; i++)
+ output[i] = ifftOutput[i].re;
+ }
+#endif
+}
+
+double
+SignalFilter::response (double x)
+{
+ double response = 0;
+
+ if (m_idDomain == DOMAIN_SPATIAL)
+ response = spatialResponse (m_idFilter, m_bw, x, m_filterParam);
+ else if (m_idDomain == DOMAIN_FREQUENCY)
+ response = frequencyResponse (m_idFilter, m_bw, x, m_filterParam);
+
+ return (response);
+}
+
+
+double
+SignalFilter::spatialResponse (int filterID, double bw, double x, double param)
+{
+ if (haveAnalyticSpatial(filterID))
+ return spatialResponseAnalytic (filterID, bw, x, param);
+ else
+ return spatialResponseCalc (filterID, bw, x, param, N_INTEGRAL);
+}