1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-18 21:58:37 -04:00

FT8 support: optimize FFT buffers and plan allocation

This commit is contained in:
f4exb
2023-01-25 16:30:40 +01:00
parent c1c64b23e4
commit c5a9f5fe12
7 changed files with 165 additions and 49 deletions
+19 -37
View File
@@ -26,14 +26,19 @@
#include "util.h"
#include "ft8plan.h"
#include "ft8plans.h"
#include "fftbuffers.h"
namespace FT8 {
FFTEngine::FFTEngine()
{}
{
m_fftBuffers = new FFTBuffers();
}
FFTEngine::~FFTEngine()
{}
{
delete m_fftBuffers;
}
//
// do just one FFT on samples[i0..i0+block]
@@ -57,15 +62,13 @@ std::vector<std::complex<float>> FFTEngine::one_fft(
// assert((int)samples.size() - i0 >= block);
int m_in_allocated = 0;
float *m_in = (float *)samples.data() + i0;
if ((((unsigned long long)m_in) % 16) != 0)
{
// m_in must be on a 16-byte boundary for FFTW.
m_in = (float *)fftwf_malloc(sizeof(float) * p->n_);
m_in = m_fftBuffers->getR(p->n_);
// assert(m_in);
m_in_allocated = 1;
for (int i = 0; i < block; i++)
{
if (i0 + i < nsamples)
@@ -79,7 +82,7 @@ std::vector<std::complex<float>> FFTEngine::one_fft(
}
}
fftwf_complex *m_out = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * ((p->n_ / 2) + 1));
fftwf_complex *m_out = m_fftBuffers->getC(p->n_);
// assert(m_out);
fftwf_execute_dft_r2c(plan, m_in, m_out);
@@ -93,12 +96,6 @@ std::vector<std::complex<float>> FFTEngine::one_fft(
out[bi] = std::complex<float>(re, im);
}
if (m_in_allocated) {
fftwf_free(m_in);
}
fftwf_free(m_out);
return out;
}
@@ -124,8 +121,8 @@ FFTEngine::ffts_t FFTEngine::ffts(const std::vector<float> &samples, int i0, int
fftwf_plan plan = p->fwd_;
// allocate our own b/c using p->m_in and p->m_out isn't thread-safe.
float *m_in = (float *)fftwf_malloc(sizeof(float) * p->n_);
fftwf_complex *m_out = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * ((p->n_ / 2) + 1));
float *m_in = m_fftBuffers->getR(p->n_);
fftwf_complex *m_out = m_fftBuffers->getC(p->n_);
// assert(m_in && m_out);
// float *m_in = p->r_;
@@ -158,9 +155,6 @@ FFTEngine::ffts_t FFTEngine::ffts(const std::vector<float> &samples, int i0, int
}
}
fftwf_free(m_in);
fftwf_free(m_out);
return bins;
}
@@ -183,8 +177,8 @@ std::vector<std::complex<float>> FFTEngine::one_fft_c(
Plan *p = FT8Plans::GetInstance()->getPlan(block);
fftwf_plan plan = p->cfwd_;
fftwf_complex *m_in = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_out = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_in = m_fftBuffers->getCCI(block);
fftwf_complex *m_out = m_fftBuffers->getCCO(block);
// assert(m_in && m_out);
for (int i = 0; i < block; i++)
@@ -214,9 +208,6 @@ std::vector<std::complex<float>> FFTEngine::one_fft_c(
out[bi] = c;
}
fftwf_free(m_in);
fftwf_free(m_out);
return out;
}
@@ -234,8 +225,8 @@ std::vector<std::complex<float>> FFTEngine::one_fft_cc(
Plan *p = FT8Plans::GetInstance()->getPlan(block);
fftwf_plan plan = p->cfwd_;
fftwf_complex *m_in = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_out = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_in = m_fftBuffers->getCCI(block);
fftwf_complex *m_out = m_fftBuffers->getCCO(block);
// assert(m_in && m_out);
for (int i = 0; i < block; i++)
@@ -266,9 +257,6 @@ std::vector<std::complex<float>> FFTEngine::one_fft_cc(
out[bi] = c;
}
fftwf_free(m_in);
fftwf_free(m_out);
return out;
}
@@ -281,8 +269,8 @@ std::vector<std::complex<float>> FFTEngine::one_ifft_cc(
Plan *p = FT8Plans::GetInstance()->getPlan(block);
fftwf_plan plan = p->crev_;
fftwf_complex *m_in = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_out = (fftwf_complex *)fftwf_malloc(block * sizeof(fftwf_complex));
fftwf_complex *m_in = m_fftBuffers->getCCI(block);
fftwf_complex *m_out = m_fftBuffers->getCCO(block);
// assert(m_in && m_out);
for (int bi = 0; bi < block; bi++)
@@ -306,9 +294,6 @@ std::vector<std::complex<float>> FFTEngine::one_ifft_cc(
out[i] = c;
}
fftwf_free(m_in);
fftwf_free(m_out);
return out;
}
@@ -320,8 +305,8 @@ std::vector<float> FFTEngine::one_ifft(const std::vector<std::complex<float>> &b
Plan *p = FT8Plans::GetInstance()->getPlan(block);
fftwf_plan plan = p->rev_;
fftwf_complex *m_in = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * ((p->n_ / 2) + 1));
float *m_out = (float *)fftwf_malloc(sizeof(float) * p->n_);
fftwf_complex *m_in = m_fftBuffers->getC(p->n_);
float *m_out = m_fftBuffers->getR(p->n_);
for (int bi = 0; bi < nbins; bi++)
{
@@ -339,9 +324,6 @@ std::vector<float> FFTEngine::one_ifft(const std::vector<std::complex<float>> &b
out[i] = m_out[i];
}
fftwf_free(m_in);
fftwf_free(m_out);
return out;
}