1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-21 12:26:34 -04:00

WDSP: impulse responses refactoring (2)

This commit is contained in:
f4exb 2024-08-09 06:33:00 +02:00
parent 62f05b3706
commit 7319e4cb88
10 changed files with 23 additions and 30 deletions

View File

@ -1040,9 +1040,8 @@ void TXA::SetBPSFreqs (TXA& txa, double _f_low, double _f_high)
{ {
a->f_low = _f_low; a->f_low = _f_low;
a->f_high = _f_high; a->f_high = _f_high;
delete[] (a->mults);
impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] (impulse); delete[] (impulse);
} }
@ -1052,9 +1051,8 @@ void TXA::SetBPSFreqs (TXA& txa, double _f_low, double _f_high)
{ {
a->f_low = _f_low; a->f_low = _f_low;
a->f_high = _f_high; a->f_high = _f_high;
delete[] (a->mults);
impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] (impulse); delete[] (impulse);
} }
@ -1064,9 +1062,8 @@ void TXA::SetBPSFreqs (TXA& txa, double _f_low, double _f_high)
{ {
a->f_low = _f_low; a->f_low = _f_low;
a->f_high = _f_high; a->f_high = _f_high;
delete[] (a->mults);
impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass(a->size + 1, _f_low, _f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] (impulse); delete[] (impulse);
} }
} }
@ -1080,9 +1077,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
if (a->wintype != _wintype) if (a->wintype != _wintype)
{ {
a->wintype = _wintype; a->wintype = _wintype;
delete[] (a->mults);
impulse = FIR::fir_bandpass(a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass(a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] (impulse); delete[] (impulse);
} }
@ -1091,9 +1087,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
if (a->wintype != _wintype) if (a->wintype != _wintype)
{ {
a->wintype = _wintype; a->wintype = _wintype;
delete[] (a->mults);
impulse = FIR::fir_bandpass(a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass(a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] impulse; delete[] impulse;
} }
@ -1102,9 +1097,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
if (a->wintype != _wintype) if (a->wintype != _wintype)
{ {
a->wintype = _wintype; a->wintype = _wintype;
delete[] (a->mults);
impulse = FIR::fir_bandpass (a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size)); impulse = FIR::fir_bandpass (a->size + 1, a->f_low, a->f_high, a->samplerate, a->wintype, 1, 1.0 / (float)(2 * a->size));
a->mults = FIR::fftcv_mults (2 * a->size, impulse); FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
delete[] impulse; delete[] impulse;
} }
} }

View File

