FFT factory: reuse flag

This commit is contained in:
f4exb 2020-03-13 07:46:08 +01:00
parent 37082ce41d
commit 30694b4be7
6 changed files with 44 additions and 9 deletions

View File

@ -16,6 +16,8 @@ public:
virtual Complex* in() = 0;
virtual Complex* out() = 0;
virtual void setReuse(bool reuse) = 0;
static FFTEngine* create(const QString& fftWisdomFileName);
};

View File

@ -53,6 +53,7 @@ void FFTFactory::preallocate(
{
fftEngines.push_back(AllocatedEngine());
fftEngines.back().m_engine = FFTEngine::create(m_fftwWisdomFileName);
fftEngines.back().m_engine->setReuse(false);
fftEngines.back().m_engine->configure(fftSize, false);
}
@ -60,6 +61,7 @@ void FFTFactory::preallocate(
{
invFFTEngines.push_back(AllocatedEngine());
invFFTEngines.back().m_engine = FFTEngine::create(m_fftwWisdomFileName);
fftEngines.back().m_engine->setReuse(false);
invFFTEngines.back().m_engine->configure(fftSize, true);
}
}
@ -79,6 +81,7 @@ unsigned int FFTFactory::getEngine(unsigned int fftSize, bool inverse, FFTEngine
engines.push_back(AllocatedEngine());
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);
*engine = engines.back().m_engine;
return 0;
@ -108,6 +111,7 @@ unsigned int FFTFactory::getEngine(unsigned int fftSize, bool inverse, FFTEngine
engines.push_back(AllocatedEngine());
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);
*engine = engines.back().m_engine;
return engines.size() - 1;

View File

@ -4,7 +4,12 @@
FFTWEngine::FFTWEngine(const QString& fftWisdomFileName) :
m_fftWisdomFileName(fftWisdomFileName),
m_plans(),
<<<<<<< ours
m_currentPlan(NULL)
=======
m_currentPlan(nullptr),
m_reuse(true)
>>>>>>> theirs
{
}
@ -15,12 +20,26 @@ FFTWEngine::~FFTWEngine()
void FFTWEngine::configure(int n, bool inverse)
{
<<<<<<< ours
for(Plans::const_iterator it = m_plans.begin(); it != m_plans.end(); ++it) {
if(((*it)->n == n) && ((*it)->inverse == inverse)) {
m_currentPlan = *it;
return;
}
}
=======
if (m_reuse)
{
for (Plans::const_iterator it = m_plans.begin(); it != m_plans.end(); ++it)
{
if (((*it)->n == n) && ((*it)->inverse == inverse))
{
m_currentPlan = *it;
return;
}
}
}
>>>>>>> theirs
m_currentPlan = new Plan;
m_currentPlan->n = n;

View File

@ -12,13 +12,15 @@
class SDRBASE_API FFTWEngine : public FFTEngine {
public:
FFTWEngine(const QString& fftWisdomFileName);
~FFTWEngine();
virtual ~FFTWEngine();
void configure(int n, bool inverse);
void transform();
virtual void configure(int n, bool inverse);
virtual void transform();
Complex* in();
Complex* out();
virtual Complex* in();
virtual Complex* out();
virtual void setReuse(bool reuse) { m_reuse = reuse; }
protected:
static QMutex m_globalPlanMutex;
@ -34,6 +36,7 @@ protected:
typedef std::list<Plan*> Plans;
Plans m_plans;
Plan* m_currentPlan;
bool m_reuse;
void freeAll();
};

View File

@ -23,3 +23,8 @@ Complex* KissEngine::out()
{
return &m_out[0];
}
void KissEngine::setReuse(bool reuse)
{
(void) reuse;
}

View File

@ -7,11 +7,13 @@
class SDRBASE_API KissEngine : public FFTEngine {
public:
void configure(int n, bool inverse);
void transform();
virtual void configure(int n, bool inverse);
virtual void transform();
Complex* in();
Complex* out();
virtual Complex* in();
virtual Complex* out();
virtual void setReuse(bool reuse);
protected:
typedef kissfft<Real, Complex> KissFFT;