#include "fft_fftw.h"
+#include <unistd.h>
#ifdef OPENMP
#include <omp.h>
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);
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);
{
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
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)
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
}