From 606d4fd7562c8d1a7b1b2fd1036972d6d6b32db3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 14 Mar 2020 06:40:38 +0100 Subject: [PATCH] Fixed FFT factory new plan allocation and effectively grab fftw-file option in the main parser --- sdrbase/dsp/fftfactory.cpp | 4 ++-- sdrbase/dsp/fftwengine.cpp | 23 ++++++++++++++++++++--- sdrbase/mainparser.cpp | 4 ++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/sdrbase/dsp/fftfactory.cpp b/sdrbase/dsp/fftfactory.cpp index b3bfc89aa..5367d4eae 100644 --- a/sdrbase/dsp/fftfactory.cpp +++ b/sdrbase/dsp/fftfactory.cpp @@ -82,7 +82,7 @@ unsigned int FFTFactory::getEngine(unsigned int fftSize, bool inverse, FFTEngine engines.back().m_inUse = true; engines.back().m_engine = FFTEngine::create(m_fftwWisdomFileName); engines.back().m_engine->setReuse(false); - engines.back().m_engine->configure(fftSize, true); + engines.back().m_engine->configure(fftSize, inverse); *engine = engines.back().m_engine; return 0; } @@ -112,7 +112,7 @@ unsigned int FFTFactory::getEngine(unsigned int fftSize, bool inverse, FFTEngine engines.back().m_inUse = true; engines.back().m_engine = FFTEngine::create(m_fftwWisdomFileName); engines.back().m_engine->setReuse(false); - engines.back().m_engine->configure(fftSize, true); + engines.back().m_engine->configure(fftSize, inverse); *engine = engines.back().m_engine; return engines.size() - 1; } diff --git a/sdrbase/dsp/fftwengine.cpp b/sdrbase/dsp/fftwengine.cpp index 391e98b69..049a04a77 100644 --- a/sdrbase/dsp/fftwengine.cpp +++ b/sdrbase/dsp/fftwengine.cpp @@ -48,10 +48,27 @@ void FFTWEngine::configure(int n, bool inverse) m_currentPlan->out = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * n); QTime t; t.start(); - m_globalPlanMutex.lock(); + m_globalPlanMutex.lock(); + + if (m_fftWisdomFileName.size() > 0) + { + int rc = fftwf_import_wisdom_from_filename(m_fftWisdomFileName.toStdString().c_str()); + + if (rc == 0) { // that's an error (undocumented) + qInfo("FFTWEngine::configure: importing from FFTW wisdom file: '%s' failed", qPrintable(m_fftWisdomFileName)); + } else { + qDebug("FFTWEngine::configure: successfully imported from FFTW wisdom file: '%s'", qPrintable(m_fftWisdomFileName)); + } + } + else + { + qDebug("FFTWEngine::configure: no FFTW wisdom file"); + } + m_currentPlan->plan = fftwf_plan_dft_1d(n, m_currentPlan->in, m_currentPlan->out, inverse ? FFTW_BACKWARD : FFTW_FORWARD, FFTW_PATIENT); - m_globalPlanMutex.unlock(); - qDebug("FFT: creating FFTW plan (n=%d,%s) took %dms", n, inverse ? "inverse" : "forward", t.elapsed()); + m_globalPlanMutex.unlock(); + + qDebug("FFT: creating FFTW plan (n=%d,%s) took %dms", n, inverse ? "inverse" : "forward", t.elapsed()); m_plans.push_back(m_currentPlan); } diff --git a/sdrbase/mainparser.cpp b/sdrbase/mainparser.cpp index 9dfcd514c..76759e360 100644 --- a/sdrbase/mainparser.cpp +++ b/sdrbase/mainparser.cpp @@ -88,6 +88,10 @@ void MainParser::parse(const QCoreApplication& app) qWarning() << "MainParser::parse: server port invalid. Defaulting to " << m_serverPort; } + // FFTWF wisdom file + + m_fftwfWindowFileName = m_parser.value(m_fftwfWisdomOption); + // MIMO - from version QStringList versionParts = app.applicationVersion().split(".");