From a239fe47e92032c8d3c1142467de91ba8c298017 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 26 Jul 2024 17:52:34 +0200 Subject: [PATCH] WDSP: AMSQ and AMD: replaced static methods --- plugins/channelrx/wdsprx/wdsprxsink.cpp | 14 +- wdsp/RXA.cpp | 50 ++-- wdsp/RXA.hpp | 2 + wdsp/TXA.cpp | 16 +- wdsp/amd.cpp | 294 +++++++++++------------- wdsp/amd.hpp | 23 +- wdsp/amsq.cpp | 268 ++++++++++----------- wdsp/amsq.hpp | 62 +++-- 8 files changed, 348 insertions(+), 381 deletions(-) diff --git a/plugins/channelrx/wdsprx/wdsprxsink.cpp b/plugins/channelrx/wdsprx/wdsprxsink.cpp index 29aa9af18..ff93bfd4f 100644 --- a/plugins/channelrx/wdsprx/wdsprxsink.cpp +++ b/plugins/channelrx/wdsprx/wdsprxsink.cpp @@ -466,9 +466,9 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) WDSP::RXA::SetMode(*m_rxa, WDSP::RXA::RXA_SAM); if (dsb) { - WDSP::AMD::SetAMDSBMode(*m_rxa, 0); + m_rxa->amd->setSBMode(0); } else { - WDSP::AMD::SetAMDSBMode(*m_rxa, usb ? 2 : 1); + m_rxa->amd->setSBMode(usb ? 2 : 1); } } else if (settings.m_demod == WDSPRxProfile::DemodFMN) @@ -643,7 +643,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) // AM option if ((m_settings.m_amFadeLevel != settings.m_amFadeLevel) || force) { - WDSP::AMD::SetAMDFadeLevel(*m_rxa, settings.m_amFadeLevel); + m_rxa->amd->setFadeLevel(settings.m_amFadeLevel); } // FM options @@ -681,7 +681,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) || (m_settings.m_squelchMode != settings.m_squelchMode) || force) { WDSP::SSQL::SetSSQLRun(*m_rxa, 0); - WDSP::AMSQ::SetAMSQRun(*m_rxa, 0); + m_rxa->amsq->setRun(0); WDSP::FMSQ::SetFMSQRun(*m_rxa, 0); if (settings.m_squelch) @@ -697,9 +697,9 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) break; case WDSPRxProfile::SquelchModeAM: { - WDSP::AMSQ::SetAMSQRun(*m_rxa, 1); + m_rxa->amsq->setRun(1); double threshold = ((settings.m_squelchThreshold / 100.0) * 160.0) - 160.0; - WDSP::AMSQ::SetAMSQThreshold(*m_rxa, threshold); + m_rxa->amsq->setThreshold(threshold); } break; case WDSPRxProfile::SquelchModeFM: @@ -725,7 +725,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } if ((m_settings.m_amsqMaxTail != settings.m_amsqMaxTail) || force) { - WDSP::AMSQ::SetAMSQMaxTail(*m_rxa, settings.m_amsqMaxTail); + m_rxa->amsq->setMaxTail(settings.m_amsqMaxTail); } // Equalizer diff --git a/wdsp/RXA.cpp b/wdsp/RXA.cpp index 9f9cf68a5..e29ff99c8 100644 --- a/wdsp/RXA.cpp +++ b/wdsp/RXA.cpp @@ -227,7 +227,7 @@ RXA* RXA::create_rxa ( 0); // pointer for gain computation // AM squelch capture (for other modes than FM) - rxa->amsq = AMSQ::create_amsq ( + rxa->amsq = new AMSQ( 0, // run rxa->dsp_size, // buffer size rxa->midbuff, // pointer to signal input buffer used by xamsq @@ -244,7 +244,7 @@ RXA* RXA::create_rxa ( 0.0); // muted gain // AM/SAM demodulator - rxa->amd = AMD::create_amd ( + rxa->amd = new AMD( 0, // run - OFF by default rxa->dsp_size, // buffer size rxa->midbuff, // pointer to input buffer @@ -580,8 +580,8 @@ void RXA::destroy_rxa (RXA *rxa) SNBA::destroy_snba (rxa->snba); FMSQ::destroy_fmsq (rxa->fmsq); FMD::destroy_fmd (rxa->fmd); - AMD::destroy_amd (rxa->amd); - AMSQ::destroy_amsq (rxa->amsq); + delete (rxa->amd); + delete (rxa->amsq); delete (rxa->smeter); delete (rxa->sender); delete (rxa->bpsnba); @@ -612,8 +612,8 @@ void RXA::flush_rxa (RXA *rxa) rxa->bpsnba->flush(); rxa->sender->flush(); rxa->smeter->flush(); - AMSQ::flush_amsq (rxa->amsq); - AMD::flush_amd (rxa->amd); + rxa->amsq->flush(); + rxa->amd->flush(); FMD::flush_fmd (rxa->fmd); FMSQ::flush_fmsq (rxa->fmsq); SNBA::flush_snba (rxa->snba); @@ -644,9 +644,9 @@ void RXA::xrxa (RXA *rxa) rxa->nbp0->execute(0); rxa->smeter->execute(); rxa->sender->execute(); - AMSQ::xamsqcap (rxa->amsq); + rxa->amsq->xcap(); rxa->bpsnba->exec_out(0); - AMD::xamd (rxa->amd); + rxa->amd->execute(); FMD::xfmd (rxa->fmd); FMSQ::xfmsq (rxa->fmsq); rxa->bpsnba->exec_in(1); @@ -669,7 +669,7 @@ void RXA::xrxa (RXA *rxa) MPEAK::xmpeak (rxa->mpeak); SSQL::xssql (rxa->ssql); PANEL::xpanel (rxa->panel); - AMSQ::xamsq (rxa->amsq); + rxa->amsq->execute(); rxa->rsmpout->execute(); } @@ -757,8 +757,8 @@ void RXA::setDSPSamplerate (RXA *rxa, int dsp_rate) rxa->bpsnba->setSamplerate(rxa->dsp_rate); rxa->smeter->setSamplerate(rxa->dsp_rate); rxa->sender->setSamplerate(rxa->dsp_rate); - AMSQ::setSamplerate_amsq (rxa->amsq, rxa->dsp_rate); - AMD::setSamplerate_amd (rxa->amd, rxa->dsp_rate); + rxa->amsq->setSamplerate(rxa->dsp_rate); + rxa->amd->setSamplerate(rxa->dsp_rate); FMD::setSamplerate_fmd (rxa->fmd, rxa->dsp_rate); FMSQ::setBuffers_fmsq (rxa->fmsq, rxa->midbuff, rxa->midbuff, rxa->fmd->audio); FMSQ::setSamplerate_fmsq (rxa->fmsq, rxa->dsp_rate); @@ -825,10 +825,10 @@ void RXA::setDSPBuffsize (RXA *rxa, int dsp_size) rxa->smeter->setSize(rxa->dsp_size); rxa->sender->setBuffers(rxa->midbuff); rxa->sender->setSize(rxa->dsp_size); - AMSQ::setBuffers_amsq (rxa->amsq, rxa->midbuff, rxa->midbuff, rxa->midbuff); - AMSQ::setSize_amsq (rxa->amsq, rxa->dsp_size); - AMD::setBuffers_amd (rxa->amd, rxa->midbuff, rxa->midbuff); - AMD::setSize_amd (rxa->amd, rxa->dsp_size); + rxa->amsq->setBuffers(rxa->midbuff, rxa->midbuff, rxa->midbuff); + rxa->amsq->setSize(rxa->dsp_size); + rxa->amd->setBuffers(rxa->midbuff, rxa->midbuff); + rxa->amd->setSize(rxa->dsp_size); FMD::setBuffers_fmd (rxa->fmd, rxa->midbuff, rxa->midbuff); FMD::setSize_fmd (rxa->fmd, rxa->dsp_size); FMSQ::setBuffers_fmsq (rxa->fmsq, rxa->midbuff, rxa->midbuff, rxa->fmd->audio); @@ -1225,6 +1225,26 @@ void RXA::NBPSetAutoIncrease (RXA& rxa, int autoincr) } } +void RXA::SetAMDRun(RXA& rxa, int run) +{ + AMD *a = rxa.amd; + + if (run != run) + { + RXA::bp1Check ( + rxa, + run, + rxa.snba->run, + rxa.emnr->run, + rxa.anf->run, + rxa.anr->run + ); + + run = run; + RXA::bp1Set (rxa); + } +} + /******************************************************************************************************** * * * Collectives * diff --git a/wdsp/RXA.hpp b/wdsp/RXA.hpp index 271e2c337..ebc93ddf0 100644 --- a/wdsp/RXA.hpp +++ b/wdsp/RXA.hpp @@ -167,6 +167,8 @@ public: static void NBPSetNotchesRun (RXA& rxa, int run); static void NBPSetWindow (RXA& rxa, int wintype); static void NBPSetAutoIncrease (RXA& rxa, int autoincr); + // AMD + static void SetAMDRun(RXA& rxa, int run); // Collectives static void SetPassband (RXA& rxa, float f_low, float f_high); diff --git a/wdsp/TXA.cpp b/wdsp/TXA.cpp index 9d901c4fb..d58e1c430 100644 --- a/wdsp/TXA.cpp +++ b/wdsp/TXA.cpp @@ -135,7 +135,7 @@ TXA* TXA::create_txa ( -1, // index for gain value 0); // pointer for gain computation - txa->amsq.p = AMSQ::create_amsq ( + txa->amsq.p = new AMSQ( 0, // run txa->dsp_size, // size txa->midbuff, // input buffer @@ -544,7 +544,7 @@ void TXA::destroy_txa (TXA *txa) EMPHP::destroy_emphp (txa->preemph.p); delete (txa->eqmeter.p); EQP::destroy_eqp (txa->eqp.p); - AMSQ::destroy_amsq (txa->amsq.p); + delete (txa->amsq.p); delete (txa->micmeter.p); PHROT::destroy_phrot (txa->phrot.p); PANEL::destroy_panel (txa->panel.p); @@ -566,7 +566,7 @@ void TXA::flush_txa (TXA* txa) PANEL::flush_panel (txa->panel.p); PHROT::flush_phrot (txa->phrot.p); txa->micmeter.p->flush (); - AMSQ::flush_amsq (txa->amsq.p); + txa->amsq.p->flush (); EQP::flush_eqp (txa->eqp.p); txa->eqmeter.p->flush (); EMPHP::flush_emphp (txa->preemph.p); @@ -600,8 +600,8 @@ void xtxa (TXA* txa) PANEL::xpanel (txa->panel.p); // includes MIC gain PHROT::xphrot (txa->phrot.p); // phase rotator txa->micmeter.p->execute (); // MIC meter - AMSQ::xamsqcap (txa->amsq.p); // downward expander capture - AMSQ::xamsq (txa->amsq.p); // downward expander action + txa->amsq.p->xcap (); // downward expander capture + txa->amsq.p->execute (); // downward expander action EQP::xeqp (txa->eqp.p); // pre-EQ txa->eqmeter.p->execute (); // EQ meter EMPHP::xemphp (txa->preemph.p, 0); // FM pre-emphasis (first option) @@ -698,7 +698,7 @@ void TXA::setDSPSamplerate (TXA *txa, int dsp_rate) PANEL::setSamplerate_panel (txa->panel.p, txa->dsp_rate); PHROT::setSamplerate_phrot (txa->phrot.p, txa->dsp_rate); txa->micmeter.p->setSamplerate (txa->dsp_rate); - AMSQ::setSamplerate_amsq (txa->amsq.p, txa->dsp_rate); + txa->amsq.p->setSamplerate (txa->dsp_rate); EQP::setSamplerate_eqp (txa->eqp.p, txa->dsp_rate); txa->eqmeter.p->setSamplerate (txa->dsp_rate); EMPHP::setSamplerate_emphp (txa->preemph.p, txa->dsp_rate); @@ -762,8 +762,8 @@ void TXA::setDSPBuffsize (TXA *txa, int dsp_size) PHROT::setSize_phrot (txa->phrot.p, txa->dsp_size); txa->micmeter.p->setBuffers (txa->midbuff); txa->micmeter.p->setSize (txa->dsp_size); - AMSQ::setBuffers_amsq (txa->amsq.p, txa->midbuff, txa->midbuff, txa->midbuff); - AMSQ::setSize_amsq (txa->amsq.p, txa->dsp_size); + txa->amsq.p->setBuffers (txa->midbuff, txa->midbuff, txa->midbuff); + txa->amsq.p->setSize (txa->dsp_size); EQP::setBuffers_eqp (txa->eqp.p, txa->midbuff, txa->midbuff); EQP::setSize_eqp (txa->eqp.p, txa->dsp_size); txa->eqmeter.p->setBuffers (txa->midbuff); diff --git a/wdsp/amd.cpp b/wdsp/amd.cpp index 2b5090c01..7db5f2858 100644 --- a/wdsp/amd.cpp +++ b/wdsp/amd.cpp @@ -37,93 +37,85 @@ warren@wpratt.com namespace WDSP { -AMD* AMD::create_amd +AMD::AMD ( - int run, - int buff_size, - float *in_buff, - float *out_buff, - int mode, - int levelfade, - int sbmode, - int sample_rate, - double fmin, - double fmax, - double zeta, - double omegaN, - double tauR, - double tauI + int _run, + int _buff_size, + float *_in_buff, + float *_out_buff, + int _mode, + int _levelfade, + int _sbmode, + int _sample_rate, + double _fmin, + double _fmax, + double _zeta, + double _omegaN, + double _tauR, + double _tauI ) { - AMD *a = new AMD(); - a->run = run; - a->buff_size = buff_size; - a->in_buff = in_buff; - a->out_buff = out_buff; - a->mode = mode; - a->levelfade = levelfade; - a->sbmode = sbmode; - a->sample_rate = (float)sample_rate; - a->fmin = fmin; - a->fmax = fmax; - a->zeta = zeta; - a->omegaN = omegaN; - a->tauR = tauR; - a->tauI = tauI; - - init_amd(a); - return a; + run = _run; + buff_size = _buff_size; + in_buff = _in_buff; + out_buff = _out_buff; + mode = _mode; + levelfade = _levelfade; + sbmode = _sbmode; + sample_rate = (double) _sample_rate; + fmin = _fmin; + fmax = _fmax; + zeta = _zeta; + omegaN = _omegaN; + tauR = _tauR; + tauI = _tauI; + init(); } -void AMD::destroy_amd(AMD *a) -{ - delete a; -} - -void AMD::init_amd(AMD *a) +void AMD::init() { //pll - a->omega_min = 2 * M_PI * a->fmin / a->sample_rate; - a->omega_max = 2 * M_PI * a->fmax / a->sample_rate; - a->g1 = 1.0 - std::exp(-2.0 * a->omegaN * a->zeta / a->sample_rate); - a->g2 = -a->g1 + 2.0 * (1 - exp(-a->omegaN * a->zeta / a->sample_rate) * cos(a->omegaN / a->sample_rate * sqrt(1.0 - a->zeta * a->zeta))); - a->phs = 0.0; - a->fil_out = 0.0; - a->omega = 0.0; + omega_min = 2 * M_PI * fmin / sample_rate; + omega_max = 2 * M_PI * fmax / sample_rate; + g1 = 1.0 - std::exp(-2.0 * omegaN * zeta / sample_rate); + g2 = -g1 + 2.0 * (1 - exp(-omegaN * zeta / sample_rate) * cos(omegaN / sample_rate * sqrt(1.0 - zeta * zeta))); + phs = 0.0; + fil_out = 0.0; + omega = 0.0; //fade leveler - a->dc = 0.0; - a->dc_insert = 0.0; - a->mtauR = exp(-1.0 / (a->sample_rate * a->tauR)); - a->onem_mtauR = 1.0 - a->mtauR; - a->mtauI = exp(-1.0 / (a->sample_rate * a->tauI)); - a->onem_mtauI = 1.0 - a->mtauI; + dc = 0.0; + dc_insert = 0.0; + mtauR = exp(-1.0 / (sample_rate * tauR)); + onem_mtauR = 1.0 - mtauR; + mtauI = exp(-1.0 / (sample_rate * tauI)); + onem_mtauI = 1.0 - mtauI; //sideband separation - a->c0[0] = -0.328201924180698; - a->c0[1] = -0.744171491539427; - a->c0[2] = -0.923022915444215; - a->c0[3] = -0.978490468768238; - a->c0[4] = -0.994128272402075; - a->c0[5] = -0.998458978159551; - a->c0[6] = -0.999790306259206; + c0[0] = -0.328201924180698; + c0[1] = -0.744171491539427; + c0[2] = -0.923022915444215; + c0[3] = -0.978490468768238; + c0[4] = -0.994128272402075; + c0[5] = -0.998458978159551; + c0[6] = -0.999790306259206; - a->c1[0] = -0.0991227952747244; - a->c1[1] = -0.565619728761389; - a->c1[2] = -0.857467122550052; - a->c1[3] = -0.959123933111275; - a->c1[4] = -0.988739372718090; - a->c1[5] = -0.996959189310611; - a->c1[6] = -0.999282492800792; + c1[0] = -0.0991227952747244; + c1[1] = -0.565619728761389; + c1[2] = -0.857467122550052; + c1[3] = -0.959123933111275; + c1[4] = -0.988739372718090; + c1[5] = -0.996959189310611; + c1[6] = -0.999282492800792; } -void AMD::flush_amd (AMD *a) +void AMD::flush() { - a->dc = 0.0; - a->dc_insert = 0.0; + dc = 0.0; + dc_insert = 0.0; } -void AMD::xamd (AMD *a) +void AMD::execute() { int i; double audio; @@ -135,28 +127,28 @@ void AMD::xamd (AMD *a) double ai_ps, bi_ps, aq_ps, bq_ps; int j, k; - if (a->run) + if (run) { - switch (a->mode) + switch (mode) { case 0: //AM Demodulator { - for (i = 0; i < a->buff_size; i++) + for (i = 0; i < buff_size; i++) { - double xr = a->in_buff[2 * i + 0]; - double xi = a->in_buff[2 * i + 1]; + double xr = in_buff[2 * i + 0]; + double xi = in_buff[2 * i + 1]; audio = sqrt(xr*xr + xi*xi); - if (a->levelfade) + if (levelfade) { - a->dc = a->mtauR * a->dc + a->onem_mtauR * audio; - a->dc_insert = a->mtauI * a->dc_insert + a->onem_mtauI * audio; - audio += a->dc_insert - a->dc; + dc = mtauR * dc + onem_mtauR * audio; + dc_insert = mtauI * dc_insert + onem_mtauI * audio; + audio += dc_insert - dc; } - a->out_buff[2 * i + 0] = audio; - a->out_buff[2 * i + 1] = audio; + out_buff[2 * i + 0] = audio; + out_buff[2 * i + 1] = audio; } break; @@ -164,52 +156,52 @@ void AMD::xamd (AMD *a) case 1: //Synchronous AM Demodulator with Sideband Separation { - for (i = 0; i < a->buff_size; i++) + for (i = 0; i < buff_size; i++) { - vco[0] = cos(a->phs); - vco[1] = sin(a->phs); + vco[0] = cos(phs); + vco[1] = sin(phs); - ai = a->in_buff[2 * i + 0] * vco[0]; - bi = a->in_buff[2 * i + 0] * vco[1]; - aq = a->in_buff[2 * i + 1] * vco[0]; - bq = a->in_buff[2 * i + 1] * vco[1]; + ai = in_buff[2 * i + 0] * vco[0]; + bi = in_buff[2 * i + 0] * vco[1]; + aq = in_buff[2 * i + 1] * vco[0]; + bq = in_buff[2 * i + 1] * vco[1]; - if (a->sbmode != 0) + if (sbmode != 0) { - a->a[0] = a->dsI; - a->b[0] = bi; - a->c[0] = a->dsQ; - a->d[0] = aq; - a->dsI = ai; - a->dsQ = bq; + a[0] = dsI; + b[0] = bi; + c[0] = dsQ; + d[0] = aq; + dsI = ai; + dsQ = bq; for (j = 0; j < STAGES; j++) { k = 3 * j; - a->a[k + 3] = a->c0[j] * (a->a[k] - a->a[k + 5]) + a->a[k + 2]; - a->b[k + 3] = a->c1[j] * (a->b[k] - a->b[k + 5]) + a->b[k + 2]; - a->c[k + 3] = a->c0[j] * (a->c[k] - a->c[k + 5]) + a->c[k + 2]; - a->d[k + 3] = a->c1[j] * (a->d[k] - a->d[k + 5]) + a->d[k + 2]; + a[k + 3] = c0[j] * (a[k] - a[k + 5]) + a[k + 2]; + b[k + 3] = c1[j] * (b[k] - b[k + 5]) + b[k + 2]; + c[k + 3] = c0[j] * (c[k] - c[k + 5]) + c[k + 2]; + d[k + 3] = c1[j] * (d[k] - d[k + 5]) + d[k + 2]; } - ai_ps = a->a[OUT_IDX]; - bi_ps = a->b[OUT_IDX]; - bq_ps = a->c[OUT_IDX]; - aq_ps = a->d[OUT_IDX]; + ai_ps = a[OUT_IDX]; + bi_ps = b[OUT_IDX]; + bq_ps = c[OUT_IDX]; + aq_ps = d[OUT_IDX]; for (j = OUT_IDX + 2; j > 0; j--) { - a->a[j] = a->a[j - 1]; - a->b[j] = a->b[j - 1]; - a->c[j] = a->c[j - 1]; - a->d[j] = a->d[j - 1]; + a[j] = a[j - 1]; + b[j] = b[j - 1]; + c[j] = c[j - 1]; + d[j] = d[j - 1]; } } corr[0] = +ai + bq; corr[1] = -bi + aq; - switch(a->sbmode) + switch(sbmode) { case 0: //both sidebands { @@ -228,100 +220,80 @@ void AMD::xamd (AMD *a) } } - if (a->levelfade) + if (levelfade) { - a->dc = a->mtauR * a->dc + a->onem_mtauR * audio; - a->dc_insert = a->mtauI * a->dc_insert + a->onem_mtauI * corr[0]; - audio += a->dc_insert - a->dc; + dc = mtauR * dc + onem_mtauR * audio; + dc_insert = mtauI * dc_insert + onem_mtauI * corr[0]; + audio += dc_insert - dc; } - a->out_buff[2 * i + 0] = audio; - a->out_buff[2 * i + 1] = audio; + out_buff[2 * i + 0] = audio; + out_buff[2 * i + 1] = audio; if ((corr[0] == 0.0) && (corr[1] == 0.0)) corr[0] = 1.0; det = atan2(corr[1], corr[0]); - del_out = a->fil_out; - a->omega += a->g2 * det; + del_out = fil_out; + omega += g2 * det; - if (a->omega < a->omega_min) - a->omega = a->omega_min; + if (omega < omega_min) + omega = omega_min; - if (a->omega > a->omega_max) - a->omega = a->omega_max; + if (omega > omega_max) + omega = omega_max; - a->fil_out = a->g1 * det + a->omega; - a->phs += del_out; + fil_out = g1 * det + omega; + phs += del_out; - while (a->phs >= 2 * M_PI) - a->phs -= 2 * M_PI; + while (phs >= 2 * M_PI) + phs -= 2 * M_PI; - while (a->phs < 0.0) - a->phs += 2 * M_PI; + while (phs < 0.0) + phs += 2 * M_PI; } break; } } } - else if (a->in_buff != a->out_buff) + else if (in_buff != out_buff) { - std::copy (a->in_buff, a->in_buff + a->buff_size * 2, a->out_buff); + std::copy (in_buff, in_buff + buff_size * 2, out_buff); } } -void AMD::setBuffers_amd (AMD *a, float* in, float* out) +void AMD::setBuffers(float* in, float* out) { - a->in_buff = in; - a->out_buff = out; + in_buff = in; + out_buff = out; } -void AMD::setSamplerate_amd (AMD *a, int rate) +void AMD::setSamplerate(int rate) { - a->sample_rate = rate; - init_amd(a); + sample_rate = rate; + init(); } -void AMD::setSize_amd (AMD *a, int size) +void AMD::setSize(int size) { - a->buff_size = size; + buff_size = size; } /******************************************************************************************************** * * -* RXA Properties * +* Public Properties * * * ********************************************************************************************************/ -void AMD::SetAMDRun(RXA& rxa, int run) +void AMD::setSBMode(int _sbmode) { - AMD *a = rxa.amd; - - if (a->run != run) - { - RXA::bp1Check ( - rxa, - run, - rxa.snba->run, - rxa.emnr->run, - rxa.anf->run, - rxa.anr->run - ); - - a->run = run; - RXA::bp1Set (rxa); - } + sbmode = _sbmode; } -void AMD::SetAMDSBMode(RXA& rxa, int sbmode) +void AMD::setFadeLevel(int _levelfade) { - rxa.amd->sbmode = sbmode; -} - -void AMD::SetAMDFadeLevel(RXA& rxa, int levelfade) -{ - rxa.amd->levelfade = levelfade; + levelfade = _levelfade; } } // namesoace WDSP diff --git a/wdsp/amd.hpp b/wdsp/amd.hpp index 6616d97fe..5a9a243de 100644 --- a/wdsp/amd.hpp +++ b/wdsp/amd.hpp @@ -80,7 +80,7 @@ public: int sbmode; // sideband mode int levelfade; // Fade Leveler switch - static AMD* create_amd + AMD ( int run, int buff_size, @@ -97,18 +97,17 @@ public: double tauR, double tauI ); + ~AMD() = default; - static void init_amd (AMD *a); - static void destroy_amd (AMD *a); - static void flush_amd (AMD *a); - static void xamd (AMD *a); - static void setBuffers_amd (AMD *a, float* in, float* out); - static void setSamplerate_amd (AMD *a, int rate); - static void setSize_amd (AMD *a, int size); - // RXA Properties - static void SetAMDRun(RXA& rxa, int run); - static void SetAMDSBMode(RXA& rxa, int sbmode); - static void SetAMDFadeLevel(RXA& rxa, int levelfade); + void init(); + void flush(); + void execute(); + void setBuffers(float* in, float* out); + void setSamplerate(int rate); + void setSize(int size); + // Public Properties + void setSBMode(int sbmode); + void setFadeLevel(int levelfade); }; } // namespace WDSP diff --git a/wdsp/amsq.cpp b/wdsp/amsq.cpp index 41ea0717c..25a82c389 100644 --- a/wdsp/amsq.cpp +++ b/wdsp/amsq.cpp @@ -32,100 +32,97 @@ warren@wpratt.com namespace WDSP { -void AMSQ::compute_slews(AMSQ *a) +void AMSQ::compute_slews() { int i; double delta, theta; - delta = PI / (double)a->ntup; + delta = PI / (double)ntup; theta = 0.0; - for (i = 0; i <= a->ntup; i++) + for (i = 0; i <= ntup; i++) { - a->cup[i] = a->muted_gain + (1.0 - a->muted_gain) * 0.5 * (1.0 - cos (theta)); + cup[i] = muted_gain + (1.0 - muted_gain) * 0.5 * (1.0 - cos (theta)); theta += delta; } - delta = PI / (double)a->ntdown; + delta = PI / (double)ntdown; theta = 0.0; - for (i = 0; i <= a->ntdown; i++) + for (i = 0; i <= ntdown; i++) { - a->cdown[i] = a->muted_gain + (1.0 - a->muted_gain) * 0.5 * (1.0 + cos (theta)); + cdown[i] = muted_gain + (1.0 - muted_gain) * 0.5 * (1.0 + cos (theta)); theta += delta; } } -void AMSQ::calc_amsq(AMSQ *a) +void AMSQ::calc() { // signal averaging - a->trigsig = new float[a->size * 2]; - a->avm = exp(-1.0 / (a->rate * a->avtau)); - a->onem_avm = 1.0 - a->avm; - a->avsig = 0.0; + trigsig = new float[size * 2]; + avm = exp(-1.0 / (rate * avtau)); + onem_avm = 1.0 - avm; + avsig = 0.0; // level change - a->ntup = (int)(a->tup * a->rate); - a->ntdown = (int)(a->tdown * a->rate); - a->cup = new double[(a->ntup + 1) * 2]; // (float *)malloc0((a->ntup + 1) * sizeof(float)); - a->cdown = new double[(a->ntdown + 1) * 2]; // (float *)malloc0((a->ntdown + 1) * sizeof(float)); - compute_slews(a); + ntup = (int)(tup * rate); + ntdown = (int)(tdown * rate); + cup = new double[(ntup + 1) * 2]; // (float *)malloc0((ntup + 1) * sizeof(float)); + cdown = new double[(ntdown + 1) * 2]; // (float *)malloc0((ntdown + 1) * sizeof(float)); + compute_slews(); // control - a->state = 0; + state = 0; } -void AMSQ::decalc_amsq (AMSQ *a) +void AMSQ::decalc() { - delete[] a->cdown; - delete[] a->cup; - delete[] a->trigsig; + delete[] cdown; + delete[] cup; + delete[] trigsig; } -AMSQ* AMSQ::create_amsq ( - int run, - int size, - float* in, - float* out, - float* trigger, - int rate, - double avtau, - double tup, - double tdown, - double tail_thresh, - double unmute_thresh, - double min_tail, - double max_tail, - double muted_gain -) +AMSQ::AMSQ ( + int _run, + int _size, + float* _in, + float* _out, + float* _trigger, + int _rate, + double _avtau, + double _tup, + double _tdown, + double _tail_thresh, + double _unmute_thresh, + double _min_tail, + double _max_tail, + double _muted_gain +) : + run(_run), + size(_size), + in(_in), + out(_out), + trigger(_trigger), + rate((double) _rate), + avtau(_avtau), + tup(_tup), + tdown(_tdown), + tail_thresh(_tail_thresh), + unmute_thresh(_unmute_thresh), + min_tail(_min_tail), + max_tail(_max_tail), + muted_gain(_muted_gain) { - AMSQ *a = new AMSQ; - a->run = run; - a->size = size; - a->in = in; - a->out = out; - a->rate = (float)rate; - a->muted_gain = muted_gain; - a->trigger = trigger; - a->avtau = avtau; - a->tup = tup; - a->tdown = tdown; - a->tail_thresh = tail_thresh; - a->unmute_thresh = unmute_thresh; - a->min_tail = min_tail; - a->max_tail = max_tail; - calc_amsq (a); - return a; + calc(); } -void AMSQ::destroy_amsq (AMSQ *a) +AMSQ::~AMSQ() { - decalc_amsq (a); - delete a; + decalc(); } -void AMSQ::flush_amsq (AMSQ*a) +void AMSQ::flush() { - std::fill(a->trigsig, a->trigsig + a->size * 2, 0); - a->avsig = 0.0; - a->state = 0; + std::fill(trigsig, trigsig + size * 2, 0); + avsig = 0.0; + state = 0; } enum _amsqstate @@ -137,114 +134,116 @@ enum _amsqstate DECREASE }; -void AMSQ::xamsq (AMSQ *a) +void AMSQ::execute() { - if (a->run) + if (run) { int i; double sig, siglimit; - for (i = 0; i < a->size; i++) + for (i = 0; i < size; i++) { - sig = sqrt (a->trigsig[2 * i + 0] * a->trigsig[2 * i + 0] + a->trigsig[2 * i + 1] * a->trigsig[2 * i + 1]); - a->avsig = a->avm * a->avsig + a->onem_avm * sig; + double trigr = trigsig[2 * i + 0]; + double trigi = trigsig[2 * i + 1]; + sig = sqrt (trigr*trigr + trigi*trigi); + avsig = avm * avsig + onem_avm * sig; - switch (a->state) + switch (state) { case MUTED: - if (a->avsig > a->unmute_thresh) + if (avsig > unmute_thresh) { - a->state = INCREASE; - a->count = a->ntup; + state = INCREASE; + count = ntup; } - a->out[2 * i + 0] = a->muted_gain * a->in[2 * i + 0]; - a->out[2 * i + 1] = a->muted_gain * a->in[2 * i + 1]; + out[2 * i + 0] = muted_gain * in[2 * i + 0]; + out[2 * i + 1] = muted_gain * in[2 * i + 1]; break; case INCREASE: - a->out[2 * i + 0] = a->in[2 * i + 0] * a->cup[a->ntup - a->count]; - a->out[2 * i + 1] = a->in[2 * i + 1] * a->cup[a->ntup - a->count]; + out[2 * i + 0] = in[2 * i + 0] * cup[ntup - count]; + out[2 * i + 1] = in[2 * i + 1] * cup[ntup - count]; - if (a->count-- == 0) - a->state = UNMUTED; + if (count-- == 0) + state = UNMUTED; break; case UNMUTED: - if (a->avsig < a->tail_thresh) + if (avsig < tail_thresh) { - a->state = TAIL; + state = TAIL; - if ((siglimit = a->avsig) > 1.0) + if ((siglimit = avsig) > 1.0) siglimit = 1.0; - a->count = (int)((a->min_tail + (a->max_tail - a->min_tail) * (1.0 - siglimit)) * a->rate); + count = (int)((min_tail + (max_tail - min_tail) * (1.0 - siglimit)) * rate); } - a->out[2 * i + 0] = a->in[2 * i + 0]; - a->out[2 * i + 1] = a->in[2 * i + 1]; + out[2 * i + 0] = in[2 * i + 0]; + out[2 * i + 1] = in[2 * i + 1]; break; case TAIL: - a->out[2 * i + 0] = a->in[2 * i + 0]; - a->out[2 * i + 1] = a->in[2 * i + 1]; + out[2 * i + 0] = in[2 * i + 0]; + out[2 * i + 1] = in[2 * i + 1]; - if (a->avsig > a->unmute_thresh) + if (avsig > unmute_thresh) { - a->state = UNMUTED; + state = UNMUTED; } - else if (a->count-- == 0) + else if (count-- == 0) { - a->state = DECREASE; - a->count = a->ntdown; + state = DECREASE; + count = ntdown; } break; case DECREASE: - a->out[2 * i + 0] = a->in[2 * i + 0] * a->cdown[a->ntdown - a->count]; - a->out[2 * i + 1] = a->in[2 * i + 1] * a->cdown[a->ntdown - a->count]; + out[2 * i + 0] = in[2 * i + 0] * cdown[ntdown - count]; + out[2 * i + 1] = in[2 * i + 1] * cdown[ntdown - count]; - if (a->count-- == 0) - a->state = MUTED; + if (count-- == 0) + state = MUTED; break; } } } - else if (a->in != a->out) + else if (in != out) { - std::copy( a->in, a->in + a->size * 2, a->out); + std::copy( in, in + size * 2, out); } } -void AMSQ::xamsqcap (AMSQ *a) +void AMSQ::xcap() { - std::copy(a->trigger, a->trigger + a->size * 2, a->trigsig); + std::copy(trigger, trigger + size * 2, trigsig); } -void AMSQ::setBuffers_amsq (AMSQ *a, float* in, float* out, float* trigger) +void AMSQ::setBuffers(float* _in, float* _out, float* _trigger) { - a->in = in; - a->out = out; - a->trigger = trigger; + in = _in; + out = _out; + trigger = _trigger; } -void AMSQ::setSamplerate_amsq (AMSQ *a, int rate) +void AMSQ::setSamplerate(int _rate) { - decalc_amsq (a); - a->rate = rate; - calc_amsq (a); + decalc(); + rate = _rate; + calc(); } -void AMSQ::setSize_amsq (AMSQ *a, int size) +void AMSQ::setSize(int _size) { - decalc_amsq (a); - a->size = size; - calc_amsq (a); + decalc(); + size = _size; + calc(); } /******************************************************************************************************** @@ -253,53 +252,30 @@ void AMSQ::setSize_amsq (AMSQ *a, int size) * * ********************************************************************************************************/ -void AMSQ::SetAMSQRun (RXA& rxa, int run) +void AMSQ::setRun(int _run) { - rxa.amsq->run = run; + run = _run; } -void AMSQ::SetAMSQThreshold (RXA& rxa, double threshold) +void AMSQ::setThreshold(double _threshold) { - double thresh = pow (10.0, threshold / 20.0); - rxa.amsq->tail_thresh = 0.9 * thresh; - rxa.amsq->unmute_thresh = thresh; + double thresh = pow (10.0, _threshold / 20.0); + tail_thresh = 0.9 * thresh; + unmute_thresh = thresh; } -void AMSQ::SetAMSQMaxTail (RXA& rxa, double tail) +void AMSQ::setMaxTail(double _tail) { - AMSQ *a; - a = rxa.amsq; + if (_tail < min_tail) + _tail = min_tail; - if (tail < a->min_tail) - tail = a->min_tail; - - a->max_tail = tail; + max_tail = _tail; } -/******************************************************************************************************** -* * -* TXA Properties * -* * -********************************************************************************************************/ - -void AMSQ::SetAMSQRun (TXA& txa, int run) -{ - txa.amsq.p->run = run; -} - -void AMSQ::SetAMSQMutedGain (TXA& txa, double dBlevel) +void AMSQ::setMutedGain(double dBlevel) { // dBlevel is negative - AMSQ *a; - a = txa.amsq.p; - a->muted_gain = pow (10.0, dBlevel / 20.0); - compute_slews(a); -} - -void AMSQ::SetAMSQThreshold (TXA& txa, double threshold) -{ - double thresh = pow (10.0, threshold / 20.0); - txa.amsq.p->tail_thresh = 0.9 * thresh; - txa.amsq.p->unmute_thresh = thresh; + muted_gain = pow (10.0, dBlevel / 20.0); + compute_slews(); } } // namespace WDSP diff --git a/wdsp/amsq.hpp b/wdsp/amsq.hpp index 333acf355..069ed74da 100644 --- a/wdsp/amsq.hpp +++ b/wdsp/amsq.hpp @@ -62,42 +62,40 @@ public: double max_tail; double muted_gain; - static AMSQ* create_amsq ( - int run, - int size, - float* in, - float* out, - float* trigger, - int rate, - double avtau, - double tup, - double tdown, - double tail_thresh, - double unmute_thresh, - double min_tail, - double max_tail, - double muted_gain + AMSQ ( + int _run, + int _size, + float* _in, + float* _out, + float* _trigger, + int _rate, + double _avtau, + double _tup, + double _tdown, + double _tail_thresh, + double _unmute_thresh, + double _min_tail, + double _max_tail, + double _muted_gain ); - static void destroy_amsq (AMSQ *a); - static void flush_amsq (AMSQ *a); - static void xamsq (AMSQ *a); - static void xamsqcap (AMSQ *a); - static void setBuffers_amsq (AMSQ *a, float* in, float* out, float* trigger); - static void setSamplerate_amsq (AMSQ *a, int rate); - static void setSize_amsq (AMSQ *a, int size); + ~AMSQ(); + + void flush(); + void execute(); + void xcap(); + void setBuffers(float* in, float* out, float* trigger); + void setSamplerate(int rate); + void setSize(int size); // RXA Properties - static void SetAMSQRun (RXA& rxa, int run); - static void SetAMSQThreshold (RXA& rxa, double threshold); - static void SetAMSQMaxTail (RXA& rxa, double tail); - // TXA Properties - static void SetAMSQRun (TXA& txa, int run); - static void SetAMSQMutedGain (TXA& txa, double dBlevel); - static void SetAMSQThreshold (TXA& txa, double threshold); + void setRun(int run); + void setThreshold(double threshold); + void setMaxTail(double tail); + void setMutedGain(double dBlevel); private: - static void compute_slews(AMSQ *a); - static void calc_amsq(AMSQ *a); - static void decalc_amsq (AMSQ *a); + void compute_slews(); + void calc(); + void decalc(); }; } // namespace WDSP