mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-24 17:08:36 -05:00
WDSP: impulse responses refactoring (2)
This commit is contained in:
parent
62f05b3706
commit
7319e4cb88
18
wdsp/TXA.cpp
18
wdsp/TXA.cpp
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user