Use OpenMP for signal filtering
authorKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 21 Mar 2018 16:28:38 +0000 (10:28 -0600)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 21 Mar 2018 16:28:38 +0000 (10:28 -0600)
libctsim/procsignal.cpp

index dc024adbbbfd00c2cc0771b11d03a1a19f8affec..3a28676ff606bbb94c5f4b9753f8b189d2c5268d 100644 (file)
@@ -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<double>* fftSignal = new std::complex<double> [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<double>* fftSignal = new std::complex<double> [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];