1 #include "FFTPlanner.h" 2 getInstance()3FFTPlanner& FFTPlanner::getInstance() 4 { 5 static FFTPlanner instance; 6 return instance; 7 } 8 forwardFFT(uint32_t windowSize)9fftwf_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