diff --git a/wdsp/cfir.cpp b/wdsp/cfir.cpp index 456565df5..676d25b1b 100644 --- a/wdsp/cfir.cpp +++ b/wdsp/cfir.cpp @@ -34,11 +34,10 @@ namespace WDSP { void CFIR::calc() { - float* impulse; + std::vector impulse; scale = 1.0 / (float)(2 * size); - impulse = cfir_impulse (nc, DD, R, Pairs, runrate, cicrate, cutoff, xtype, xbw, 1, scale, wintype); - p = new FIRCORE(size, in, out, nc, mp, impulse); - delete[] impulse; + cfir_impulse (impulse, nc, DD, R, Pairs, runrate, cicrate, cutoff, xtype, xbw, 1, scale, wintype); + p = new FIRCORE(size, in, out, nc, mp, impulse.data()); } void CFIR::decalc() @@ -142,7 +141,8 @@ void CFIR::setOutRate(int rate) calc(); } -float* CFIR::cfir_impulse ( +void CFIR::cfir_impulse ( + std::vector& impulse, int _N, int _DD, int _R, @@ -175,7 +175,6 @@ float* CFIR::cfir_impulse ( double ri; double mag = 0; double fn; - float* impulse; std::vector A(_N); double ft = _cutoff / _cicrate; // normalized cutoff frequency int u_samps = (_N + 1) / 2; // number of unique samples, OK for odd or even N @@ -254,8 +253,8 @@ float* CFIR::cfir_impulse ( else for (i = u_samps, j = 1; i < _N; i++, j++) A[i] = A[u_samps - j]; - impulse = FIR::fir_fsamp (_N, A.data(), _rtype, 1.0, _wintype); - return impulse; + impulse.resize(2 * _N); + FIR::fir_fsamp (impulse, _N, A.data(), _rtype, 1.0, _wintype); } /******************************************************************************************************** diff --git a/wdsp/cfir.hpp b/wdsp/cfir.hpp index 155a24286..453f96250 100644 --- a/wdsp/cfir.hpp +++ b/wdsp/cfir.hpp @@ -28,6 +28,8 @@ warren@wpratt.com #ifndef wdsp_cfir_h #define wdsp_cfir_h +#include + #include "export.h" namespace WDSP { @@ -83,7 +85,8 @@ public: void setSamplerate(int rate); void setSize(int size); void setOutRate(int rate); - static float* cfir_impulse ( + static void cfir_impulse ( + std::vector& impulse, int N, int DD, int R, diff --git a/wdsp/emphp.cpp b/wdsp/emphp.cpp index 33c7c28d3..cb3084ef5 100644 --- a/wdsp/emphp.cpp +++ b/wdsp/emphp.cpp @@ -53,7 +53,6 @@ EMPHP::EMPHP( double _f_high ) { - float* impulse; run = _run; position = _position; size = _size; @@ -65,7 +64,9 @@ EMPHP::EMPHP( ctype = _ctype; f_low = _f_low; f_high = _f_high; - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc); + FCurve::fc_impulse ( + impulse, nc, f_low, f_high, @@ -76,8 +77,7 @@ EMPHP::EMPHP( 1.0 / (2.0 * size), 0, 0 ); - p = new FIRCORE(size, in, out, nc, mp, impulse); - delete[] (impulse); + p = new FIRCORE(size, in, out, nc, mp, impulse.data()); } EMPHP::~EMPHP() @@ -107,9 +107,10 @@ void EMPHP::setBuffers(float* _in, float* _out) void EMPHP::setSamplerate(int _rate) { - float* impulse; rate = _rate; - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc); + FCurve::fc_impulse ( + impulse, nc, f_low, f_high, @@ -120,16 +121,16 @@ void EMPHP::setSamplerate(int _rate) 1.0 / (2.0 * size), 0, 0 ); - p->setImpulse(impulse, 1); - delete[] (impulse); + p->setImpulse(impulse.data(), 1); } void EMPHP::setSize(int _size) { - float* impulse; size = _size; p->setSize(size); - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc); + FCurve::fc_impulse ( + impulse, nc, f_low, f_high, @@ -141,8 +142,7 @@ void EMPHP::setSize(int _size) 0, 0 ); - p->setImpulse(impulse, 1); - delete[] (impulse); + p->setImpulse(impulse.data(), 1); } /******************************************************************************************************** @@ -167,12 +167,12 @@ void EMPHP::setMP(int _mp) void EMPHP::setNC(int _nc) { - float* impulse; - if (nc != _nc) { nc = _nc; - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc); + FCurve::fc_impulse ( + impulse, nc, f_low, f_high, @@ -184,20 +184,19 @@ void EMPHP::setNC(int _nc) 0, 0 ); - p->setNc(nc, impulse); - delete[] (impulse); + p->setNc(nc, impulse.data()); } } void EMPHP::setFreqs(double low, double high) { - float* impulse; - if (f_low != low || f_high != high) { f_low = low; f_high = high; - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc); + FCurve::fc_impulse ( + impulse, nc, f_low, f_high, @@ -209,8 +208,7 @@ void EMPHP::setFreqs(double low, double high) 0, 0 ); - p->setImpulse(impulse, 1); - delete[] (impulse); + p->setImpulse(impulse.data(), 1); } } diff --git a/wdsp/eq.cpp b/wdsp/eq.cpp index 73ed34ee9..b2d61bc15 100644 --- a/wdsp/eq.cpp +++ b/wdsp/eq.cpp @@ -44,12 +44,12 @@ namespace WDSP { void EQ::eq_mults (std::vector& mults, int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype) { - float* impulse = EQP::eq_impulse (size + 1, nfreqs, F, G, samplerate, scale, ctfmode, wintype); - float* _mults = FIR::fftcv_mults(2 * size, impulse); + std::vector impulse; + EQP::eq_impulse (impulse, size + 1, nfreqs, F, G, samplerate, scale, ctfmode, wintype); + float* _mults = FIR::fftcv_mults(2 * size, impulse.data()); mults.resize(2 * size * 2); std::copy(_mults, _mults + 2*size*2, mults.begin()); delete[] _mults; - delete[] impulse; } void EQ::calc() diff --git a/wdsp/eqp.cpp b/wdsp/eqp.cpp index c211e5a2e..6237d707a 100644 --- a/wdsp/eqp.cpp +++ b/wdsp/eqp.cpp @@ -42,25 +42,34 @@ int EQP::fEQcompare (const void * a, const void * b) return 1; } -float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, double samplerate, double scale, int ctfmode, int wintype) +void EQP::eq_impulse ( + std::vector& impulse, + int N, + int _nfreqs, + const float* F, + const float* G, + double samplerate, + double scale, + int ctfmode, + int wintype +) { - std::vector fp(nfreqs + 2); - std::vector gp(nfreqs + 2); + std::vector fp(_nfreqs + 2); + std::vector gp(_nfreqs + 2); std::vector A(N / 2 + 1); - float* sary = new float[2 * nfreqs]; + float* sary = new float[2 * _nfreqs]; double gpreamp; double f; double frac; - float* impulse; int i; int j; int mid; fp[0] = 0.0; - fp[nfreqs + 1] = 1.0; + fp[_nfreqs + 1] = 1.0; gpreamp = G[0]; - for (i = 1; i <= nfreqs; i++) + for (i = 1; i <= _nfreqs; i++) { fp[i] = (float) (2.0 * F[i] / samplerate); @@ -73,22 +82,22 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl gp[i] = G[i]; } - for (i = 1, j = 0; i <= nfreqs; i++, j+=2) + for (i = 1, j = 0; i <= _nfreqs; i++, j+=2) { sary[j + 0] = fp[i]; sary[j + 1] = gp[i]; } - qsort (sary, nfreqs, 2 * sizeof (float), fEQcompare); + qsort (sary, _nfreqs, 2 * sizeof (float), fEQcompare); - for (i = 1, j = 0; i <= nfreqs; i++, j+=2) + for (i = 1, j = 0; i <= _nfreqs; i++, j+=2) { fp[i] = sary[j + 0]; gp[i] = sary[j + 1]; } gp[0] = gp[1]; - gp[nfreqs + 1] = gp[nfreqs]; + gp[_nfreqs + 1] = gp[_nfreqs]; mid = N / 2; j = 0; @@ -98,7 +107,7 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl { f = (double)i / (double)mid; - while ((f > fp[j + 1]) && (j < nfreqs)) + while ((f > fp[j + 1]) && (j < _nfreqs)) j++; frac = (f - fp[j]) / (fp[j + 1] - fp[j]); @@ -111,7 +120,7 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl { f = ((double)i + 0.5) / (double)mid; - while ((f > fp[j + 1]) && (j < nfreqs)) + while ((f > fp[j + 1]) && (j < _nfreqs)) j++; frac = (f - fp[j]) / (fp[j + 1] - fp[j]); @@ -132,7 +141,7 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl if (N & 1) { low = (int)(fp[1] * mid); - high = (int)(fp[nfreqs] * mid + 0.5); + high = (int)(fp[_nfreqs] * mid + 0.5); lowmag = A[low]; highmag = A[high]; flow4 = pow((double)low / (double)mid, 4.0); @@ -160,7 +169,7 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl else { low = (int)(fp[1] * mid - 0.5); - high = (int)(fp[nfreqs] * mid - 0.5); + high = (int)(fp[_nfreqs] * mid - 0.5); lowmag = A[low]; highmag = A[high]; flow4 = pow((double)low / (double)mid, 4.0); @@ -187,13 +196,14 @@ float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, doubl } } + impulse.resize(2 * N); + if (N & 1) - impulse = FIR::fir_fsamp_odd(N, A.data(), 1, 1.0, wintype); + FIR::fir_fsamp_odd(impulse, N, A.data(), 1, 1.0, wintype); else - impulse = FIR::fir_fsamp(N, A.data(), 1, 1.0, wintype); + FIR::fir_fsamp(impulse, N, A.data(), 1, 1.0, wintype); delete[] sary; - return impulse; } /******************************************************************************************************** @@ -218,7 +228,7 @@ EQP::EQP( ) { // NOTE: 'nc' must be >= 'size' - float* impulse; + std::vector impulse; run = _run; size = _size; nc = _nc; @@ -233,9 +243,8 @@ EQP::EQP( ctfmode = _ctfmode; wintype = _wintype; samplerate = (double) _samplerate; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore = new FIRCORE(size, in, out, nc, mp, impulse); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore = new FIRCORE(size, in, out, nc, mp, impulse.data()); } EQP::~EQP() @@ -265,21 +274,19 @@ void EQP::setBuffers(float* _in, float* _out) void EQP::setSamplerate(int rate) { - float* impulse; + std::vector impulse; samplerate = rate; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } void EQP::setSize(int _size) { - float* impulse; + std::vector impulse; size = _size; fircore->setSize(size); - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } /******************************************************************************************************** @@ -295,14 +302,13 @@ void EQP::setRun(int _run) void EQP::setNC(int _nc) { - float* impulse; + std::vector impulse; if (nc != _nc) { nc = _nc; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setNc(nc, impulse); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setNc(nc, impulse.data()); } } @@ -317,38 +323,35 @@ void EQP::setMP(int _mp) void EQP::setProfile(int _nfreqs, const float* _F, const float* _G) { - float* impulse; + std::vector impulse; nfreqs = _nfreqs; F.resize(nfreqs + 1); G.resize(nfreqs + 1); std::copy(_F, _F + (_nfreqs + 1), F.begin()); std::copy(_G, _G + (_nfreqs + 1), G.begin()); - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } void EQP::setCtfmode(int _mode) { - float* impulse; + std::vector impulse; ctfmode = _mode; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } void EQP::setWintype(int _wintype) { - float* impulse; + std::vector impulse; wintype = _wintype; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } void EQP::setGrphEQ(const int *rxeq) { // three band equalizer (legacy compatibility) - float* impulse; + std::vector impulse; nfreqs = 4; F.resize(nfreqs + 1); G.resize(nfreqs + 1); @@ -362,14 +365,13 @@ void EQP::setGrphEQ(const int *rxeq) G[3] = (float)rxeq[2]; G[4] = (float)rxeq[3]; ctfmode = 0; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } void EQP::setGrphEQ10(const int *rxeq) { // ten band equalizer (legacy compatibility) - float* impulse; + std::vector impulse; nfreqs = 10; F.resize(nfreqs + 1); G.resize(nfreqs + 1); @@ -386,9 +388,8 @@ void EQP::setGrphEQ10(const int *rxeq) for (int i = 0; i <= nfreqs; i++) G[i] = (float)rxeq[i]; ctfmode = 0; - impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse, 1); - delete[] impulse; + eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); + fircore->setImpulse(impulse.data(), 1); } } // namespace WDSP diff --git a/wdsp/eqp.hpp b/wdsp/eqp.hpp index df4167355..fce8193bc 100644 --- a/wdsp/eqp.hpp +++ b/wdsp/eqp.hpp @@ -92,7 +92,17 @@ public: void setGrphEQ(const int *rxeq); void setGrphEQ10(const int *rxeq); - static float* eq_impulse (int N, int nfreqs, const float* F, const float* G, double samplerate, double scale, int ctfmode, int wintype); + static void eq_impulse ( + std::vector& impulse, + int N, + int nfreqs, + const float* F, + const float* G, + double samplerate, + double scale, + int ctfmode, + int wintype + ); private: static int fEQcompare (const void * a, const void * b); diff --git a/wdsp/fcurve.cpp b/wdsp/fcurve.cpp index a6124ec2c..e0e9781c7 100644 --- a/wdsp/fcurve.cpp +++ b/wdsp/fcurve.cpp @@ -31,12 +31,11 @@ warren@wpratt.com namespace WDSP { -float* FCurve::fc_impulse (int nc, float f0, float f1, float g0, float, int curve, float samplerate, float scale, int ctfmode, int wintype) +void FCurve::fc_impulse (std::vector& impulse, int nc, float f0, float f1, float g0, float, int curve, float samplerate, float scale, int ctfmode, int wintype) { float* A = new float[nc / 2 + 1]; // (float *) malloc0 ((nc / 2 + 1) * sizeof (float)); int i; float fn, f; - float* impulse; int mid = nc / 2; float g0_lin = pow(10.0, g0 / 20.0); if (nc & 1) @@ -140,21 +139,21 @@ float* FCurve::fc_impulse (int nc, float f0, float f1, float g0, float, int curv } } } + if (nc & 1) - impulse = FIR::fir_fsamp_odd(nc, A, 1, 1.0, wintype); + FIR::fir_fsamp_odd(impulse, nc, A, 1, 1.0, wintype); else - impulse = FIR::fir_fsamp(nc, A, 1, 1.0, wintype); + FIR::fir_fsamp(impulse, nc, A, 1, 1.0, wintype); // print_impulse ("emph.txt", size + 1, impulse, 1, 0); delete[] (A); - return impulse; } // 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* impulse = fc_impulse (size + 1, f0, f1, g0, g1, curve, samplerate, scale, ctfmode, wintype); - float* mults = FIR::fftcv_mults(2 * size, impulse); - delete[] (impulse); + std::vector 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; } diff --git a/wdsp/fcurve.hpp b/wdsp/fcurve.hpp index d11d1ac68..4b137408a 100644 --- a/wdsp/fcurve.hpp +++ b/wdsp/fcurve.hpp @@ -28,6 +28,8 @@ warren@wpratt.com #ifndef wdsp_fcurve_h #define wdsp_fcurve_h +#include + #include "export.h" namespace WDSP { @@ -35,7 +37,7 @@ namespace WDSP { class WDSP_API FCurve { public: - static float* fc_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& 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); }; diff --git a/wdsp/fir.cpp b/wdsp/fir.cpp index 9fd5075a5..b2da83530 100644 --- a/wdsp/fir.cpp +++ b/wdsp/fir.cpp @@ -95,17 +95,16 @@ float* FIR::get_fsamp_window(int N, int wintype) return window; } -float* FIR::fir_fsamp_odd (int N, const float* A, int rtype, double scale, int wintype) +void FIR::fir_fsamp_odd (std::vector& c_impulse, int N, const float* A, int rtype, double scale, int wintype) { int mid = (N - 1) / 2; double mag; double phs; std::vector fcoef(N * 2); - auto *c_impulse = new float[N * 2]; fftwf_plan ptmp = fftwf_plan_dft_1d( N, (fftwf_complex *)fcoef.data(), - (fftwf_complex *)c_impulse, + (fftwf_complex *)c_impulse.data(), FFTW_BACKWARD, FFTW_PATIENT ); @@ -142,13 +141,11 @@ float* FIR::fir_fsamp_odd (int N, const float* A, int rtype, double scale, int w break; } delete[] window; - return c_impulse; } -float* FIR::fir_fsamp (int N, const float* A, int rtype, double scale, int wintype) +void FIR::fir_fsamp (std::vector& c_impulse, int N, const float* A, int rtype, double scale, int wintype) { double sum; - auto c_impulse = new float[N * 2]; if (N & 1) { @@ -202,7 +199,6 @@ float* FIR::fir_fsamp (int N, const float* A, int rtype, double scale, int winty break; } delete[] window; - return c_impulse; } float* FIR::fir_bandpass (int N, double f_low, double f_high, double samplerate, int wintype, int rtype, double scale) diff --git a/wdsp/fir.hpp b/wdsp/fir.hpp index e852d0eb5..a57d19630 100644 --- a/wdsp/fir.hpp +++ b/wdsp/fir.hpp @@ -37,8 +37,8 @@ class WDSP_API FIR { public: static float* fftcv_mults (int NM, float* c_impulse); - static float* fir_fsamp_odd (int N, const float* A, int rtype, double scale, int wintype); - static float* fir_fsamp (int N, const float* A, int rtype, double scale, int wintype); + static void fir_fsamp_odd (std::vector& c_impulse, int N, const float* A, int rtype, double scale, int wintype); + static void fir_fsamp (std::vector& 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 void mp_imp (int N, std::vector& fir, std::vector& mpfir, int pfactor, int polarity); diff --git a/wdsp/fmd.cpp b/wdsp/fmd.cpp index 14eafe841..8315497fe 100644 --- a/wdsp/fmd.cpp +++ b/wdsp/fmd.cpp @@ -143,11 +143,12 @@ FMD::FMD( lim_gain(0.0001), // 2.5 lim_pre_gain(0.01) // 0.4 { - float* impulse; calc(); // de-emphasis filter audio.resize(size * 2); - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc_de); + FCurve::fc_impulse ( + impulse, nc_de, (float) f_low, (float) f_high, @@ -158,12 +159,10 @@ FMD::FMD( 0, 0 ); - pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse); - delete[] impulse; + pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse.data()); // audio filter - impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud = new FIRCORE(size, out, out, nc_aud, mp_aud, impulse); - delete[] impulse; + float *impulseb = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); + paud = new FIRCORE(size, out, out, nc_aud, mp_aud, impulseb); } FMD::~FMD() @@ -248,12 +247,13 @@ void FMD::setBuffers(float* _in, float* _out) void FMD::setSamplerate(int _rate) { - float* impulse; decalc(); rate = _rate; calc(); // de-emphasis filter - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc_de); + FCurve::fc_impulse ( + impulse, nc_de, (float) f_low, (float) f_high, @@ -265,25 +265,25 @@ void FMD::setSamplerate(int _rate) 0, 0 ); - pde->setImpulse(impulse, 1); - delete[] impulse; + pde->setImpulse(impulse.data(), 1); // audio filter - impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud->setImpulse(impulse, 1); - delete[] impulse; + float* impulseb = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); + paud->setImpulse(impulseb, 1); + delete[] impulseb; plim->setSamplerate((int) rate); } void FMD::setSize(int _size) { - float* impulse; decalc(); size = _size; calc(); audio.resize(size * 2); // de-emphasis filter delete (pde); - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc_de); + FCurve::fc_impulse ( + impulse, nc_de, (float) f_low, (float) f_high, @@ -295,13 +295,12 @@ void FMD::setSize(int _size) 0, 0 ); - pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse); - delete[] impulse; + pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse.data()); // audio filter delete (paud); - impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud = new FIRCORE(size, out, out, nc_aud, mp_aud, impulse); - delete[] impulse; + float* impulseb = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); + paud = new FIRCORE(size, out, out, nc_aud, mp_aud, impulseb); + delete[] impulseb; plim->setSize(size); } @@ -331,12 +330,12 @@ void FMD::setCTCSSRun(int _run) void FMD::setNCde(int nc) { - float* impulse; - if (nc_de != nc) { nc_de = nc; - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc_de); + FCurve::fc_impulse ( + impulse, nc_de, (float) f_low, (float) f_high, @@ -348,8 +347,7 @@ void FMD::setNCde(int nc) 0, 0 ); - pde->setNc(nc_de, impulse); - delete[] impulse; + pde->setNc(nc_de, impulse.data()); } } @@ -405,14 +403,14 @@ void FMD::setLimGain(double gaindB) void FMD::setAFFilter(double low, double high) { - float* impulse; - if (f_low != low || f_high != high) { f_low = low; f_high = high; // de-emphasis filter - impulse = FCurve::fc_impulse ( + std::vector impulse(2 * nc_de); + FCurve::fc_impulse ( + impulse, nc_de, (float) f_low, (float) f_high, @@ -424,12 +422,11 @@ void FMD::setAFFilter(double low, double high) 0, 0 ); - pde->setImpulse(impulse, 1); - delete[] impulse; + pde->setImpulse(impulse.data(), 1); // audio filter - impulse = FIR::fir_bandpass (nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud->setImpulse(impulse, 1); - delete[] impulse; + float* impulseb = FIR::fir_bandpass (nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); + paud->setImpulse(impulseb, 1); + delete[] impulseb; } } diff --git a/wdsp/fmsq.cpp b/wdsp/fmsq.cpp index 5f83a4675..859800aff 100644 --- a/wdsp/fmsq.cpp +++ b/wdsp/fmsq.cpp @@ -36,7 +36,7 @@ void FMSQ::calc() { double delta; double theta; - float* impulse; + std::vector impulse; int i; // noise filter noise.resize(2 * size * 2); @@ -48,9 +48,8 @@ void FMSQ::calc() G[1] = 0.0; G[2] = 3.0; G[3] = (float) (+20.0 * log10(20000.0 / *pllpole)); - impulse = EQP::eq_impulse (nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); - p = new FIRCORE(size, trigger, noise.data(), nc, mp, impulse); - delete[] impulse; + EQP::eq_impulse (impulse, nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); + p = new FIRCORE(size, trigger, noise.data(), nc, mp, impulse.data()); // noise averaging avm = exp(-1.0 / (rate * avtau)); onem_avm = 1.0 - avm; @@ -286,14 +285,13 @@ void FMSQ::setThreshold(double threshold) void FMSQ::setNC(int _nc) { - float* impulse; + std::vector impulse; if (nc != _nc) { nc = _nc; - impulse = EQP::eq_impulse (nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); - p->setNc(nc, impulse); - delete[] impulse; + EQP::eq_impulse (impulse, nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); + p->setNc(nc, impulse.data()); } } diff --git a/wdsp/icfir.cpp b/wdsp/icfir.cpp index f22043a77..e03551417 100644 --- a/wdsp/icfir.cpp +++ b/wdsp/icfir.cpp @@ -34,11 +34,10 @@ namespace WDSP { void ICFIR::calc_icfir (ICFIR *a) { - float* impulse; + std::vector impulse; a->scale = 1.0f / (float)(2 * a->size); - impulse = icfir_impulse (a->nc, a->DD, a->R, a->Pairs, (float) a->runrate, (float) a->cicrate, a->cutoff, a->xtype, a->xbw, 1, a->scale, a->wintype); - a->p = new FIRCORE(a->size, a->in, a->out, a->nc, a->mp, impulse); - delete[] (impulse); + icfir_impulse (impulse, a->nc, a->DD, a->R, a->Pairs, (float) a->runrate, (float) a->cicrate, a->cutoff, a->xtype, a->xbw, 1, a->scale, a->wintype); + a->p = new FIRCORE(a->size, a->in, a->out, a->nc, a->mp, impulse.data()); } void ICFIR::decalc_icfir (ICFIR *a) @@ -145,7 +144,8 @@ void ICFIR::setOutRate_icfir (ICFIR *a, int rate) calc_icfir (a); } -float* ICFIR::icfir_impulse ( +void ICFIR::icfir_impulse ( + std::vector& impulse, int N, int DD, int R, @@ -178,7 +178,6 @@ float* ICFIR::icfir_impulse ( float ri; float mag; float fn; - float* impulse; auto* A = new float[N]; float ft = cutoff / cicrate; // normalized cutoff frequency int u_samps = (N + 1) / 2; // number of unique samples, OK for odd or even N @@ -239,10 +238,10 @@ float* ICFIR::icfir_impulse ( else for (i = u_samps, j = 1; i < N; i++, j++) A[i] = A[u_samps - j]; - impulse = FIR::fir_fsamp (N, A, rtype, 1.0, wintype); + impulse.resize(2 * N); + FIR::fir_fsamp (impulse, N, A, rtype, 1.0, wintype); delete[] (A); delete[] xistion; - return impulse; } diff --git a/wdsp/icfir.hpp b/wdsp/icfir.hpp index 775e7cb5c..1dd4f28c9 100644 --- a/wdsp/icfir.hpp +++ b/wdsp/icfir.hpp @@ -79,7 +79,8 @@ public: static void setSamplerate_icfir (ICFIR *a, int rate); static void setSize_icfir (ICFIR *a, int size); static void setOutRate_icfir (ICFIR *a, int rate); - static float* icfir_impulse ( + static void icfir_impulse ( + std::vector& impulse, int N, int DD, int R,