- 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);
- complex<double> filteredSignal[m_nFilterPoints];
- dotProduct (m_vecFilter, fftSignal, filteredSignal, m_nFilterPoints);
- double inverseFourier[m_nFilterPoints];
- finiteFourierTransform (filteredSignal, 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);
- 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;
- }
-#endif