- 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