@ -46,7 +46,7 @@ void BPS::calc()
infilt.resize(2 * size * 2); infilt.resize(2 * size * 2);
product.resize(2 * size * 2); product.resize(2 * size * 2);
impulse = FIR::fir_bandpass(size + 1, f_low, f_high, samplerate, wintype, 1, 1.0 / (float)(2 * size)); impulse = FIR::fir_bandpass(size + 1, f_low, f_high, samplerate, wintype, 1, 1.0 / (float)(2 * size));
mults = FIR::fftcv_mults(2 * size, impulse); FIR::fftcv_mults(mults, 2 * size, impulse);
CFor = fftwf_plan_dft_1d(2 * size, (fftwf_complex *) infilt.data(), (fftwf_complex *) product.data(), FFTW_FORWARD, FFTW_PATIENT); CFor = fftwf_plan_dft_1d(2 * size, (fftwf_complex *) infilt.data(), (fftwf_complex *) product.data(), FFTW_FORWARD, FFTW_PATIENT);
CRev = fftwf_plan_dft_1d(2 * size, (fftwf_complex *) product.data(), (fftwf_complex *) out, FFTW_BACKWARD, FFTW_PATIENT); CRev = fftwf_plan_dft_1d(2 * size, (fftwf_complex *) product.data(), (fftwf_complex *) out, FFTW_BACKWARD, FFTW_PATIENT);
delete[]impulse; delete[]impulse;
@ -56,7 +56,6 @@ void BPS::decalc()
{ {
fftwf_destroy_plan(CRev); fftwf_destroy_plan(CRev);
fftwf_destroy_plan(CFor); fftwf_destroy_plan(CFor);
delete[] mults;
} }
BPS::BPS( BPS::BPS(

View File

@ -56,7 +56,7 @@ public:
double f_high; double f_high;
std::vector<float> infilt; std::vector<float> infilt;
std::vector<float> product; std::vector<float> product;
float* mults; std::vector<float> mults;
double samplerate; double samplerate;
int wintype; int wintype;
double gain; double gain;

View File

@ -43,7 +43,8 @@ void EMPH::calc()
{ {
infilt = new float[2 * size * 2]; infilt = new float[2 * size * 2];
product = new float[2 * size * 2]; product = new float[2 * size * 2];
mults = FCurve::fc_mults( FCurve::fc_mults(
mults,
size, size,
f_low, f_low,
f_high, f_high,
@ -63,7 +64,6 @@ void EMPH::decalc()
{ {
fftwf_destroy_plan(CRev); fftwf_destroy_plan(CRev);
fftwf_destroy_plan(CFor); fftwf_destroy_plan(CFor);
delete[] mults;
delete[] product; delete[] product;
delete[] infilt; delete[] infilt;
} }

View File

@ -34,6 +34,8 @@ warren@wpratt.com
#ifndef _emph_h #ifndef _emph_h
#define _emph_h #define _emph_h
#include <vector>
#include "fftw3.h" #include "fftw3.h"
#include "export.h" #include "export.h"
@ -52,7 +54,7 @@ public:
double f_high; double f_high;
float* infilt; float* infilt;
float* product; float* product;
float* mults; std::vector<float> mults;
double rate; double rate;
fftwf_plan CFor; fftwf_plan CFor;
fftwf_plan CRev; fftwf_plan CRev;

View File

@ -46,10 +46,10 @@ void EQ::eq_mults (std::vector<float>& mults, int size, int nfreqs, float* F, fl
{ {
std::vector<float> impulse; std::vector<float> impulse;
EQP::eq_impulse (impulse, size + 1, nfreqs, F, G, samplerate, scale, ctfmode, wintype); EQP::eq_impulse (impulse, size + 1, nfreqs, F, G, samplerate, scale, ctfmode, wintype);
float* _mults = FIR::fftcv_mults(2 * size, impulse.data()); std::vector<float> _mults;
FIR::fftcv_mults(_mults, 2 * size, impulse.data());
mults.resize(2 * size * 2); mults.resize(2 * size * 2);
std::copy(_mults, _mults + 2*size*2, mults.begin()); std::copy(_mults.begin(), _mults.end(), mults.begin());
delete[] _mults;
} }
void EQ::calc() void EQ::calc()

View File

@ -149,12 +149,11 @@ void FCurve::fc_impulse (std::vector<float>& impulse, int nc, float f0, float f1
} }
// generate mask for Overlap-Save Filter // generate mask for Overlap-Save Filter
float* FCurve::fc_mults (int size, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype) float* FCurve::fc_mults (std::vector<float>& mults, int size, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype)
{ {
std::vector<float> impulse(2 * (size + 1)); std::vector<float> impulse(2 * (size + 1));
fc_impulse (impulse, size + 1, f0, f1, g0, g1, curve, samplerate, scale, ctfmode, wintype); fc_impulse (impulse, size + 1, f0, f1, g0, g1, curve, samplerate, scale, ctfmode, wintype);
float* mults = FIR::fftcv_mults(2 * size, impulse.data()); FIR::fftcv_mults(mults, 2 * size, impulse.data());
return mults;
} }
} // namespace WDSP } // namespace WDSP

View File

@ -38,7 +38,7 @@ class WDSP_API FCurve
{ {
public: public:
static void fc_impulse (std::vector<float>& impulse, int nc, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype); static void fc_impulse (std::vector<float>& impulse, int nc, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype);
static float* fc_mults (int size, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype); static float* fc_mults (std::vector<float>& mults, int size, float f0, float f1, float g0, float g1, int curve, float samplerate, float scale, int ctfmode, int wintype);
}; };
} // namespace WDSP } // namespace WDSP

View File

@ -35,14 +35,14 @@ warren@pratt.one
namespace WDSP { namespace WDSP {
float* FIR::fftcv_mults (int NM, float* c_impulse) void FIR::fftcv_mults (std::vector<float>& mults, int NM, float* c_impulse)
{ {
auto mults = new float[NM * 2]; mults.resize(NM * 2);
std::vector<float> cfft_impulse(NM * 2); std::vector<float> cfft_impulse(NM * 2);
fftwf_plan ptmp = fftwf_plan_dft_1d( fftwf_plan ptmp = fftwf_plan_dft_1d(
NM, NM,
(fftwf_complex *) cfft_impulse.data(), (fftwf_complex *) cfft_impulse.data(),
(fftwf_complex *) mults, (fftwf_complex *) mults.data(),
FFTW_FORWARD, FFTW_FORWARD,
FFTW_PATIENT FFTW_PATIENT
); );
@ -51,7 +51,6 @@ float* FIR::fftcv_mults (int NM, float* c_impulse)
std::copy(c_impulse, c_impulse + (NM / 2 + 1) * 2, &(cfft_impulse[NM - 2])); std::copy(c_impulse, c_impulse + (NM / 2 + 1) * 2, &(cfft_impulse[NM - 2]));
fftwf_execute (ptmp); fftwf_execute (ptmp);
fftwf_destroy_plan (ptmp); fftwf_destroy_plan (ptmp);
return mults;
} }
float* FIR::get_fsamp_window(int N, int wintype) float* FIR::get_fsamp_window(int N, int wintype)

View File

@ -36,7 +36,7 @@ namespace WDSP {
class WDSP_API FIR class WDSP_API FIR
{ {
public: public:
static float* fftcv_mults (int NM, float* c_impulse); static void fftcv_mults (std::vector<float>& mults, int NM, float* c_impulse);
static void fir_fsamp_odd (std::vector<float>& c_impulse, int N, const float* A, int rtype, double scale, int wintype); static void fir_fsamp_odd (std::vector<float>& c_impulse, int N, const float* A, int rtype, double scale, int wintype);
static void fir_fsamp (std::vector<float>& c_impulse, int N, const float* A, int rtype, double scale, int wintype); static void fir_fsamp (std::vector<float>& c_impulse, int N, const float* A, int rtype, double scale, int wintype);
static float* fir_bandpass (int N, double f_low, double f_high, double samplerate, int wintype, int rtype, double scale); static float* fir_bandpass (int N, double f_low, double f_high, double samplerate, int wintype, int rtype, double scale);