From 24e04db129360d73d3a43f024108086f51a2e45d Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Wed, 21 Mar 2018 10:28:38 -0600 Subject: [PATCH] Use OpenMP for signal filtering --- libctsim/procsignal.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libctsim/procsignal.cpp b/libctsim/procsignal.cpp index dc024ad..3a28676 100644 --- a/libctsim/procsignal.cpp +++ b/libctsim/procsignal.cpp @@ -545,21 +545,34 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const { double* input = new double [m_nSignalPoints]; int i; + +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (i = 0; i < m_nSignalPoints; i++) input[i] = constInput[i]; if (m_idGeometry == Scanner::GEOMETRY_EQUILINEAR) { +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < m_nSignalPoints; i++) { int iDetFromCenter = i - (m_nSignalPoints / 2); input[i] *= m_dFocalLength / sqrt (m_dFocalLength * m_dFocalLength + iDetFromCenter * iDetFromCenter * m_dSignalInc * m_dSignalInc); } } else if (m_idGeometry == Scanner::GEOMETRY_EQUIANGULAR) { +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < m_nSignalPoints; i++) { int iDetFromCenter = i - (m_nSignalPoints / 2); input[i] *= m_dFocalLength * cos (iDetFromCenter * m_dSignalInc); } } if (m_idFilterMethod == FILTER_METHOD_CONVOLUTION) { +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (i = 0; i < m_nSignalPoints; i++) output[i] = convolve (input, m_dSignalInc, i, m_nSignalPoints); } else if (m_idFilterMethod == FILTER_METHOD_FOURIER) { @@ -571,6 +584,9 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const std::complex* fftSignal = new std::complex [m_nFilterPoints]; finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, FORWARD); delete inputSignal; +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (i = 0; i < m_nFilterPoints; i++) fftSignal[i] *= m_adFilter[i]; double* inverseFourier = new double [m_nFilterPoints]; @@ -588,6 +604,9 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const std::complex* fftSignal = new std::complex [m_nFilterPoints]; finiteFourierTransform (inputSignal, fftSignal, FORWARD); delete inputSignal; +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (i = 0; i < m_nFilterPoints; i++) fftSignal[i] *= m_adFilter[i]; double* inverseFourier = new double [m_nFilterPoints]; @@ -616,6 +635,9 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const m_adComplexFftInput[i][0] = input[i]; fftw_execute (m_complexPlanForward); +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (i = 0; i < m_nFilterPoints; i++) { m_adComplexFftSignal[i][0] = m_adFilter[i] * m_adComplexFftOutput[i][0]; m_adComplexFftSignal[i][1] = m_adFilter[i] * m_adComplexFftOutput[i][1]; -- 2.34.1