+ 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);
+ complex<double> filteredSignal[m_nFilterPoints];
+ dotProduct (m_vecFilter, fftSignal, filteredSignal, m_nFilterPoints);
+ double inverseFourier[m_nFilterPoints];
+ finiteFourierTransform (filteredSignal, 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 out[m_nFilterPoints];
+ rfftw_one (m_realPlanForward, m_vecRealFftInput, out);
+ for (int i = 0; i < m_nFilterPoints; i++) {
+ out[i] *= m_vecFilter[i];
+ }
+ fftw_real outFiltered[m_nFilterPoints];
+ rfftw_one(m_realPlanBackward, out, outFiltered);
+ for (int i = 0; i < m_nSignalPoints; i++)
+ output[i] = outFiltered[i];
+ } else if (m_idFilterMethod == FILTER_METHOD_FFTW) {
+ for (int i = 0; i < m_nSignalPoints; i++)
+ m_vecComplexFftInput[i].re = input[i];
+
+ fftw_complex out[m_nFilterPoints];
+ fftw_one(m_complexPlanForward, m_vecComplexFftInput, out);
+ for (int i = 0; i < m_nFilterPoints; i++) {
+ out[i].re *= m_vecFilter[i];
+ out[i].im *= m_vecFilter[i];
+ }
+ fftw_complex outFiltered[m_nFilterPoints];
+ fftw_one(m_complexPlanBackward, out, outFiltered);
+ for (int i = 0; i < m_nSignalPoints; i++)
+ output[i] = outFiltered[i].re;