kopia lustrzana https://github.com/f4exb/sdrangel
WDSP: impulse responses refactoring (2)
rodzic
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_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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, 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_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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, 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_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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
|
||||
delete[] (impulse);
|
||||
}
|
||||
}
|
||||
|
@ -1080,9 +1077,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
|
|||
if (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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
|
||||
delete[] (impulse);
|
||||
}
|
||||
|
||||
|
@ -1091,9 +1087,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
|
|||
if (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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
|
||||
delete[] impulse;
|
||||
}
|
||||
|
||||
|
@ -1102,9 +1097,8 @@ void TXA::SetBPSWindow (TXA& txa, int _wintype)
|
|||
if (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));
|
||||
a->mults = FIR::fftcv_mults (2 * a->size, impulse);
|
||||
FIR::fftcv_mults (a->mults, 2 * a->size, impulse);
|
||||
delete[] impulse;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ void BPS::calc()
|
|||
infilt.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));
|
||||
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);
|
||||
CRev = fftwf_plan_dft_1d(2 * size, (fftwf_complex *) product.data(), (fftwf_complex *) out, FFTW_BACKWARD, FFTW_PATIENT);
|
||||
delete[]impulse;
|
||||
|
@ -56,7 +56,6 @@ void BPS::decalc()
|
|||
{
|
||||
fftwf_destroy_plan(CRev);
|
||||
fftwf_destroy_plan(CFor);
|
||||
delete[] mults;
|
||||
}
|
||||
|
||||
BPS::BPS(
|
||||
|
|
|
@ -56,7 +56,7 @@ public:
|
|||
double f_high;
|
||||
std::vector<float> infilt;
|
||||
std::vector<float> product;
|
||||
float* mults;
|
||||
std::vector<float> mults;
|
||||
double samplerate;
|
||||
int wintype;
|
||||
double gain;
|
||||
|
|
|
@ -43,7 +43,8 @@ void EMPH::calc()
|
|||
{
|
||||
infilt = new float[2 * size * 2];
|
||||
product = new float[2 * size * 2];
|
||||
mults = FCurve::fc_mults(
|
||||
FCurve::fc_mults(
|
||||
mults,
|
||||
size,
|
||||
f_low,
|
||||
f_high,
|
||||
|
@ -63,7 +64,6 @@ void EMPH::decalc()
|
|||
{
|
||||
fftwf_destroy_plan(CRev);
|
||||
fftwf_destroy_plan(CFor);
|
||||
delete[] mults;
|
||||
delete[] product;
|
||||
delete[] infilt;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,8 @@ warren@wpratt.com
|
|||
#ifndef _emph_h
|
||||
#define _emph_h
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "fftw3.h"
|
||||
#include "export.h"
|
||||
|
||||
|
@ -52,7 +54,7 @@ public:
|
|||
double f_high;
|
||||
float* infilt;
|
||||
float* product;
|
||||
float* mults;
|
||||
std::vector<float> mults;
|
||||
double rate;
|
||||
fftwf_plan CFor;
|
||||
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;
|
||||
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);
|
||||
std::copy(_mults, _mults + 2*size*2, mults.begin());
|
||||
delete[] _mults;
|
||||
std::copy(_mults.begin(), _mults.end(), mults.begin());
|
||||
}
|
||||
|
||||
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
|
||||
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));
|
||||
fc_impulse (impulse, size + 1, f0, f1, g0, g1, curve, samplerate, scale, ctfmode, wintype);
|
||||
float* mults = FIR::fftcv_mults(2 * size, impulse.data());
|
||||
return mults;
|
||||
FIR::fftcv_mults(mults, 2 * size, impulse.data());
|
||||
}
|
||||
|
||||
} // namespace WDSP
|
||||
|
|
|
@ -38,7 +38,7 @@ class WDSP_API FCurve
|
|||
{
|
||||
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 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
|
||||
|
|
|
@ -35,14 +35,14 @@ warren@pratt.one
|
|||
|
||||
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);
|
||||
fftwf_plan ptmp = fftwf_plan_dft_1d(
|
||||
NM,
|
||||
(fftwf_complex *) cfft_impulse.data(),
|
||||
(fftwf_complex *) mults,
|
||||
(fftwf_complex *) mults.data(),
|
||||
FFTW_FORWARD,
|
||||
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]));
|
||||
fftwf_execute (ptmp);
|
||||
fftwf_destroy_plan (ptmp);
|
||||
return mults;
|
||||
}
|
||||
|
||||
float* FIR::get_fsamp_window(int N, int wintype)
|
||||
|
|
|
@ -36,7 +36,7 @@ namespace WDSP {
|
|||
class WDSP_API FIR
|
||||
{
|
||||
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 (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);
|
||||
|
|
Ładowanie…
Reference in New Issue