1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 17:28:50 -05:00

WDSP: BANDPASS rework

This commit is contained in:
f4exb 2024-07-30 00:45:32 +02:00
parent bc06095a56
commit 575fa755f8
5 changed files with 291 additions and 297 deletions

View File

@ -444,7 +444,7 @@ RXA* RXA::create_rxa (
&rxa->agc->gain); // pointer for gain computation &rxa->agc->gain); // pointer for gain computation
// Bandpass filter - After spectral noise reduction in the block diagram // 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) 1, // run - used only with ( AM || ANF || ANR || EMNR)
0, // position 0, // position
rxa->dsp_size, // buffer size rxa->dsp_size, // buffer size
@ -570,7 +570,7 @@ void RXA::destroy_rxa (RXA *rxa)
SPEAK::destroy_speak (rxa->speak); SPEAK::destroy_speak (rxa->speak);
CBL::destroy_cbl (rxa->cbl); CBL::destroy_cbl (rxa->cbl);
SIPHON::destroy_siphon (rxa->sip1); SIPHON::destroy_siphon (rxa->sip1);
BANDPASS::destroy_bandpass (rxa->bp1); delete (rxa->bp1);
delete (rxa->agcmeter); delete (rxa->agcmeter);
delete (rxa->agc); delete (rxa->agc);
delete (rxa->emnr); delete (rxa->emnr);
@ -623,7 +623,7 @@ void RXA::flush_rxa (RXA *rxa)
rxa->emnr->flush(); rxa->emnr->flush();
rxa->agc->flush(); rxa->agc->flush();
rxa->agcmeter->flush(); rxa->agcmeter->flush();
BANDPASS::flush_bandpass (rxa->bp1); rxa->bp1->flush();
SIPHON::flush_siphon (rxa->sip1); SIPHON::flush_siphon (rxa->sip1);
CBL::flush_cbl (rxa->cbl); CBL::flush_cbl (rxa->cbl);
SPEAK::flush_speak (rxa->speak); SPEAK::flush_speak (rxa->speak);
@ -656,12 +656,12 @@ void RXA::xrxa (RXA *rxa)
rxa->anf->execute(0); rxa->anf->execute(0);
rxa->anr->ANR::execute(0); rxa->anr->ANR::execute(0);
rxa->emnr->execute(0); rxa->emnr->execute(0);
BANDPASS::xbandpass (rxa->bp1, 0); rxa->bp1->BANDPASS::execute(0);
rxa->agc->execute(); rxa->agc->execute();
rxa->anf->execute(1); rxa->anf->execute(1);
rxa->anr->execute(1); rxa->anr->execute(1);
rxa->emnr->execute(1); rxa->emnr->execute(1);
BANDPASS::xbandpass (rxa->bp1, 1); rxa->bp1->execute(1);
rxa->agcmeter->execute(); rxa->agcmeter->execute();
SIPHON::xsiphon (rxa->sip1, 0); SIPHON::xsiphon (rxa->sip1, 0);
CBL::xcbl (rxa->cbl); CBL::xcbl (rxa->cbl);
@ -767,7 +767,7 @@ void RXA::setDSPSamplerate (RXA *rxa, int dsp_rate)
rxa->anf->setSamplerate(rxa->dsp_rate); rxa->anf->setSamplerate(rxa->dsp_rate);
rxa->anr->setSamplerate(rxa->dsp_rate); rxa->anr->setSamplerate(rxa->dsp_rate);
rxa->emnr->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->agc->setSamplerate(rxa->dsp_rate);
rxa->agcmeter->setSamplerate(rxa->dsp_rate); rxa->agcmeter->setSamplerate(rxa->dsp_rate);
SIPHON::setSamplerate_siphon (rxa->sip1, 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->anr->setSize(rxa->dsp_size);
rxa->emnr->setBuffers(rxa->midbuff, rxa->midbuff); rxa->emnr->setBuffers(rxa->midbuff, rxa->midbuff);
rxa->emnr->setSize(rxa->dsp_size); rxa->emnr->setSize(rxa->dsp_size);
BANDPASS::setBuffers_bandpass (rxa->bp1, rxa->midbuff, rxa->midbuff); rxa->bp1->setBuffers(rxa->midbuff, rxa->midbuff);
BANDPASS::setSize_bandpass (rxa->bp1, rxa->dsp_size); rxa->bp1->setSize(rxa->dsp_size);
rxa->agc->setBuffers(rxa->midbuff, rxa->midbuff); rxa->agc->setBuffers(rxa->midbuff, rxa->midbuff);
rxa->agc->setSize(rxa->dsp_size); rxa->agc->setSize(rxa->dsp_size);
rxa->agcmeter->setBuffers(rxa->midbuff); rxa->agcmeter->setBuffers(rxa->midbuff);
@ -957,7 +957,7 @@ void RXA::bp1Check (
else else
gain = 1.0; gain = 1.0;
if (a->gain != gain) if (a->gain != gain)
BANDPASS::setGain_bandpass (a, gain, 0); a->setGain(gain, 0);
} }
void RXA::bp1Set (RXA& rxa) void RXA::bp1Set (RXA& rxa)
@ -974,8 +974,8 @@ void RXA::bp1Set (RXA& rxa)
else else
a->run = 0; a->run = 0;
if (!old && a->run) if (!old && a->run)
BANDPASS::flush_bandpass (a); a->flush();
FIRCORE::setUpdate_fircore (a->p); FIRCORE::setUpdate_fircore (a->fircore);
} }
void RXA::bpsnbaCheck (RXA& rxa, int mode, int notch_run) 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) 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.snba->setOutputBandwidth (f_low, f_high); // Spectral noise blanker (SNB)
rxa.nbp0->SetFreqs (f_low, f_high); // Notched bandpass rxa.nbp0->SetFreqs (f_low, f_high); // Notched bandpass
} }
@ -1378,7 +1378,7 @@ void RXA::SetNC (RXA& rxa, int nc)
int oldstate = rxa.state; int oldstate = rxa.state;
rxa.nbp0->SetNC (nc); rxa.nbp0->SetNC (nc);
rxa.bpsnba->SetNC (nc); rxa.bpsnba->SetNC (nc);
BANDPASS::SetBandpassNC (rxa, nc); rxa.bp1->SetBandpassNC (nc);
rxa.eqp->setNC (nc); rxa.eqp->setNC (nc);
rxa.fmsq->setNC (nc); rxa.fmsq->setNC (nc);
rxa.fmd->setNCde (nc); rxa.fmd->setNCde (nc);
@ -1390,7 +1390,7 @@ void RXA::SetMP (RXA& rxa, int mp)
{ {
rxa.nbp0->SetMP (mp); rxa.nbp0->SetMP (mp);
rxa.bpsnba->SetMP (mp); rxa.bpsnba->SetMP (mp);
BANDPASS::SetBandpassMP (rxa, mp); rxa.bp1->SetBandpassMP (mp);
rxa.eqp->setMP (mp); rxa.eqp->setMP (mp);
rxa.fmsq->setMP (mp); rxa.fmsq->setMP (mp);
rxa.fmd->setMPde (mp); rxa.fmd->setMPde (mp);

View File

@ -47,6 +47,8 @@ warren@wpratt.com
#include "slew.hpp" #include "slew.hpp"
#include "iqc.hpp" #include "iqc.hpp"
#include "cfir.hpp" #include "cfir.hpp"
#include "fircore.hpp"
#include "fir.hpp"
#include "TXA.hpp" #include "TXA.hpp"
namespace WDSP { namespace WDSP {
@ -276,7 +278,7 @@ TXA* TXA::create_txa (
TXA_CFC_GAIN, // index for gain value TXA_CFC_GAIN, // index for gain value
(double*) &txa->cfcomp->gain); // pointer for gain computation (double*) &txa->cfcomp->gain); // pointer for gain computation
txa->bp0 = BANDPASS::create_bandpass ( txa->bp0 = new BANDPASS(
1, // always runs 1, // always runs
0, // position 0, // position
txa->dsp_size, // size txa->dsp_size, // size
@ -297,7 +299,7 @@ TXA* TXA::create_txa (
txa->midbuff, // pointer to output buffer txa->midbuff, // pointer to output buffer
3.0); // gain 3.0); // gain
txa->bp1 = BANDPASS::create_bandpass ( txa->bp1 = new BANDPASS(
0, // ONLY RUNS WHEN COMPRESSOR IS USED 0, // ONLY RUNS WHEN COMPRESSOR IS USED
0, // position 0, // position
txa->dsp_size, // size txa->dsp_size, // size
@ -319,7 +321,7 @@ TXA* TXA::create_txa (
txa->dsp_rate, // sample rate txa->dsp_rate, // sample rate
1.95); // gain for clippings 1.95); // gain for clippings
txa->bp2 = BANDPASS::create_bandpass ( txa->bp2 = new BANDPASS(
0, // ONLY RUNS WHEN COMPRESSOR IS USED 0, // ONLY RUNS WHEN COMPRESSOR IS USED
0, // position 0, // position
txa->dsp_size, // size txa->dsp_size, // size
@ -532,11 +534,11 @@ void TXA::destroy_txa (TXA *txa)
AMMOD::destroy_ammod (txa->ammod); AMMOD::destroy_ammod (txa->ammod);
delete (txa->alc); delete (txa->alc);
delete (txa->compmeter); delete (txa->compmeter);
BANDPASS::destroy_bandpass (txa->bp2); delete (txa->bp2);
OSCTRL::destroy_osctrl (txa->osctrl); OSCTRL::destroy_osctrl (txa->osctrl);
BANDPASS::destroy_bandpass (txa->bp1); delete (txa->bp1);
COMPRESSOR::destroy_compressor (txa->compressor); COMPRESSOR::destroy_compressor (txa->compressor);
BANDPASS::destroy_bandpass (txa->bp0); delete (txa->bp0);
delete (txa->cfcmeter); delete (txa->cfcmeter);
CFCOMP::destroy_cfcomp (txa->cfcomp); CFCOMP::destroy_cfcomp (txa->cfcomp);
delete (txa->lvlrmeter); delete (txa->lvlrmeter);
@ -574,11 +576,11 @@ void TXA::flush_txa (TXA* txa)
txa->lvlrmeter->flush (); txa->lvlrmeter->flush ();
CFCOMP::flush_cfcomp (txa->cfcomp); CFCOMP::flush_cfcomp (txa->cfcomp);
txa->cfcmeter->flush (); txa->cfcmeter->flush ();
BANDPASS::flush_bandpass (txa->bp0); txa->bp0->flush ();
COMPRESSOR::flush_compressor (txa->compressor); COMPRESSOR::flush_compressor (txa->compressor);
BANDPASS::flush_bandpass (txa->bp1); txa->bp1->flush ();
OSCTRL::flush_osctrl (txa->osctrl); OSCTRL::flush_osctrl (txa->osctrl);
BANDPASS::flush_bandpass (txa->bp2); txa->bp2->flush ();
txa->compmeter->flush (); txa->compmeter->flush ();
txa->alc->flush (); txa->alc->flush ();
AMMOD::flush_ammod (txa->ammod); AMMOD::flush_ammod (txa->ammod);
@ -609,11 +611,11 @@ void xtxa (TXA* txa)
txa->lvlrmeter->execute (); // Leveler Meter txa->lvlrmeter->execute (); // Leveler Meter
CFCOMP::xcfcomp (txa->cfcomp, 0); // Continuous Frequency Compressor with post-EQ CFCOMP::xcfcomp (txa->cfcomp, 0); // Continuous Frequency Compressor with post-EQ
txa->cfcmeter->execute (); // CFC+PostEQ Meter 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 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 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->compmeter->execute (); // COMP meter
txa->alc->execute (); // ALC txa->alc->execute (); // ALC
AMMOD::xammod (txa->ammod); // AM Modulator AMMOD::xammod (txa->ammod); // AM Modulator
@ -706,11 +708,11 @@ void TXA::setDSPSamplerate (TXA *txa, int dsp_rate)
txa->lvlrmeter->setSamplerate (txa->dsp_rate); txa->lvlrmeter->setSamplerate (txa->dsp_rate);
CFCOMP::setSamplerate_cfcomp (txa->cfcomp, txa->dsp_rate); CFCOMP::setSamplerate_cfcomp (txa->cfcomp, txa->dsp_rate);
txa->cfcmeter->setSamplerate (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); 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); 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->compmeter->setSamplerate (txa->dsp_rate);
txa->alc->setSamplerate (txa->dsp_rate); txa->alc->setSamplerate (txa->dsp_rate);
AMMOD::setSamplerate_ammod (txa->ammod, 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); CFCOMP::setSize_cfcomp (txa->cfcomp, txa->dsp_size);
txa->cfcmeter->setBuffers(txa->midbuff); txa->cfcmeter->setBuffers(txa->midbuff);
txa->cfcmeter->setSize(txa->dsp_size); txa->cfcmeter->setSize(txa->dsp_size);
BANDPASS::setBuffers_bandpass (txa->bp0, txa->midbuff, txa->midbuff); txa->bp0->setBuffers (txa->midbuff, txa->midbuff);
BANDPASS::setSize_bandpass (txa->bp0, txa->dsp_size); txa->bp0->setSize (txa->dsp_size);
COMPRESSOR::setBuffers_compressor (txa->compressor, txa->midbuff, txa->midbuff); COMPRESSOR::setBuffers_compressor (txa->compressor, txa->midbuff, txa->midbuff);
COMPRESSOR::setSize_compressor (txa->compressor, txa->dsp_size); COMPRESSOR::setSize_compressor (txa->compressor, txa->dsp_size);
BANDPASS::setBuffers_bandpass (txa->bp1, txa->midbuff, txa->midbuff); txa->bp1->setBuffers (txa->midbuff, txa->midbuff);
BANDPASS::setSize_bandpass (txa->bp1, txa->dsp_size); txa->bp1->setSize (txa->dsp_size);
OSCTRL::setBuffers_osctrl (txa->osctrl, txa->midbuff, txa->midbuff); OSCTRL::setBuffers_osctrl (txa->osctrl, txa->midbuff, txa->midbuff);
OSCTRL::setSize_osctrl (txa->osctrl, txa->dsp_size); OSCTRL::setSize_osctrl (txa->osctrl, txa->dsp_size);
BANDPASS::setBuffers_bandpass (txa->bp2, txa->midbuff, txa->midbuff); txa->bp2->setBuffers (txa->midbuff, txa->midbuff);
BANDPASS::setSize_bandpass (txa->bp2, txa->dsp_size); txa->bp2->setSize (txa->dsp_size);
txa->compmeter->setBuffers(txa->midbuff); txa->compmeter->setBuffers(txa->midbuff);
txa->compmeter->setSize(txa->dsp_size); txa->compmeter->setSize(txa->dsp_size);
txa->alc->setBuffers(txa->midbuff, txa->midbuff); txa->alc->setBuffers(txa->midbuff, txa->midbuff);
@ -914,14 +916,14 @@ void TXA::SetupBPFilters (TXA& txa)
case TXA_DIGU: case TXA_DIGU:
case TXA_SPEC: case TXA_SPEC:
case TXA_DRM: 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) 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; txa.bp1->run = 1;
if (txa.osctrl->run) 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; txa.bp2->run = 1;
} }
} }
@ -932,42 +934,42 @@ void TXA::SetupBPFilters (TXA& txa)
case TXA_FM: case TXA_FM:
if (txa.compressor->run) if (txa.compressor->run)
{ {
BANDPASS::CalcBandpassFilter (txa.bp0, 0.0, txa.f_high, 2.0); txa.bp0->calcBandpassFilter (0.0, txa.f_high, 2.0);
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; txa.bp1->run = 1;
if (txa.osctrl->run) 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; txa.bp2->run = 1;
} }
} }
else 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; break;
case TXA_AM_LSB: 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) 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; txa.bp1->run = 1;
if (txa.osctrl->run) 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; txa.bp2->run = 1;
} }
} }
break; break;
case TXA_AM_USB: 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) 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; txa.bp1->run = 1;
if (txa.osctrl->run) 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; 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 * * Collectives *
@ -984,7 +1073,8 @@ void TXA::SetupBPFilters (TXA& txa)
void TXA::SetNC (TXA& txa, int nc) void TXA::SetNC (TXA& txa, int nc)
{ {
int oldstate = txa.state; int oldstate = txa.state;
BANDPASS::SetBandpassNC (txa, nc);
SetBandpassNC (txa, nc);
EMPHP::SetFMEmphNC (txa, nc); EMPHP::SetFMEmphNC (txa, nc);
txa.eqp->setNC (nc); txa.eqp->setNC (nc);
FMMOD::SetFMNC (txa, nc); FMMOD::SetFMNC (txa, nc);
@ -994,7 +1084,7 @@ void TXA::SetNC (TXA& txa, int nc)
void TXA::SetMP (TXA& txa, int mp) void TXA::SetMP (TXA& txa, int mp)
{ {
BANDPASS::SetBandpassMP (txa, mp); SetBandpassMP (txa, mp);
EMPHP::SetFMEmphMP (txa, mp); EMPHP::SetFMEmphMP (txa, mp);
txa.eqp->setMP (mp); txa.eqp->setMP (mp);
FMMOD::SetFMMP (txa, mp); FMMOD::SetFMMP (txa, mp);

View File

@ -191,6 +191,8 @@ public:
// TXA Properties // TXA Properties
static void SetMode (TXA& txa, int mode); static void SetMode (TXA& txa, int mode);
static void SetBandpassFreqs (TXA& txa, float f_low, float f_high); 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 // Collectives
static void SetNC (TXA& txa, int nc); static void SetNC (TXA& txa, int nc);

View File

@ -40,143 +40,140 @@ namespace WDSP {
* * * *
********************************************************************************************************/ ********************************************************************************************************/
BANDPASS* BANDPASS::create_bandpass ( BANDPASS::BANDPASS(
int run, int _run,
int position, int _position,
int size, int _size,
int nc, int _nc,
int mp, int _mp,
float* in, float* _in,
float* out, float* _out,
double f_low, double _f_low,
double f_high, double _f_high,
int samplerate, int _samplerate,
int wintype, int _wintype,
double gain double _gain
) )
{ {
// NOTE: 'nc' must be >= 'size' // NOTE: 'nc' must be >= 'size'
BANDPASS *a = new BANDPASS; run = _run;
a->run = run; position = _position;
a->position = position; size = _size;
a->size = size; nc = _nc;
a->nc = nc; mp = _mp;
a->mp = mp; in = _in;
a->in = in; out = _out;
a->out = out; f_low = _f_low;
a->f_low = f_low; f_high = _f_high;
a->f_high = f_high; samplerate = _samplerate;
a->samplerate = samplerate; wintype = _wintype;
a->wintype = wintype; gain = _gain;
a->gain = gain;
float* impulse = FIR::fir_bandpass ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
a->f_low, f_low,
a->f_high, f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); fircore = FIRCORE::create_fircore (size, in, out, nc, 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);
delete[] 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' // NOTE: 'size' must be <= 'nc'
a->size = size; size = _size;
FIRCORE::setSize_fircore (a->p, a->size); FIRCORE::setSize_fircore (fircore, size);
// recalc impulse because scale factor is a function of size // recalc impulse because scale factor is a function of size
float* impulse = FIR::fir_bandpass ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
a->f_low, f_low,
a->f_high, f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); 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 ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
a->f_low, f_low,
a->f_high, f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); 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; f_low = _f_low;
a->f_high = f_high; f_high = _f_high;
a->gain = gain; gain = _gain;
float* impulse = FIR::fir_bandpass ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
a->f_low, f_low,
a->f_high, f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); 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 != f_low) || (_f_high != f_high))
if ((f_low != a->f_low) || (f_high != a->f_high))
{ {
float* impulse = FIR::fir_bandpass ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
f_low, _f_low,
f_high, _f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); delete[] (impulse);
a->f_low = f_low; f_low = _f_low;
a->f_high = f_high; f_high = _f_high;
FIRCORE::setUpdate_fircore (a->p); FIRCORE::setUpdate_fircore (fircore);
} }
} }
void BANDPASS::SetBandpassNC (RXA& rxa, int nc) void BANDPASS::SetBandpassNC(int _nc)
{ {
// NOTE: 'nc' must be >= 'size' // NOTE: 'nc' must be >= 'size'
BANDPASS *a; if (_nc != nc)
a = rxa.bp1;
if (nc != a->nc)
{ {
a->nc = nc; nc = _nc;
float* impulse = FIR::fir_bandpass ( float* impulse = FIR::fir_bandpass (
a->nc, nc,
a->f_low, f_low,
a->f_high, f_high,
a->samplerate, samplerate,
a->wintype, wintype,
1, 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); delete[] (impulse);
} }
} }
void BANDPASS::SetBandpassMP (RXA& rxa, int mp) void BANDPASS::SetBandpassMP(int _mp)
{ {
BANDPASS *a; if (_mp != mp)
a = rxa.bp1;
if (mp != a->mp)
{ {
a->mp = mp; mp = _mp;
FIRCORE::setMp_fircore (a->p, a->mp); FIRCORE::setMp_fircore (fircore, mp);
} }
} }
@ -263,7 +252,7 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp)
// a->f_low = f_low; // a->f_low = f_low;
// a->f_high = f_high; // 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)); // 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); // delete[] (impulse);
// } // }
// a = txa.bp1; // a = txa.bp1;
@ -272,7 +261,7 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp)
// a->f_low = f_low; // a->f_low = f_low;
// a->f_high = f_high; // 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)); // 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); // delete[] (impulse);
// } // }
// a = txa.bp2; // a = txa.bp2;
@ -281,96 +270,9 @@ void BANDPASS::SetBandpassMP (RXA& rxa, int mp)
// a->f_low = f_low; // a->f_low = f_low;
// a->f_high = f_high; // 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)); // 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); // 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 } // namespace WDSP

