1 #include "FFTPlanner.h"
2 
getInstance()3 FFTPlanner& FFTPlanner::getInstance()
4 {
5     static FFTPlanner instance;
6     return instance;
7 }
8 
forwardFFT(uint32_t windowSize)9 fftwf_plan FFTPlanner::forwardFFT(uint32_t windowSize)
10 {
11     std::unique_lock<std::mutex> lock(_mutex);
12 
13     auto it = _forwardPlans.find(windowSize);
14     if (it != _forwardPlans.end())
15         return it->second.get();
16 
17     const uint32_t numBins = windowSize / 2 + 1;
18     fftwf_real_vector real(windowSize);
19     fftwf_complex_vector cpx(numBins);
20 
21     int planFlags = 0;
22 #if defined(USE_IMPATIENT_FFT_PLANNING)
23     planFlags |= FFTW_ESTIMATE;
24 #else
25     planFlags |= FFTW_MEASURE;
26 #endif
27     fftwf_plan plan = fftwf_plan_dft_r2c_1d(windowSize, real.data(), (fftwf_complex *)cpx.data(), planFlags);
28     _forwardPlans[windowSize] = fftwf_plan_u(plan);
29     return plan;
30 }
31