1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 11:12:27 -04:00

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* in() = 0;
virtual Complex* out() = 0; virtual Complex* out() = 0;
virtual void setReuse(bool reuse) = 0;
static FFTEngine* create(const QString& fftWisdomFileName); static FFTEngine* create(const QString& fftWisdomFileName);
}; };

View File

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

View File

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

View File

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

View File

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

View File

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