]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/blobdiff - src/fft_fftw.cpp
test: Decrease accuracy limit
[hercules2020/kcf.git] / src / fft_fftw.cpp
index a8dbe933937f743d49b228f80e8123527f36a365..1d26269baaaa3a59dcfdb66e863bd9ef49dda9db 100644 (file)
@@ -1,4 +1,5 @@
 #include "fft_fftw.h"
+#include <unistd.h>
 
 #ifdef OPENMP
 #include <omp.h>
@@ -6,7 +7,7 @@
 
 Fftw::Fftw(){}
 
-fftwf_plan Fftw::create_plan_fwd(uint howmany)
+fftwf_plan Fftw::create_plan_fwd(uint howmany) const
 {
     cv::Mat mat_in = cv::Mat::zeros(howmany * m_height, m_width, CV_32F);
     ComplexMat mat_out(m_height, m_width / 2 + 1, howmany);
@@ -22,7 +23,7 @@ fftwf_plan Fftw::create_plan_fwd(uint howmany)
     return fftwf_plan_many_dft_r2c(rank, n, howmany, in, inembed, istride, idist, out, onembed, ostride, odist, FFTW_PATIENT);
 }
 
-fftwf_plan Fftw::create_plan_inv(uint howmany)
+fftwf_plan Fftw::create_plan_inv(uint howmany) const
 {
     ComplexMat mat_in(m_height, m_width / 2 + 1, howmany);
     cv::Mat mat_out = cv::Mat::zeros(howmany * m_height, m_width, CV_32F);
@@ -42,12 +43,13 @@ void Fftw::init(unsigned width, unsigned height, unsigned num_of_feats, unsigned
 {
     Fft::init(width, height, num_of_feats, num_of_scales);
 
-#if !defined(CUFFTW)
+#if !defined(CUFFTW) && defined(BIG_BATCH)
     fftw_init_threads();
   #if defined(OPENMP)
     fftw_plan_with_nthreads(omp_get_max_threads());
   #else
-    fftw_plan_with_nthreads(4);
+    int np = sysconf(_SC_NPROCESSORS_ONLN);
+    fftw_plan_with_nthreads(np);
   #endif
 #endif
 
@@ -107,9 +109,10 @@ void Fftw::forward_window(MatScaleFeats  &feat, ComplexMat & complex_result, Mat
 
     if (n_scales == 1)
         fftwf_execute_dft_r2c(plan_fw, in, out);
+#ifdef BIG_BATCH
     else
         fftwf_execute_dft_r2c(plan_fw_all_scales, in, out);
-    return;
+#endif
 }
 
 void Fftw::inverse(ComplexMat &complex_input, MatScales &real_result)
@@ -131,13 +134,13 @@ void Fftw::inverse(ComplexMat &complex_input, MatScales &real_result)
 
 Fftw::~Fftw()
 {
-    fftwf_destroy_plan(plan_f);
-    fftwf_destroy_plan(plan_fw);
-    fftwf_destroy_plan(plan_i_1ch);
-
-    if (BIG_BATCH_MODE) {
-        fftwf_destroy_plan(plan_f_all_scales);
-        fftwf_destroy_plan(plan_i_all_scales);
-        fftwf_destroy_plan(plan_fw_all_scales);
-    }
+    if (plan_f) fftwf_destroy_plan(plan_f);
+    if (plan_fw) fftwf_destroy_plan(plan_fw);
+    if (plan_i_1ch) fftwf_destroy_plan(plan_i_1ch);
+
+#ifdef BIG_BATCH
+    if (plan_f_all_scales) fftwf_destroy_plan(plan_f_all_scales);
+    if (plan_fw_all_scales) fftwf_destroy_plan(plan_fw_all_scales);
+    if (plan_i_all_scales) fftwf_destroy_plan(plan_i_all_scales);
+#endif
 }