diff --git a/wdsp/RXA.cpp b/wdsp/RXA.cpp index 740653271..001e3ab26 100644 --- a/wdsp/RXA.cpp +++ b/wdsp/RXA.cpp @@ -1005,7 +1005,7 @@ void RXA::updateNBPFilters() if (a->fnfrun) { a->calc_impulse(); - a->fircore->setImpulse(a->impulse.data(), 1); + a->fircore->setImpulse(a->impulse, 1); } if (b->bpsnba->fnfrun) { @@ -1096,7 +1096,7 @@ void RXA::nbpSetNotchesRun(int _run) b->fnfrun = a->master_run; bpsnbaCheck(mode, _run); b->calc_impulse(); // recalc nbp impulse response - b->fircore->setImpulse(b->impulse.data(), 0); // calculate new filter masks + b->fircore->setImpulse(b->impulse, 0); // calculate new filter masks bpsnbaSet(); b->fircore->setUpdate(); // apply new filter masks } @@ -1113,7 +1113,7 @@ void RXA::nbpSetWindow(int _wintype) { a->wintype = _wintype; a->calc_impulse(); - a->fircore->setImpulse(a->impulse.data(), 1); + a->fircore->setImpulse(a->impulse, 1); } if (b->wintype != _wintype) @@ -1134,7 +1134,7 @@ void RXA::nbpSetAutoIncrease(int _autoincr) { a->autoincr = _autoincr; a->calc_impulse(); - a->fircore->setImpulse(a->impulse.data(), 1); + a->fircore->setImpulse(a->impulse, 1); } if (b->autoincr != _autoincr) diff --git a/wdsp/TXA.cpp b/wdsp/TXA.cpp index fedb213d1..7fe31d5fe 100644 --- a/wdsp/TXA.cpp +++ b/wdsp/TXA.cpp @@ -926,7 +926,7 @@ void TXA::setBandpassNC(int _nc) 1, a->gain / (double)(2 * a->size) ); - a->fircore->setNc(a->nc, impulse.data()); + a->fircore->setNc(impulse); } a = bp1; @@ -945,7 +945,7 @@ void TXA::setBandpassNC(int _nc) 1, a->gain / (double)(2 * a->size) ); - a->fircore->setNc(a->nc, impulse.data()); + a->fircore->setNc(impulse); } a = bp2; @@ -964,7 +964,7 @@ void TXA::setBandpassNC(int _nc) 1, a->gain / (double)(2 * a->size) ); - a->fircore->setNc(a->nc, impulse.data()); + a->fircore->setNc(impulse); } } diff --git a/wdsp/bandpass.cpp b/wdsp/bandpass.cpp index b9989cedc..e315fdf6b 100644 --- a/wdsp/bandpass.cpp +++ b/wdsp/bandpass.cpp @@ -77,7 +77,7 @@ BANDPASS::BANDPASS( 1, gain / (double)(2 * size) ); - fircore = new FIRCORE(size, in, out, nc, mp, impulse.data()); + fircore = new FIRCORE(size, in, out, mp, impulse); } BANDPASS::~BANDPASS() @@ -119,7 +119,7 @@ void BANDPASS::setSamplerate(int _rate) 1, gain / (double) (2 * size) ); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void BANDPASS::setSize(int _size) @@ -139,7 +139,7 @@ void BANDPASS::setSize(int _size) 1, gain / (double) (2 * size) ); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void BANDPASS::setGain(double _gain, int _update) @@ -156,7 +156,7 @@ void BANDPASS::setGain(double _gain, int _update) 1, gain / (double) (2 * size) ); - fircore->setImpulse(impulse.data(), _update); + fircore->setImpulse(impulse, _update); } void BANDPASS::calcBandpassFilter(double _f_low, double _f_high, double _gain) @@ -177,7 +177,7 @@ void BANDPASS::calcBandpassFilter(double _f_low, double _f_high, double _gain) 1, gain / (double)(2 * size) ); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } } @@ -203,7 +203,7 @@ void BANDPASS::setBandpassFreqs(double _f_low, double _f_high) gain / (double)(2 * size) ); - fircore->setImpulse(impulse.data(), 0); + fircore->setImpulse(impulse, 0); f_low = _f_low; f_high = _f_high; fircore->setUpdate(); @@ -227,7 +227,7 @@ void BANDPASS::SetBandpassNC(int _nc) 1, gain / (double)( 2 * size) ); - fircore->setNc(nc, impulse.data()); + fircore->setNc(impulse); } } diff --git a/wdsp/bpsnba.cpp b/wdsp/bpsnba.cpp index 5c28307e6..30b88f198 100644 --- a/wdsp/bpsnba.cpp +++ b/wdsp/bpsnba.cpp @@ -176,7 +176,7 @@ void BPSNBA::recalc_bpsnba_filter(int update) b->gain = gain; b->autoincr = autoincr; b->calc_impulse(); - b->fircore->setImpulse(b->impulse.data(), update); + b->fircore->setImpulse(b->impulse, update); } /******************************************************************************************************** diff --git a/wdsp/cfir.cpp b/wdsp/cfir.cpp index 676d25b1b..c67e5263f 100644 --- a/wdsp/cfir.cpp +++ b/wdsp/cfir.cpp @@ -37,7 +37,7 @@ void CFIR::calc() std::vector impulse; scale = 1.0 / (float)(2 * size); 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()); + p = new FIRCORE(size, in, out, mp, impulse); } void CFIR::decalc() diff --git a/wdsp/emphp.cpp b/wdsp/emphp.cpp index cb3084ef5..a57e008f3 100644 --- a/wdsp/emphp.cpp +++ b/wdsp/emphp.cpp @@ -68,16 +68,16 @@ EMPHP::EMPHP( FCurve::fc_impulse ( impulse, nc, - f_low, - f_high, - -20.0 * log10(f_high / f_low), + (float) f_low, + (float) f_high, + (float) (-20.0 * log10(f_high / f_low)), 0.0, ctype, - rate, - 1.0 / (2.0 * size), + (float) rate, + (float) (1.0 / (2.0 * size)), 0, 0 ); - p = new FIRCORE(size, in, out, nc, mp, impulse.data()); + p = new FIRCORE(size, in, out, mp, impulse); } EMPHP::~EMPHP() @@ -121,7 +121,7 @@ void EMPHP::setSamplerate(int _rate) 1.0 / (2.0 * size), 0, 0 ); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } void EMPHP::setSize(int _size) @@ -142,7 +142,7 @@ void EMPHP::setSize(int _size) 0, 0 ); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } /******************************************************************************************************** @@ -174,17 +174,17 @@ void EMPHP::setNC(int _nc) FCurve::fc_impulse ( impulse, nc, - f_low, - f_high, - -20.0 * log10(f_high / f_low), + (float) f_low, + (float) f_high, + (float) (-20.0 * log10(f_high / f_low)), 0.0, ctype, - rate, - 1.0 / (2.0 * size), + (float) rate, + (float) (1.0 / (2.0 * size)), 0, 0 ); - p->setNc(nc, impulse.data()); + p->setNc(impulse); } } @@ -208,7 +208,7 @@ void EMPHP::setFreqs(double low, double high) 0, 0 ); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } } diff --git a/wdsp/eqp.cpp b/wdsp/eqp.cpp index 6237d707a..37138451e 100644 --- a/wdsp/eqp.cpp +++ b/wdsp/eqp.cpp @@ -244,7 +244,7 @@ EQP::EQP( wintype = _wintype; samplerate = (double) _samplerate; 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()); + fircore = new FIRCORE(size, in, out, mp, impulse); } EQP::~EQP() @@ -277,7 +277,7 @@ void EQP::setSamplerate(int rate) std::vector impulse; samplerate = rate; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void EQP::setSize(int _size) @@ -286,7 +286,7 @@ void EQP::setSize(int _size) size = _size; fircore->setSize(size); eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } /******************************************************************************************************** @@ -308,7 +308,7 @@ void EQP::setNC(int _nc) { nc = _nc; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setNc(nc, impulse.data()); + fircore->setNc(impulse); } } @@ -330,7 +330,7 @@ void EQP::setProfile(int _nfreqs, const float* _F, const float* _G) std::copy(_F, _F + (_nfreqs + 1), F.begin()); std::copy(_G, _G + (_nfreqs + 1), G.begin()); eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void EQP::setCtfmode(int _mode) @@ -338,7 +338,7 @@ void EQP::setCtfmode(int _mode) std::vector impulse; ctfmode = _mode; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void EQP::setWintype(int _wintype) @@ -346,7 +346,7 @@ void EQP::setWintype(int _wintype) std::vector impulse; wintype = _wintype; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void EQP::setGrphEQ(const int *rxeq) @@ -366,7 +366,7 @@ void EQP::setGrphEQ(const int *rxeq) G[4] = (float)rxeq[3]; ctfmode = 0; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void EQP::setGrphEQ10(const int *rxeq) @@ -389,7 +389,7 @@ void EQP::setGrphEQ10(const int *rxeq) G[i] = (float)rxeq[i]; ctfmode = 0; eq_impulse (impulse, nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } } // namespace WDSP diff --git a/wdsp/fircore.cpp b/wdsp/fircore.cpp index 6c4be6a6e..8c673ddd4 100644 --- a/wdsp/fircore.cpp +++ b/wdsp/fircore.cpp @@ -99,7 +99,7 @@ void FIRCORE::calc(int _flip) if (mp) FIR::mp_imp (nc, impulse, imp, 16, 0); else - std::copy(impulse.begin(), impulse.begin() + nc * 2, imp.begin()); + std::copy(impulse.begin(), impulse.end(), imp.begin()); for (int i = 0; i < nfor; i++) { @@ -122,20 +122,19 @@ FIRCORE::FIRCORE( int _size, float* _in, float* _out, - int _nc, int _mp, - const float* _impulse + const std::vector& _impulse ) { size = _size; in = _in; out = _out; - nc = _nc; + nc = (int) (_impulse.size() / 2); mp = _mp; plan(); - impulse.resize(nc * 2); - imp.resize(nc * 2); - std::copy(_impulse, _impulse + nc * 2, impulse.begin()); + impulse.resize(_impulse.size()); + imp.resize(_impulse.size()); + std::copy(_impulse.begin(), _impulse.end(), impulse.begin()); calc(1); } @@ -204,21 +203,29 @@ void FIRCORE::setSize(int _size) calc(1); } -void FIRCORE::setImpulse(const float* _impulse, int _update) +void FIRCORE::setImpulse(const std::vector& _impulse, int _update) { - std::copy(_impulse, _impulse + nc * 2, impulse.begin()); - calc(_update); + auto imp_nc = (int) (_impulse.size() / 2); + + if (imp_nc == nc) // to be on the safe side but setNc would be called if impulse size changes + { + std::copy(_impulse.begin(), _impulse.end(), impulse.begin()); + calc(_update); + } + else{ + setNc(_impulse); + } } -void FIRCORE::setNc(int _nc, const float* _impulse) +void FIRCORE::setNc(const std::vector& _impulse) { // because of FFT planning, this will probably cause a glitch in audio if done during dataflow deplan(); - nc = _nc; + nc = (int) (_impulse.size() / 2); plan(); imp.resize(nc * 2); impulse.resize(nc * 2); - std::copy(_impulse, _impulse + nc * 2, impulse.begin()); + std::copy(_impulse.begin(), _impulse.end(), impulse.begin()); calc(1); } diff --git a/wdsp/fircore.hpp b/wdsp/fircore.hpp index 3fd309a4c..be6176636 100644 --- a/wdsp/fircore.hpp +++ b/wdsp/fircore.hpp @@ -70,9 +70,8 @@ public: int size, float* in, float* out, - int nc, int mp, - const float* impulse + const std::vector& impulse ); FIRCORE(const FIRCORE&) = delete; FIRCORE& operator=(const FIRCORE& other) = delete; @@ -82,8 +81,8 @@ public: void execute(); void setBuffers(float* in, float* out); void setSize(int size); - void setImpulse(const float* impulse, int update); - void setNc(int nc, const float* impulse); + void setImpulse(const std::vector& impulse, int update); + void setNc(const std::vector& impulse); void setMp(int mp); void setUpdate(); diff --git a/wdsp/fmd.cpp b/wdsp/fmd.cpp index 3f8719274..2868af737 100644 --- a/wdsp/fmd.cpp +++ b/wdsp/fmd.cpp @@ -159,11 +159,11 @@ FMD::FMD( 0, 0 ); - pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse.data()); + pde = new FIRCORE(size, audio.data(), out, mp_de, impulse); // audio filter std::vector impulseb; FIR::fir_bandpass(impulseb, 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.data()); + paud = new FIRCORE(size, out, out, mp_aud, impulseb); } FMD::~FMD() @@ -266,11 +266,11 @@ void FMD::setSamplerate(int _rate) 0, 0 ); - pde->setImpulse(impulse.data(), 1); + pde->setImpulse(impulse, 1); // audio filter std::vector impulseb; FIR::fir_bandpass(impulseb, nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud->setImpulse(impulseb.data(), 1); + paud->setImpulse(impulseb, 1); plim->setSamplerate((int) rate); } @@ -296,12 +296,12 @@ void FMD::setSize(int _size) 0, 0 ); - pde = new FIRCORE(size, audio.data(), out, nc_de, mp_de, impulse.data()); + pde = new FIRCORE(size, audio.data(), out, mp_de, impulse); // audio filter delete paud; std::vector impulseb; FIR::fir_bandpass(impulseb, 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.data()); + paud = new FIRCORE(size, out, out, mp_aud, impulseb); plim->setSize(size); } @@ -348,7 +348,7 @@ void FMD::setNCde(int nc) 0, 0 ); - pde->setNc(nc_de, impulse.data()); + pde->setNc(impulse); } } @@ -368,7 +368,7 @@ void FMD::setNCaud(int nc) nc_aud = nc; std::vector impulse; FIR::fir_bandpass(impulse, nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud->setNc(nc_aud, impulse.data()); + paud->setNc(impulse); } } @@ -421,11 +421,11 @@ void FMD::setAFFilter(double low, double high) 0, 0 ); - pde->setImpulse(impulse.data(), 1); + pde->setImpulse(impulse, 1); // audio filter std::vector impulseb; FIR::fir_bandpass (impulseb, nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); - paud->setImpulse(impulseb.data(), 1); + paud->setImpulse(impulseb, 1); } } diff --git a/wdsp/fmmod.cpp b/wdsp/fmmod.cpp index fdbc206c1..334e95620 100644 --- a/wdsp/fmmod.cpp +++ b/wdsp/fmmod.cpp @@ -82,7 +82,7 @@ FMMOD::FMMOD( mp = _mp; calc(); FIR::fir_bandpass(impulse, nc, -bp_fc, +bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p = new FIRCORE(size, out, out, nc, mp, impulse.data()); + p = new FIRCORE(size, out, out, mp, impulse); } FMMOD::~FMMOD() @@ -143,7 +143,7 @@ void FMMOD::setSamplerate(int _rate) samplerate = _rate; calc(); FIR::fir_bandpass(impulse, nc, -bp_fc, +bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } void FMMOD::setSize(int _size) @@ -153,7 +153,7 @@ void FMMOD::setSize(int _size) calc(); p->setSize(size); FIR::fir_bandpass(impulse, nc, -bp_fc, +bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } /******************************************************************************************************** @@ -167,7 +167,7 @@ void FMMOD::setDeviation(float _deviation) double _bp_fc = f_high + _deviation; std::vector impulse; FIR::fir_bandpass (impulse, nc, -_bp_fc, +_bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p->setImpulse(impulse.data(), 0); + p->setImpulse(impulse, 0); deviation = _deviation; // mod sphase = 0.0; @@ -197,7 +197,7 @@ void FMMOD::setNC(int _nc) { nc = _nc; FIR::fir_bandpass (impulse, nc, -bp_fc, +bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p->setNc(nc, impulse.data()); + p->setNc(impulse); } } @@ -220,7 +220,7 @@ void FMMOD::setAFFreqs(float _low, float _high) f_high = _high; bp_fc = deviation + f_high; FIR::fir_bandpass (impulse, nc, -bp_fc, +bp_fc, samplerate, 0, 1, 1.0 / (2 * size)); - p->setImpulse(impulse.data(), 1); + p->setImpulse(impulse, 1); } } diff --git a/wdsp/fmsq.cpp b/wdsp/fmsq.cpp index 859800aff..a61c0700b 100644 --- a/wdsp/fmsq.cpp +++ b/wdsp/fmsq.cpp @@ -49,7 +49,7 @@ void FMSQ::calc() G[2] = 3.0; G[3] = (float) (+20.0 * log10(20000.0 / *pllpole)); 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()); + p = new FIRCORE(size, trigger, noise.data(), mp, impulse); // noise averaging avm = exp(-1.0 / (rate * avtau)); onem_avm = 1.0 - avm; @@ -291,7 +291,7 @@ void FMSQ::setNC(int _nc) { nc = _nc; EQP::eq_impulse (impulse, nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); - p->setNc(nc, impulse.data()); + p->setNc(impulse); } } diff --git a/wdsp/icfir.cpp b/wdsp/icfir.cpp index e03551417..7b3f73f2c 100644 --- a/wdsp/icfir.cpp +++ b/wdsp/icfir.cpp @@ -37,7 +37,7 @@ void ICFIR::calc_icfir (ICFIR *a) std::vector impulse; a->scale = 1.0f / (float)(2 * a->size); 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()); + a->p = new FIRCORE(a->size, a->in, a->out, a->mp, impulse); } void ICFIR::decalc_icfir (ICFIR *a) diff --git a/wdsp/nbp.cpp b/wdsp/nbp.cpp index b3c27e405..73a11f88e 100644 --- a/wdsp/nbp.cpp +++ b/wdsp/nbp.cpp @@ -333,7 +333,7 @@ void NBP::calc_lightweight() gain / (float)(2 * size), wintype ); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); // print_impulse ("nbp.txt", size + 1, impulse, 1, 0); } hadnotch = havnotch; @@ -438,7 +438,7 @@ NBP::NBP( bplow.resize(maxpb); bphigh.resize(maxpb); calc_impulse (); - fircore = new FIRCORE(size, in, out, nc, mp, impulse.data()); + fircore = new FIRCORE(size, in, out, mp, impulse); } NBP::~NBP() @@ -470,7 +470,7 @@ void NBP::setSamplerate(int _rate) { rate = _rate; calc_impulse (); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void NBP::setSize(int _size) @@ -479,13 +479,13 @@ void NBP::setSize(int _size) size = _size; fircore->setSize(size); calc_impulse (); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } void NBP::setNc() { calc_impulse(); - fircore->setNc(nc, impulse.data()); + fircore->setNc(impulse); } void NBP::setMp() @@ -513,7 +513,7 @@ void NBP::SetFreqs(double _flow, double _fhigh) flow = _flow; fhigh = _fhigh; calc_impulse(); - fircore->setImpulse(impulse.data(), 1); + fircore->setImpulse(impulse, 1); } }