View File

@ -64,9 +64,9 @@ public:
double samplerate; double samplerate;
int wintype; int wintype;
double gain; double gain;
FIRCORE *p; FIRCORE *fircore;
static BANDPASS *create_bandpass ( BANDPASS(
int run, int run,
int position, int position,
int size, int size,
@ -80,21 +80,21 @@ public:
int wintype, int wintype,
double gain double gain
); );
static void destroy_bandpass (BANDPASS *a); BANDPASS(const BANDPASS&) = delete;
static void flush_bandpass (BANDPASS *a); BANDPASS& operator=(const BANDPASS& other) = delete;
static void xbandpass (BANDPASS *a, int pos); ~BANDPASS();
static void setBuffers_bandpass (BANDPASS *a, float* in, float* out);
static void setSamplerate_bandpass (BANDPASS *a, int rate); void flush();
static void setSize_bandpass (BANDPASS *a, int size); void execute(int pos);
static void setGain_bandpass (BANDPASS *a, double gain, int update); void setBuffers(float* in, float* out);
static void CalcBandpassFilter (BANDPASS *a, double f_low, double f_high, double gain); 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 // RXA Prototypes
static void SetBandpassFreqs (RXA& rxa, double f_low, double f_high); void setBandpassFreqs(double f_low, double f_high);
static void SetBandpassNC (RXA& rxa, int nc); void SetBandpassNC(int nc);
static void SetBandpassMP (RXA& rxa, int mp); void SetBandpassMP(int mp);
// TXA Prototypes
static void SetBandpassNC (TXA& txa, int nc);
static void SetBandpassMP (TXA& txa, int mp);
}; };
} // namespace WDSP } // namespace WDSP