diff --git a/wdsp/RXA.cpp b/wdsp/RXA.cpp index bc681c05e..5caa85090 100644 --- a/wdsp/RXA.cpp +++ b/wdsp/RXA.cpp @@ -444,7 +444,7 @@ RXA* RXA::create_rxa ( &rxa->agc->gain); // pointer for gain computation // Bandpass filter - After spectral noise reduction in the block diagram - rxa->bp1 = BANDPASS::create_bandpass ( + rxa->bp1 = new BANDPASS ( 1, // run - used only with ( AM || ANF || ANR || EMNR) 0, // position rxa->dsp_size, // buffer size @@ -570,7 +570,7 @@ void RXA::destroy_rxa (RXA *rxa) SPEAK::destroy_speak (rxa->speak); CBL::destroy_cbl (rxa->cbl); SIPHON::destroy_siphon (rxa->sip1); - BANDPASS::destroy_bandpass (rxa->bp1); + delete (rxa->bp1); delete (rxa->agcmeter); delete (rxa->agc); delete (rxa->emnr); @@ -623,7 +623,7 @@ void RXA::flush_rxa (RXA *rxa) rxa->emnr->flush(); rxa->agc->flush(); rxa->agcmeter->flush(); - BANDPASS::flush_bandpass (rxa->bp1); + rxa->bp1->flush(); SIPHON::flush_siphon (rxa->sip1); CBL::flush_cbl (rxa->cbl); SPEAK::flush_speak (rxa->speak); @@ -656,12 +656,12 @@ void RXA::xrxa (RXA *rxa) rxa->anf->execute(0); rxa->anr->ANR::execute(0); rxa->emnr->execute(0); - BANDPASS::xbandpass (rxa->bp1, 0); + rxa->bp1->BANDPASS::execute(0); rxa->agc->execute(); rxa->anf->execute(1); rxa->anr->execute(1); rxa->emnr->execute(1); - BANDPASS::xbandpass (rxa->bp1, 1); + rxa->bp1->execute(1); rxa->agcmeter->execute(); SIPHON::xsiphon (rxa->sip1, 0); CBL::xcbl (rxa->cbl); @@ -767,7 +767,7 @@ void RXA::setDSPSamplerate (RXA *rxa, int dsp_rate) rxa->anf->setSamplerate(rxa->dsp_rate); rxa->anr->setSamplerate(rxa->dsp_rate); rxa->emnr->setSamplerate(rxa->dsp_rate); - BANDPASS::setSamplerate_bandpass (rxa->bp1, rxa->dsp_rate); + rxa->bp1->setSamplerate(rxa->dsp_rate); rxa->agc->setSamplerate(rxa->dsp_rate); rxa->agcmeter->setSamplerate(rxa->dsp_rate); SIPHON::setSamplerate_siphon (rxa->sip1, rxa->dsp_rate); @@ -843,8 +843,8 @@ void RXA::setDSPBuffsize (RXA *rxa, int dsp_size) rxa->anr->setSize(rxa->dsp_size); rxa->emnr->setBuffers(rxa->midbuff, rxa->midbuff); rxa->emnr->setSize(rxa->dsp_size); - BANDPASS::setBuffers_bandpass (rxa->bp1, rxa->midbuff, rxa->midbuff); - BANDPASS::setSize_bandpass (rxa->bp1, rxa->dsp_size); + rxa->bp1->setBuffers(rxa->midbuff, rxa->midbuff); + rxa->bp1->setSize(rxa->dsp_size); rxa->agc->setBuffers(rxa->midbuff, rxa->midbuff); rxa->agc->setSize(rxa->dsp_size); rxa->agcmeter->setBuffers(rxa->midbuff); @@ -957,7 +957,7 @@ void RXA::bp1Check ( else gain = 1.0; if (a->gain != gain) - BANDPASS::setGain_bandpass (a, gain, 0); + a->setGain(gain, 0); } void RXA::bp1Set (RXA& rxa) @@ -974,8 +974,8 @@ void RXA::bp1Set (RXA& rxa) else a->run = 0; if (!old && a->run) - BANDPASS::flush_bandpass (a); - FIRCORE::setUpdate_fircore (a->p); + a->flush(); + FIRCORE::setUpdate_fircore (a->fircore); } void RXA::bpsnbaCheck (RXA& rxa, int mode, int notch_run) @@ -1368,7 +1368,7 @@ void RXA::SetAGCThresh(RXA& rxa, double thresh, double size, double rate) void RXA::SetPassband (RXA& rxa, float f_low, float f_high) { - BANDPASS::SetBandpassFreqs (rxa, f_low, f_high); // After spectral noise reduction ( AM || ANF || ANR || EMNR) + rxa.bp1->setBandpassFreqs (f_low, f_high); // After spectral noise reduction ( AM || ANF || ANR || EMNR) rxa.snba->setOutputBandwidth (f_low, f_high); // Spectral noise blanker (SNB) rxa.nbp0->SetFreqs (f_low, f_high); // Notched bandpass } @@ -1378,7 +1378,7 @@ void RXA::SetNC (RXA& rxa, int nc) int oldstate = rxa.state; rxa.nbp0->SetNC (nc); rxa.bpsnba->SetNC (nc); - BANDPASS::SetBandpassNC (rxa, nc); + rxa.bp1->SetBandpassNC (nc); rxa.eqp->setNC (nc); rxa.fmsq->setNC (nc); rxa.fmd->setNCde (nc); @@ -1390,7 +1390,7 @@ void RXA::SetMP (RXA& rxa, int mp) { rxa.nbp0->SetMP (mp); rxa.bpsnba->SetMP (mp); - BANDPASS::SetBandpassMP (rxa, mp); + rxa.bp1->SetBandpassMP (mp); rxa.eqp->setMP (mp); rxa.fmsq->setMP (mp); rxa.fmd->setMPde (mp); diff --git a/wdsp/TXA.cpp b/wdsp/TXA.cpp index b9062f590..84d7e637d 100644 --- a/wdsp/TXA.cpp +++ b/wdsp/TXA.cpp @@ -47,6 +47,8 @@ warren@wpratt.com #include "slew.hpp" #include "iqc.hpp" #include "cfir.hpp" +#include "fircore.hpp" +#include "fir.hpp" #include "TXA.hpp" namespace WDSP { @@ -276,7 +278,7 @@ TXA* TXA::create_txa ( TXA_CFC_GAIN, // index for gain value (double*) &txa->cfcomp->gain); // pointer for gain computation - txa->bp0 = BANDPASS::create_bandpass ( + txa->bp0 = new BANDPASS( 1, // always runs 0, // position txa->dsp_size, // size @@ -297,7 +299,7 @@ TXA* TXA::create_txa ( txa->midbuff, // pointer to output buffer 3.0); // gain - txa->bp1 = BANDPASS::create_bandpass ( + txa->bp1 = new BANDPASS( 0, // ONLY RUNS WHEN COMPRESSOR IS USED 0, // position txa->dsp_size, // size @@ -319,7 +321,7 @@ TXA* TXA::create_txa ( txa->dsp_rate, // sample rate 1.95); // gain for clippings - txa->bp2 = BANDPASS::create_bandpass ( + txa->bp2 = new BANDPASS( 0, // ONLY RUNS WHEN COMPRESSOR IS USED 0, // position txa->dsp_size, // size @@ -532,11 +534,11 @@ void TXA::destroy_txa (TXA *txa) AMMOD::destroy_ammod (txa->ammod); delete (txa->alc); delete (txa->compmeter); - BANDPASS::destroy_bandpass (txa->bp2); + delete (txa->bp2); OSCTRL::destroy_osctrl (txa->osctrl); - BANDPASS::destroy_bandpass (txa->bp1); + delete (txa->bp1); COMPRESSOR::destroy_compressor (txa->compressor); - BANDPASS::destroy_bandpass (txa->bp0); + delete (txa->bp0); delete (txa->cfcmeter); CFCOMP::destroy_cfcomp (txa->cfcomp); delete (txa->lvlrmeter); @@ -574,11 +576,11 @@ void TXA::flush_txa (TXA* txa) txa->lvlrmeter->flush (); CFCOMP::flush_cfcomp (txa->cfcomp); txa->cfcmeter->flush (); - BANDPASS::flush_bandpass (txa->bp0); + txa->bp0->flush (); COMPRESSOR::flush_compressor (txa->compressor); - BANDPASS::flush_bandpass (txa->bp1); + txa->bp1->flush (); OSCTRL::flush_osctrl (txa->osctrl); - BANDPASS::flush_bandpass (txa->bp2); + txa->bp2->flush (); txa->compmeter->flush (); txa->alc->flush (); AMMOD::flush_ammod (txa->ammod); @@ -609,11 +611,11 @@ void xtxa (TXA* txa) txa->lvlrmeter->execute (); // Leveler Meter CFCOMP::xcfcomp (txa->cfcomp, 0); // Continuous Frequency Compressor with post-EQ txa->cfcmeter->execute (); // CFC+PostEQ Meter - BANDPASS::xbandpass (txa->bp0, 0); // primary bandpass filter + txa->bp0->execute (0); // primary bandpass filter COMPRESSOR::xcompressor (txa->compressor); // COMP compressor - BANDPASS::xbandpass (txa->bp1, 0); // aux bandpass (runs if COMP) + txa->bp1->execute (0); // aux bandpass (runs if COMP) OSCTRL::xosctrl (txa->osctrl); // CESSB Overshoot Control - BANDPASS::xbandpass (txa->bp2, 0); // aux bandpass (runs if CESSB) + txa->bp2->execute (0); // aux bandpass (runs if CESSB) txa->compmeter->execute (); // COMP meter txa->alc->execute (); // ALC AMMOD::xammod (txa->ammod); // AM Modulator @@ -706,11 +708,11 @@ void TXA::setDSPSamplerate (TXA *txa, int dsp_rate) txa->lvlrmeter->setSamplerate (txa->dsp_rate); CFCOMP::setSamplerate_cfcomp (txa->cfcomp, txa->dsp_rate); txa->cfcmeter->setSamplerate (txa->dsp_rate); - BANDPASS::setSamplerate_bandpass (txa->bp0, txa->dsp_rate); + txa->bp0->setSamplerate (txa->dsp_rate); COMPRESSOR::setSamplerate_compressor (txa->compressor, txa->dsp_rate); - BANDPASS::setSamplerate_bandpass (txa->bp1, txa->dsp_rate); + txa->bp1->setSamplerate (txa->dsp_rate); OSCTRL::setSamplerate_osctrl (txa->osctrl, txa->dsp_rate); - BANDPASS::setSamplerate_bandpass (txa->bp2, txa->dsp_rate); + txa->bp2->setSamplerate (txa->dsp_rate); txa->compmeter->setSamplerate (txa->dsp_rate); txa->alc->setSamplerate (txa->dsp_rate); AMMOD::setSamplerate_ammod (txa->ammod, txa->dsp_rate); @@ -778,16 +780,16 @@ void TXA::setDSPBuffsize (TXA *txa, int dsp_size) CFCOMP::setSize_cfcomp (txa->cfcomp, txa->dsp_size); txa->cfcmeter->setBuffers(txa->midbuff); txa->cfcmeter->setSize(txa->dsp_size); - BANDPASS::setBuffers_bandpass (txa->bp0, txa->midbuff, txa->midbuff); - BANDPASS::setSize_bandpass (txa->bp0, txa->dsp_size); + txa->bp0->setBuffers (txa->midbuff, txa->midbuff); + txa->bp0->setSize (txa->dsp_size); COMPRESSOR::setBuffers_compressor (txa->compressor, txa->midbuff, txa->midbuff); COMPRESSOR::setSize_compressor (txa->compressor, txa->dsp_size); - BANDPASS::setBuffers_bandpass (txa->bp1, txa->midbuff, txa->midbuff); - BANDPASS::setSize_bandpass (txa->bp1, txa->dsp_size); + txa->bp1->setBuffers (txa->midbuff, txa->midbuff); + txa->bp1->setSize (txa->dsp_size); OSCTRL::setBuffers_osctrl (txa->osctrl, txa->midbuff, txa->midbuff); OSCTRL::setSize_osctrl (txa->osctrl, txa->dsp_size); - BANDPASS::setBuffers_bandpass (txa->bp2, txa->midbuff, txa->midbuff); - BANDPASS::setSize_bandpass (txa->bp2, txa->dsp_size); + txa->bp2->setBuffers (txa->midbuff, txa->midbuff); + txa->bp2->setSize (txa->dsp_size); txa->compmeter->setBuffers(txa->midbuff); txa->compmeter->setSize(txa->dsp_size); txa->alc->setBuffers(txa->midbuff, txa->midbuff); @@ -914,14 +916,14 @@ void TXA::SetupBPFilters (TXA& txa) case TXA_DIGU: case TXA_SPEC: case TXA_DRM: - BANDPASS::CalcBandpassFilter (txa.bp0, txa.f_low, txa.f_high, 2.0); + txa.bp0->calcBandpassFilter (txa.f_low, txa.f_high, 2.0); if (txa.compressor->run) { - BANDPASS::CalcBandpassFilter (txa.bp1, txa.f_low, txa.f_high, 2.0); + txa.bp1->calcBandpassFilter (txa.f_low, txa.f_high, 2.0); txa.bp1->run = 1; if (txa.osctrl->run) { - BANDPASS::CalcBandpassFilter (txa.bp2, txa.f_low, txa.f_high, 1.0); + txa.bp2->calcBandpassFilter (txa.f_low, txa.f_high, 1.0); txa.bp2->run = 1; } } @@ -932,42 +934,42 @@ void TXA::SetupBPFilters (TXA& txa) case TXA_FM: if (txa.compressor->run) { - BANDPASS::CalcBandpassFilter (txa.bp0, 0.0, txa.f_high, 2.0); - BANDPASS::CalcBandpassFilter (txa.bp1, 0.0, txa.f_high, 2.0); + txa.bp0->calcBandpassFilter (0.0, txa.f_high, 2.0); + txa.bp1->calcBandpassFilter (0.0, txa.f_high, 2.0); txa.bp1->run = 1; if (txa.osctrl->run) { - BANDPASS::CalcBandpassFilter (txa.bp2, 0.0, txa.f_high, 1.0); + txa.bp2->calcBandpassFilter (0.0, txa.f_high, 1.0); txa.bp2->run = 1; } } else { - BANDPASS::CalcBandpassFilter (txa.bp0, txa.f_low, txa.f_high, 1.0); + txa.bp0->calcBandpassFilter (txa.f_low, txa.f_high, 1.0); } break; case TXA_AM_LSB: - BANDPASS::CalcBandpassFilter (txa.bp0, -txa.f_high, 0.0, 2.0); + txa.bp0->calcBandpassFilter (-txa.f_high, 0.0, 2.0); if (txa.compressor->run) { - BANDPASS::CalcBandpassFilter (txa.bp1, -txa.f_high, 0.0, 2.0); + txa.bp1->calcBandpassFilter (-txa.f_high, 0.0, 2.0); txa.bp1->run = 1; if (txa.osctrl->run) { - BANDPASS::CalcBandpassFilter (txa.bp2, -txa.f_high, 0.0, 1.0); + txa.bp2->calcBandpassFilter (-txa.f_high, 0.0, 1.0); txa.bp2->run = 1; } } break; case TXA_AM_USB: - BANDPASS::CalcBandpassFilter (txa.bp0, 0.0, txa.f_high, 2.0); + txa.bp0->calcBandpassFilter (0.0, txa.f_high, 2.0); if (txa.compressor->run) { - BANDPASS::CalcBandpassFilter (txa.bp1, 0.0, txa.f_high, 2.0); + txa.bp1->calcBandpassFilter (0.0, txa.f_high, 2.0); txa.bp1->run = 1; if (txa.osctrl->run) { - BANDPASS::CalcBandpassFilter (txa.bp2, 0.0, txa.f_high, 1.0); + txa.bp2->calcBandpassFilter(0.0, txa.f_high, 1.0); txa.bp2->run = 1; } } @@ -975,6 +977,93 @@ void TXA::SetupBPFilters (TXA& txa) } } +void TXA::SetBandpassNC (TXA& txa, int nc) +{ + // NOTE: 'nc' must be >= 'size' + BANDPASS *a; + a = txa.bp0; + + if (a->nc != nc) + { + a->nc = nc; + float* impulse = FIR::fir_bandpass ( + a->nc, + a->f_low, + a->f_high, + a->samplerate, + a->wintype, + 1, + a->gain / (double)(2 * a->size) + ); + FIRCORE::setNc_fircore (a->fircore, a->nc, impulse); + delete[] (impulse); + } + + a = txa.bp1; + + if (a->nc != nc) + { + a->nc = nc; + float* impulse = FIR::fir_bandpass ( + a->nc, + a->f_low, + a->f_high, + a->samplerate, + a->wintype, + 1, + a->gain / (double)(2 * a->size) + ); + FIRCORE::setNc_fircore (a->fircore, a->nc, impulse); + delete[] (impulse); + } + + a = txa.bp2; + + if (a->nc != nc) + { + a->nc = nc; + float* impulse = FIR::fir_bandpass ( + a->nc, + a->f_low, + a->f_high, + a->samplerate, + a->wintype, + 1, + a->gain / (double)(2 * a->size) + ); + FIRCORE::setNc_fircore (a->fircore, a->nc, impulse); + delete[] (impulse); + } +} + +void TXA::SetBandpassMP (TXA& txa, int mp) +{ + BANDPASS *a; + a = txa.bp0; + + if (mp != a->mp) + { + a->mp = mp; + FIRCORE::setMp_fircore (a->fircore, a->mp); + } + + a = txa.bp1; + + if (mp != a->mp) + { + a->mp = mp; + FIRCORE::setMp_fircore (a->fircore, a->mp); + } + + a = txa.bp2; + + if (mp != a->mp) + { + a->mp = mp; + FIRCORE::setMp_fircore (a->fircore, a->mp); + } +} + /******************************************************************************************************** * * * Collectives * @@ -984,7 +1073,8 @@ void TXA::SetupBPFilters (TXA& txa) void TXA::SetNC (TXA& txa, int nc) { int oldstate = txa.state; - BANDPASS::SetBandpassNC (txa, nc); + + SetBandpassNC (txa, nc); EMPHP::SetFMEmphNC (txa, nc); txa.eqp->setNC (nc); FMMOD::SetFMNC (txa, nc); @@ -994,7 +1084,7 @@ void TXA::SetNC (TXA& txa, int nc) void TXA::SetMP (TXA& txa, int mp) { - BANDPASS::SetBandpassMP (txa, mp); + SetBandpassMP (txa, mp); EMPHP::SetFMEmphMP (txa, mp); txa.eqp->setMP (mp); FMMOD::SetFMMP (txa, mp); diff --git a/wdsp/TXA.hpp b/wdsp/TXA.hpp index 4437660ff..c7b5fa203 100644 --- a/wdsp/TXA.hpp +++ b/wdsp/TXA.hpp @@ -191,6 +191,8 @@ public: // TXA Properties static void SetMode (TXA& txa, int mode); static void SetBandpassFreqs (TXA& txa, float f_low, float f_high); + static void SetBandpassNC (TXA& txa, int nc); + static void SetBandpassMP (TXA& txa, int mp); // Collectives static void SetNC (TXA& txa, int nc); diff --git a/wdsp/bandpass.cpp b/wdsp/bandpass.cpp index 6dd65e1f3..78845ad1f 100644 --- a/wdsp/bandpass.cpp +++ b/wdsp/bandpass.cpp @@ -40,143 +40,140 @@ namespace WDSP { * * ********************************************************************************************************/ -BANDPASS* BANDPASS::create_bandpass ( - int run, - int position, - int size, - int nc, - int mp, - float* in, - float* out, - double f_low, - double f_high, - int samplerate, - int wintype, - double gain +BANDPASS::BANDPASS( + int _run, + int _position, + int _size, + int _nc, + int _mp, + float* _in, + float* _out, + double _f_low, + double _f_high, + int _samplerate, + int _wintype, + double _gain ) { // NOTE: 'nc' must be >= 'size' - BANDPASS *a = new BANDPASS; - a->run = run; - a->position = position; - a->size = size; - a->nc = nc; - a->mp = mp; - a->in = in; - a->out = out; - a->f_low = f_low; - a->f_high = f_high; - a->samplerate = samplerate; - a->wintype = wintype; - a->gain = gain; + run = _run; + position = _position; + size = _size; + nc = _nc; + mp = _mp; + in = _in; + out = _out; + f_low = _f_low; + f_high = _f_high; + samplerate = _samplerate; + wintype = _wintype; + gain = _gain; float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, + nc, + f_low, + f_high, + samplerate, + wintype, 1, - a->gain / (double)(2 * a->size) + gain / (double)(2 * size) ); - a->p = FIRCORE::create_fircore (a->size, a->in, a->out, a->nc, a->mp, impulse); - delete[] impulse; - return a; -} - -void BANDPASS::destroy_bandpass (BANDPASS *a) -{ - FIRCORE::destroy_fircore (a->p); - delete a; -} - -void BANDPASS::flush_bandpass (BANDPASS *a) -{ - FIRCORE::flush_fircore (a->p); -} - -void BANDPASS::xbandpass (BANDPASS *a, int pos) -{ - if (a->run && a->position == pos) - FIRCORE::xfircore (a->p); - else if (a->out != a->in) - std::copy( a->in, a->in + a->size * 2, a->out); -} - -void BANDPASS::setBuffers_bandpass (BANDPASS *a, float* in, float* out) -{ - a->in = in; - a->out = out; - FIRCORE::setBuffers_fircore (a->p, a->in, a->out); -} - -void BANDPASS::setSamplerate_bandpass (BANDPASS *a, int rate) -{ - a->samplerate = rate; - float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, - 1, - a->gain / (float)(2 * a->size) - ); - FIRCORE::setImpulse_fircore (a->p, impulse, 1); + fircore = FIRCORE::create_fircore (size, in, out, nc, mp, impulse); delete[] impulse; } -void BANDPASS::setSize_bandpass (BANDPASS *a, int size) +BANDPASS::~BANDPASS() +{ + FIRCORE::destroy_fircore (fircore); +} + +void BANDPASS::flush() +{ + FIRCORE::flush_fircore(fircore); +} + +void BANDPASS::execute(int pos) +{ + if (run && position == pos) + FIRCORE::xfircore(fircore); + else if (out != in) + std::copy(in, in + size * 2, out); +} + +void BANDPASS::setBuffers(float* _in, float* _out) +{ + in = _in; + out = _out; + FIRCORE::setBuffers_fircore(fircore, in, out); +} + +void BANDPASS::setSamplerate(int _rate) +{ + samplerate = _rate; + float* impulse = FIR::fir_bandpass ( + nc, + f_low, + f_high, + samplerate, + wintype, + 1, + gain / (double) (2 * size) + ); + FIRCORE::setImpulse_fircore (fircore, impulse, 1); + delete[] impulse; +} + +void BANDPASS::setSize(int _size) { // NOTE: 'size' must be <= 'nc' - a->size = size; - FIRCORE::setSize_fircore (a->p, a->size); + size = _size; + FIRCORE::setSize_fircore (fircore, size); // recalc impulse because scale factor is a function of size float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, + nc, + f_low, + f_high, + samplerate, + wintype, 1, - a->gain / (float)(2 * a->size) + gain / (double) (2 * size) ); - FIRCORE::setImpulse_fircore (a->p, impulse, 1); + FIRCORE::setImpulse_fircore (fircore, impulse, 1); delete[] (impulse); } -void BANDPASS::setGain_bandpass (BANDPASS *a, double gain, int update) +void BANDPASS::setGain(double _gain, int _update) { - a->gain = gain; + gain = _gain; float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, + nc, + f_low, + f_high, + samplerate, + wintype, 1, - a->gain / (double)(2 * a->size) + gain / (double) (2 * size) ); - FIRCORE::setImpulse_fircore (a->p, impulse, update); + FIRCORE::setImpulse_fircore (fircore, impulse, _update); delete[] (impulse); } -void BANDPASS::CalcBandpassFilter (BANDPASS *a, double f_low, double f_high, double gain) +void BANDPASS::calcBandpassFilter(double _f_low, double _f_high, double _gain) { - if ((a->f_low != f_low) || (a->f_high != f_high) || (a->gain != gain)) + if ((f_low != _f_low) || (f_high != _f_high) || (gain != _gain)) { - a->f_low = f_low; - a->f_high = f_high; - a->gain = gain; + f_low = _f_low; + f_high = _f_high; + gain = _gain; float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, + nc, + f_low, + f_high, + samplerate, + wintype, 1, - a->gain / (double)(2 * a->size) + gain / (double)(2 * size) ); - FIRCORE::setImpulse_fircore (a->p, impulse, 1); + FIRCORE::setImpulse_fircore (fircore, impulse, 1); delete[] (impulse); } } @@ -187,62 +184,54 @@ void BANDPASS::CalcBandpassFilter (BANDPASS *a, double f_low, double f_high, dou * * ********************************************************************************************************/ -void BANDPASS::SetBandpassFreqs (RXA& rxa, double f_low, double f_high) +void BANDPASS::setBandpassFreqs(double _f_low, double _f_high) { - BANDPASS *a = rxa.bp1; - - if ((f_low != a->f_low) || (f_high != a->f_high)) + if ((_f_low != f_low) || (_f_high != f_high)) { float* impulse = FIR::fir_bandpass ( - a->nc, - f_low, - f_high, - a->samplerate, - a->wintype, + nc, + _f_low, + _f_high, + samplerate, + wintype, 1, - a->gain / (double)(2 * a->size) + gain / (double)(2 * size) ); - FIRCORE::setImpulse_fircore (a->p, impulse, 0); + FIRCORE::setImpulse_fircore (fircore, impulse, 0); delete[] (impulse); - a->f_low = f_low; - a->f_high = f_high; - FIRCORE::setUpdate_fircore (a->p); + f_low = _f_low; + f_high = _f_high; + FIRCORE::setUpdate_fircore (fircore); } } -void BANDPASS::SetBandpassNC (RXA& rxa, int nc) +void BANDPASS::SetBandpassNC(int _nc) { // NOTE: 'nc' must be >= 'size' - BANDPASS *a; - a = rxa.bp1; - - if (nc != a->nc) + if (_nc != nc) { - a->nc = nc; + nc = _nc; float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, + nc, + f_low, + f_high, + samplerate, + wintype, 1, - a->gain / (double)(2 * a->size) + gain / (double)( 2 * size) ); - FIRCORE::setNc_fircore (a->p, a->nc, impulse); + FIRCORE::setNc_fircore (fircore, nc, impulse); delete[] (impulse); } } -void BANDPASS::SetBandpassMP (RXA& rxa, int mp) +void BANDPASS::SetBandpassMP(int _mp) { - BANDPASS *a; - a = rxa.bp1; - - if (mp != a->mp) + if (_mp != mp) { - a->mp = mp; - FIRCORE::setMp_fircore (a->p, a->mp); + mp = _mp; + FIRCORE::setMp_fircore (fircore, mp); } } @@ -263,7 +252,7 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp) // a->f_low = f_low; // a->f_high = f_high; // impulse = fir_bandpass (a->nc, a->f_low, a->f_high, a->samplerate, a->wintype, 1, a->gain / (float)(2 * a->size)); -// setImpulse_fircore (a->p, impulse, 1); +// setImpulse_fircore (a->fircore, impulse, 1); // delete[] (impulse); // } // a = txa.bp1; @@ -272,7 +261,7 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp) // a->f_low = f_low; // a->f_high = f_high; // impulse = fir_bandpass (a->nc, a->f_low, a->f_high, a->samplerate, a->wintype, 1, a->gain / (float)(2 * a->size)); -// setImpulse_fircore (a->p, impulse, 1); +// setImpulse_fircore (a->fircore, impulse, 1); // delete[] (impulse); // } // a = txa.bp2; @@ -281,96 +270,9 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp) // a->f_low = f_low; // a->f_high = f_high; // impulse = fir_bandpass (a->nc, a->f_low, a->f_high, a->samplerate, a->wintype, 1, a->gain / (float)(2 * a->size)); -// setImpulse_fircore (a->p, impulse, 1); +// setImpulse_fircore (a->fircore, impulse, 1); // delete[] (impulse); // } //} -void BANDPASS::SetBandpassNC (TXA& txa, int nc) -{ - // NOTE: 'nc' must be >= 'size' - BANDPASS *a; - a = txa.bp0; - - if (a->nc != nc) - { - a->nc = nc; - float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, - 1, - a->gain / (double)(2 * a->size) - ); - FIRCORE::setNc_fircore (a->p, a->nc, impulse); - delete[] (impulse); - } - - a = txa.bp1; - - if (a->nc != nc) - { - a->nc = nc; - float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, - 1, - a->gain / (double)(2 * a->size) - ); - FIRCORE::setNc_fircore (a->p, a->nc, impulse); - delete[] (impulse); - } - - a = txa.bp2; - - if (a->nc != nc) - { - a->nc = nc; - float* impulse = FIR::fir_bandpass ( - a->nc, - a->f_low, - a->f_high, - a->samplerate, - a->wintype, - 1, - a->gain / (double)(2 * a->size) - ); - FIRCORE::setNc_fircore (a->p, a->nc, impulse); - delete[] (impulse); - } -} - -void BANDPASS::SetBandpassMP (TXA& txa, int mp) -{ - BANDPASS *a; - a = txa.bp0; - - if (mp != a->mp) - { - a->mp = mp; - FIRCORE::setMp_fircore (a->p, a->mp); - } - - a = txa.bp1; - - if (mp != a->mp) - { - a->mp = mp; - FIRCORE::setMp_fircore (a->p, a->mp); - } - - a = txa.bp2; - - if (mp != a->mp) - { - a->mp = mp; - FIRCORE::setMp_fircore (a->p, a->mp); - } -} - } // namespace WDSP diff --git a/wdsp/bandpass.hpp b/wdsp/bandpass.hpp index c72ac3a8f..3af29ffe2 100644 --- a/wdsp/bandpass.hpp +++ b/wdsp/bandpass.hpp @@ -64,9 +64,9 @@ public: double samplerate; int wintype; double gain; - FIRCORE *p; + FIRCORE *fircore; - static BANDPASS *create_bandpass ( + BANDPASS( int run, int position, int size, @@ -80,21 +80,21 @@ public: int wintype, double gain ); - static void destroy_bandpass (BANDPASS *a); - static void flush_bandpass (BANDPASS *a); - static void xbandpass (BANDPASS *a, int pos); - static void setBuffers_bandpass (BANDPASS *a, float* in, float* out); - static void setSamplerate_bandpass (BANDPASS *a, int rate); - static void setSize_bandpass (BANDPASS *a, int size); - static void setGain_bandpass (BANDPASS *a, double gain, int update); - static void CalcBandpassFilter (BANDPASS *a, double f_low, double f_high, double gain); + BANDPASS(const BANDPASS&) = delete; + BANDPASS& operator=(const BANDPASS& other) = delete; + ~BANDPASS(); + + void flush(); + void execute(int pos); + void setBuffers(float* in, float* out); + void setSamplerate(int rate); + void setSize(int size); + void setGain(double gain, int update); + void calcBandpassFilter(double f_low, double f_high, double gain); // RXA Prototypes - static void SetBandpassFreqs (RXA& rxa, double f_low, double f_high); - static void SetBandpassNC (RXA& rxa, int nc); - static void SetBandpassMP (RXA& rxa, int mp); - // TXA Prototypes - static void SetBandpassNC (TXA& txa, int nc); - static void SetBandpassMP (TXA& txa, int mp); + void setBandpassFreqs(double f_low, double f_high); + void SetBandpassNC(int nc); + void SetBandpassMP(int mp); }; } // namespace WDSP