From d6159067a82b9cca67265300fae5e4e5e69d9630 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 3 Aug 2024 11:05:12 +0200 Subject: [PATCH] WDSP: Sonar lint fixes (2) --- .gitignore | 1 + wdsp/amsq.cpp | 4 +- wdsp/eq.cpp | 378 ++++++++++---------------------------------- wdsp/eq.hpp | 47 ++++-- wdsp/eqp.cpp | 94 +++++------ wdsp/eqp.hpp | 6 +- wdsp/fmd.cpp | 115 ++++++++++---- wdsp/fmsq.cpp | 68 ++++---- wdsp/fmsq.hpp | 11 +- wdsp/gen.cpp | 123 +++++++------- wdsp/gen.hpp | 133 +++++++++------- wdsp/meter.cpp | 39 +++-- wdsp/meter.hpp | 2 +- wdsp/mpeak.cpp | 14 +- wdsp/nbp.cpp | 85 +++++----- wdsp/nbp.hpp | 8 +- wdsp/nob.cpp | 39 ++--- wdsp/patchpanel.cpp | 40 ++--- wdsp/phrot.cpp | 16 +- wdsp/phrot.hpp | 9 +- wdsp/resample.cpp | 51 +++--- wdsp/resample.hpp | 8 +- wdsp/sender.cpp | 19 +-- wdsp/shift.cpp | 16 +- wdsp/siphon.cpp | 157 ++++++------------ wdsp/siphon.hpp | 5 - wdsp/snba.cpp | 359 +++++++++++++++++++++-------------------- wdsp/snba.hpp | 138 +++++++++------- wdsp/snotch.cpp | 12 +- wdsp/snotch.hpp | 14 +- wdsp/speak.cpp | 58 ++++--- wdsp/speak.hpp | 15 +- wdsp/sphp.cpp | 9 +- wdsp/ssql.cpp | 112 ++++++------- wdsp/ssql.hpp | 25 +-- wdsp/wcpAGC.cpp | 38 +++-- wdsp/wcpAGC.hpp | 6 +- 37 files changed, 1091 insertions(+), 1183 deletions(-) diff --git a/.gitignore b/.gitignore index 5650b32d4..49afebe63 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ obj-x86_64-linux-gnu/* **/venv*/ *.pyc .DS_Store +.sonarlint ### Go ### # Binaries for programs and plugins diff --git a/wdsp/amsq.cpp b/wdsp/amsq.cpp index e4c145cdd..c84189395 100644 --- a/wdsp/amsq.cpp +++ b/wdsp/amsq.cpp @@ -25,6 +25,8 @@ warren@wpratt.com */ +#include + #include "comm.hpp" #include "amsq.hpp" @@ -174,7 +176,7 @@ void AMSQ::execute() } else if (count-- == 0) { - state = AMSQState::TAIL; + state = AMSQState::DECREASE; count = ntdown; } diff --git a/wdsp/eq.cpp b/wdsp/eq.cpp index d1450e4e2..73ed34ee9 100644 --- a/wdsp/eq.cpp +++ b/wdsp/eq.cpp @@ -42,332 +42,124 @@ namespace WDSP { ********************************************************************************************************/ -float* EQ::eq_mults (int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype) +void EQ::eq_mults (std::vector& mults, int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype) { float* impulse = EQP::eq_impulse (size + 1, nfreqs, F, G, samplerate, scale, ctfmode, wintype); - float* mults = FIR::fftcv_mults(2 * size, impulse); - delete[] (impulse); - return mults; + float* _mults = FIR::fftcv_mults(2 * size, impulse); + mults.resize(2 * size * 2); + std::copy(_mults, _mults + 2*size*2, mults.begin()); + delete[] _mults; + delete[] impulse; } -void EQ::calc_eq (EQ *a) +void EQ::calc() { - a->scale = 1.0 / (float)(2 * a->size); - a->infilt = new float[2 * a->size * 2]; // (float *)malloc0(2 * a->size * sizeof(complex)); - a->product = new float[2 * a->size * 2]; // (float *)malloc0(2 * a->size * sizeof(complex)); - a->CFor = fftwf_plan_dft_1d(2 * a->size, (fftwf_complex *)a->infilt, (fftwf_complex *)a->product, FFTW_FORWARD, FFTW_PATIENT); - a->CRev = fftwf_plan_dft_1d(2 * a->size, (fftwf_complex *)a->product, (fftwf_complex *)a->out, FFTW_BACKWARD, FFTW_PATIENT); - a->mults = EQ::eq_mults(a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); + scale = (float) (1.0 / (float)(2 * size)); + infilt.resize(2 * size * 2); + product.resize(2 * size * 2); + CFor = fftwf_plan_dft_1d( + 2 * size, + (fftwf_complex *) infilt.data(), + (fftwf_complex *) product.data(), + FFTW_FORWARD, + FFTW_PATIENT + ); + CRev = fftwf_plan_dft_1d( + 2 * size, + (fftwf_complex *) product.data(), + (fftwf_complex *) out, + FFTW_BACKWARD, + FFTW_PATIENT + ); + EQ::eq_mults(mults, size, nfreqs, F.data(), G.data(), samplerate, scale, ctfmode, wintype); } -void EQ::decalc_eq (EQ *a) +void EQ::decalc() { - fftwf_destroy_plan(a->CRev); - fftwf_destroy_plan(a->CFor); - delete[] (a->mults); - delete[] (a->product); - delete[] (a->infilt); + fftwf_destroy_plan(CRev); + fftwf_destroy_plan(CFor); } -EQ* EQ::create_eq (int run, int size, float *in, float *out, int nfreqs, float* F, float* G, int ctfmode, int wintype, int samplerate) +EQ::EQ( + int _run, + int _size, + float *_in, + float *_out, + int _nfreqs, + const float* _F, + const float* _G, + int _ctfmode, + int _wintype, + int _samplerate +) : + run(_run), + size(_size), + in(_in), + out(_out), + nfreqs(_nfreqs), + ctfmode(_ctfmode), + wintype(_wintype), + samplerate((float) _samplerate) { - EQ *a = new EQ; - a->run = run; - a->size = size; - a->in = in; - a->out = out; - a->nfreqs = nfreqs; - a->F = new float[a->nfreqs + 1]; // (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = new float[a->nfreqs + 1]; // (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - memcpy (a->F, F, (nfreqs + 1) * sizeof (float)); - memcpy (a->G, G, (nfreqs + 1) * sizeof (float)); - a->ctfmode = ctfmode; - a->wintype = wintype; - a->samplerate = (float)samplerate; - calc_eq (a); - return a; + F.resize(nfreqs + 1); + G.resize(nfreqs + 1); + std::copy(_F, _F + nfreqs + 1, F.begin()); + std::copy(_G, _G + nfreqs + 1, G.begin()); + calc(); } -void EQ::destroy_eq (EQ *a) +EQ::~EQ() { - decalc_eq (a); - delete[] (a->G); - delete[] (a->F); - delete[] (a); + decalc(); } -void EQ::flush_eq (EQ *a) +void EQ::flush() { - std::fill(a->infilt, a->infilt + 2 * a->size * 2, 0); + std::fill(infilt.begin(), infilt.end(), 0); } -void EQ::xeq (EQ *a) +void EQ::execute() { - int i; - float I, Q; - if (a->run) + float I; + float Q; + if (run) { - std::copy(a->in, a->in + a->size * 2, &(a->infilt[2 * a->size])); - fftwf_execute (a->CFor); - for (i = 0; i < 2 * a->size; i++) + std::copy(in, in + size * 2, &(infilt[2 * size])); + fftwf_execute (CFor); + for (int i = 0; i < 2 * size; i++) { - I = a->product[2 * i + 0]; - Q = a->product[2 * i + 1]; - a->product[2 * i + 0] = I * a->mults[2 * i + 0] - Q * a->mults[2 * i + 1]; - a->product[2 * i + 1] = I * a->mults[2 * i + 1] + Q * a->mults[2 * i + 0]; + I = product[2 * i + 0]; + Q = product[2 * i + 1]; + product[2 * i + 0] = I * mults[2 * i + 0] - Q * mults[2 * i + 1]; + product[2 * i + 1] = I * mults[2 * i + 1] + Q * mults[2 * i + 0]; } - fftwf_execute (a->CRev); - std::copy(&(a->infilt[2 * a->size]), &(a->infilt[2 * a->size]) + a->size * 2, a->infilt); + fftwf_execute (CRev); + std::copy(&(infilt[2 * size]), &(infilt[2 * size]) + size * 2, infilt); } - else if (a->in != a->out) - std::copy( a->in, a->in + a->size * 2, a->out); + else if (in != out) + std::copy( in, in + size * 2, out); } -void EQ::setBuffers_eq (EQ *a, float* in, float* out) +void EQ::setBuffers(float* _in, float* _out) { - decalc_eq (a); - a->in = in; - a->out = out; - calc_eq (a); + decalc(); + in = _in; + out = _out; + calc(); } -void EQ::setSamplerate_eq (EQ *a, int rate) +void EQ::setSamplerate(int _rate) { - decalc_eq (a); - a->samplerate = rate; - calc_eq (a); + decalc(); + samplerate = (float) _rate; + calc(); } -void EQ::setSize_eq (EQ *a, int size) +void EQ::setSize(int _size) { - decalc_eq (a); - a->size = size; - calc_eq (a); + decalc(); + size = _size; + calc(); } -/******************************************************************************************************** -* * -* Overlap-Save Equalizer: RXA Properties * -* * -********************************************************************************************************/ -/* // UNCOMMENT properties when a pointer is in place in rxa -PORT -void SetRXAEQRun (int channel, int run) -{ - ch.csDSP.lock(); - rxa.eq->run = run; - ch.csDSP.unlock(); -} - -PORT -void SetRXAEQProfile (int channel, int nfreqs, float* F, float* G) -{ - EQ a; - ch.csDSP.lock(); - a = rxa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = nfreqs; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - memcpy (a->F, F, (nfreqs + 1) * sizeof (float)); - memcpy (a->G, G, (nfreqs + 1) * sizeof (float)); - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetRXAEQCtfmode (int channel, int mode) -{ - EQ a; - ch.csDSP.lock(); - a = rxa.eq; - a->ctfmode = mode; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetRXAEQWintype (int channel, int wintype) -{ - EQ a; - ch.csDSP.lock(); - a = rxa.eq; - a->wintype = wintype; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetRXAGrphEQ (int channel, int *rxeq) -{ // three band equalizer (legacy compatibility) - EQ a; - ch.csDSP.lock(); - a = rxa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = 4; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->F[1] = 150.0; - a->F[2] = 400.0; - a->F[3] = 1500.0; - a->F[4] = 6000.0; - a->G[0] = (float)rxeq[0]; - a->G[1] = (float)rxeq[1]; - a->G[2] = (float)rxeq[1]; - a->G[3] = (float)rxeq[2]; - a->G[4] = (float)rxeq[3]; - a->ctfmode = 0; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetRXAGrphEQ10 (int channel, int *rxeq) -{ // ten band equalizer (legacy compatibility) - EQ a; - int i; - ch.csDSP.lock(); - a = rxa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = 10; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->F[1] = 32.0; - a->F[2] = 63.0; - a->F[3] = 125.0; - a->F[4] = 250.0; - a->F[5] = 500.0; - a->F[6] = 1000.0; - a->F[7] = 2000.0; - a->F[8] = 4000.0; - a->F[9] = 8000.0; - a->F[10] = 16000.0; - for (i = 0; i <= a->nfreqs; i++) - a->G[i] = (float)rxeq[i]; - a->ctfmode = 0; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} -*/ -/******************************************************************************************************** -* * -* Overlap-Save Equalizer: TXA Properties * -* * -********************************************************************************************************/ -/* // UNCOMMENT properties when a pointer is in place in rxa -PORT -void SetTXAEQRun (int channel, int run) -{ - ch.csDSP.lock(); - txa.eq->run = run; - ch.csDSP.unlock(); -} - -PORT -void SetTXAEQProfile (int channel, int nfreqs, float* F, float* G) -{ - EQ a; - ch.csDSP.lock(); - a = txa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = nfreqs; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - memcpy (a->F, F, (nfreqs + 1) * sizeof (float)); - memcpy (a->G, G, (nfreqs + 1) * sizeof (float)); - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetTXAEQCtfmode (int channel, int mode) -{ - EQ a; - ch.csDSP.lock(); - a = txa.eq; - a->ctfmode = mode; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetTXAEQMethod (int channel, int wintype) -{ - EQ a; - ch.csDSP.lock(); - a = txa.eq; - a->wintype = wintype; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetTXAGrphEQ (int channel, int *txeq) -{ // three band equalizer (legacy compatibility) - EQ a; - ch.csDSP.lock(); - a = txa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = 4; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->F[1] = 150.0; - a->F[2] = 400.0; - a->F[3] = 1500.0; - a->F[4] = 6000.0; - a->G[0] = (float)txeq[0]; - a->G[1] = (float)txeq[1]; - a->G[2] = (float)txeq[1]; - a->G[3] = (float)txeq[2]; - a->G[4] = (float)txeq[3]; - a->ctfmode = 0; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} - -PORT -void SetTXAGrphEQ10 (int channel, int *txeq) -{ // ten band equalizer (legacy compatibility) - EQ a; - int i; - ch.csDSP.lock(); - a = txa.eq; - delete[] (a->G); - delete[] (a->F); - a->nfreqs = 10; - a->F = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->G = (float *) malloc0 ((a->nfreqs + 1) * sizeof (float)); - a->F[1] = 32.0; - a->F[2] = 63.0; - a->F[3] = 125.0; - a->F[4] = 250.0; - a->F[5] = 500.0; - a->F[6] = 1000.0; - a->F[7] = 2000.0; - a->F[8] = 4000.0; - a->F[9] = 8000.0; - a->F[10] = 16000.0; - for (i = 0; i <= a->nfreqs; i++) - a->G[i] = (float)txeq[i]; - a->ctfmode = 0; - delete[] (a->mults); - a->mults = eq_mults (a->size, a->nfreqs, a->F, a->G, a->samplerate, a->scale, a->ctfmode, a->wintype); - ch.csDSP.unlock(); -} -*/ - } // namespace WDSP diff --git a/wdsp/eq.hpp b/wdsp/eq.hpp index 66748cb55..473e66b1c 100644 --- a/wdsp/eq.hpp +++ b/wdsp/eq.hpp @@ -34,6 +34,8 @@ warren@wpratt.com #ifndef wdsp_eq_h #define wdsp_eq_h +#include + #include "fftw3.h" #include "export.h" @@ -47,11 +49,11 @@ public: float* in; float* out; int nfreqs; - float* F; - float* G; - float* infilt; - float* product; - float* mults; + std::vector F; + std::vector G; + std::vector infilt; + std::vector product; + std::vector mults; float scale; int ctfmode; int wintype; @@ -59,19 +61,32 @@ public: fftwf_plan CFor; fftwf_plan CRev; - static EQ* create_eq (int run, int size, float *in, float *out, int nfreqs, float* F, float* G, int ctfmode, int wintype, int samplerate); - // static float* eq_mults (int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype); - static void destroy_eq (EQ *a); - static void flush_eq (EQ *a); - static void xeq (EQ *a); - static void setBuffers_eq (EQ *a, float* in, float* out); - static void setSamplerate_eq (EQ *a, int rate); - static void setSize_eq (EQ *a, int size); + EQ( + int run, + int size, + float *in, + float *out, + int nfreqs, + const float* F, + const float* G, + int ctfmode, + int wintype, + int samplerate + ); + EQ(const EQ&) = delete; + EQ& operator=(EQ& other) = delete; + ~EQ() = default; + + void flush(); + void execute(); + void setBuffers(float* in, float* out); + void setSamplerate(int rate); + void setSize(int size); private: - static float* eq_mults (int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype); - static void calc_eq (EQ *a); - static void decalc_eq (EQ *a); + static void eq_mults (std::vector& mults, int size, int nfreqs, float* F, float* G, float samplerate, float scale, int ctfmode, int wintype); + void calc(); + void decalc(); }; } // namespace WDSP diff --git a/wdsp/eqp.cpp b/wdsp/eqp.cpp index a4c1fe5b1..2edf81b5a 100644 --- a/wdsp/eqp.cpp +++ b/wdsp/eqp.cpp @@ -42,22 +42,27 @@ int EQP::fEQcompare (const void * a, const void * b) return 1; } -float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate, double scale, int ctfmode, int wintype) +float* EQP::eq_impulse (int N, int nfreqs, const float* F, const float* G, double samplerate, double scale, int ctfmode, int wintype) { - float* fp = new float[nfreqs + 2]; // (float *) malloc0 ((nfreqs + 2) * sizeof (float)); - float* gp = new float[nfreqs + 2]; // (float *) malloc0 ((nfreqs + 2) * sizeof (float)); - float* A = new float[N / 2 + 1]; // (float *) malloc0 ((N / 2 + 1) * sizeof (float)); - float* sary = new float[2 * nfreqs]; // (float *) malloc0 (2 * nfreqs * sizeof (float)); - double gpreamp, f, frac; + std::vector fp(nfreqs + 2); + std::vector gp(nfreqs + 2); + std::vector A(N / 2 + 1); + float* sary = new float[2 * nfreqs]; + + double gpreamp; + double f; + double frac; float* impulse; - int i, j, mid; + int i; + int j; + int mid; fp[0] = 0.0; fp[nfreqs + 1] = 1.0; gpreamp = G[0]; for (i = 1; i <= nfreqs; i++) { - fp[i] = 2.0 * F[i] / samplerate; + fp[i] = (float) (2.0 * F[i] / samplerate); if (fp[i] < 0.0) fp[i] = 0.0; @@ -97,7 +102,7 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate j++; frac = (f - fp[j]) / (fp[j + 1] - fp[j]); - A[i] = pow (10.0, 0.05 * (frac * gp[j + 1] + (1.0 - frac) * gp[j] + gpreamp)) * scale; + A[i] = (float) (pow (10.0, 0.05 * (frac * gp[j + 1] + (1.0 - frac) * gp[j] + gpreamp)) * scale); } } else @@ -110,14 +115,19 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate j++; frac = (f - fp[j]) / (fp[j + 1] - fp[j]); - A[i] = pow (10.0, 0.05 * (frac * gp[j + 1] + (1.0 - frac) * gp[j] + gpreamp)) * scale; + A[i] = (float) (pow (10.0, 0.05 * (frac * gp[j + 1] + (1.0 - frac) * gp[j] + gpreamp)) * scale); } } if (ctfmode == 0) { - int k, low, high; - double lowmag, highmag, flow4, fhigh4; + int k; + int low; + int high; + double lowmag; + double highmag; + double flow4; + double fhigh4; if (N & 1) { @@ -134,7 +144,7 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate f = (double)k / (double)mid; lowmag *= (f * f * f * f) / flow4; if (lowmag < 1.0e-20) lowmag = 1.0e-20; - A[k] = lowmag; + A[k] = (float) lowmag; } k = high; @@ -144,7 +154,7 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate f = (double)k / (double)mid; highmag *= fhigh4 / (f * f * f * f); if (highmag < 1.0e-20) highmag = 1.0e-20; - A[k] = highmag; + A[k] = (float) highmag; } } else @@ -162,7 +172,7 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate f = (double)k / (double)mid; lowmag *= (f * f * f * f) / flow4; if (lowmag < 1.0e-20) lowmag = 1.0e-20; - A[k] = lowmag; + A[k] = (float) lowmag; } k = high; @@ -172,21 +182,17 @@ float* EQP::eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate f = (double)k / (double)mid; highmag *= fhigh4 / (f * f * f * f); if (highmag < 1.0e-20) highmag = 1.0e-20; - A[k] = highmag; + A[k] = (float) highmag; } } } if (N & 1) - impulse = FIR::fir_fsamp_odd(N, A, 1, 1.0, wintype); + impulse = FIR::fir_fsamp_odd(N, A.data(), 1, 1.0, wintype); else - impulse = FIR::fir_fsamp(N, A, 1, 1.0, wintype); + impulse = FIR::fir_fsamp(N, A.data(), 1, 1.0, wintype); - // print_impulse("eq.txt", N, impulse, 1, 0); - delete[] (sary); - delete[] (A); - delete[] (gp); - delete[] (fp); + delete[] sary; return impulse; } @@ -220,8 +226,8 @@ EQP::EQP( in = _in; out = _out; nfreqs = _nfreqs; - F.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); - G.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); + F.resize(nfreqs + 1); + G.resize(nfreqs + 1); std::copy(_F, _F + (_nfreqs + 1), F.begin()); std::copy(_G, _G + (_nfreqs + 1), G.begin()); ctfmode = _ctfmode; @@ -229,7 +235,7 @@ EQP::EQP( samplerate = (double) _samplerate; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); fircore = FIRCORE::create_fircore (size, in, out, nc, mp, impulse); - delete[] (impulse); + delete[] impulse; } EQP::~EQP() @@ -263,7 +269,7 @@ void EQP::setSamplerate(int rate) samplerate = rate; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } void EQP::setSize(int _size) @@ -273,7 +279,7 @@ void EQP::setSize(int _size) FIRCORE::setSize_fircore (fircore, size); impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } /******************************************************************************************************** @@ -296,7 +302,7 @@ void EQP::setNC(int _nc) nc = _nc; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setNc_fircore (fircore, nc, impulse); - delete[] (impulse); + delete[] impulse; } } @@ -313,13 +319,13 @@ void EQP::setProfile(int _nfreqs, const float* _F, const float* _G) { float* impulse; nfreqs = _nfreqs; - F.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); - G.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); + F.resize(nfreqs + 1); + G.resize(nfreqs + 1); std::copy(_F, _F + (_nfreqs + 1), F.begin()); std::copy(_G, _G + (_nfreqs + 1), G.begin()); impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } void EQP::setCtfmode(int _mode) @@ -328,7 +334,7 @@ void EQP::setCtfmode(int _mode) ctfmode = _mode; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } void EQP::setWintype(int _wintype) @@ -337,15 +343,15 @@ void EQP::setWintype(int _wintype) wintype = _wintype; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } -void EQP::setGrphEQ(int *rxeq) +void EQP::setGrphEQ(const int *rxeq) { // three band equalizer (legacy compatibility) float* impulse; nfreqs = 4; - F.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); - G.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); + F.resize(nfreqs + 1); + G.resize(nfreqs + 1); F[1] = 150.0; F[2] = 400.0; F[3] = 1500.0; @@ -358,16 +364,15 @@ void EQP::setGrphEQ(int *rxeq) ctfmode = 0; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } -void EQP::setGrphEQ10(int *rxeq) +void EQP::setGrphEQ10(const int *rxeq) { // ten band equalizer (legacy compatibility) float* impulse; - int i; nfreqs = 10; - F.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); - G.resize(nfreqs + 1); // (float *) malloc0 ((nfreqs + 1) * sizeof (float)); + F.resize(nfreqs + 1); + G.resize(nfreqs + 1); F[1] = 32.0; F[2] = 63.0; F[3] = 125.0; @@ -378,13 +383,12 @@ void EQP::setGrphEQ10(int *rxeq) F[8] = 4000.0; F[9] = 8000.0; F[10] = 16000.0; - for (i = 0; i <= nfreqs; i++) + for (int i = 0; i <= nfreqs; i++) G[i] = (float)rxeq[i]; ctfmode = 0; impulse = eq_impulse (nc, nfreqs, F.data(), G.data(), samplerate, 1.0 / (2.0 * size), ctfmode, wintype); - // print_impulse ("rxeq.txt", nc, impulse, 1, 0); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } } // namespace WDSP diff --git a/wdsp/eqp.hpp b/wdsp/eqp.hpp index fd844c434..df4167355 100644 --- a/wdsp/eqp.hpp +++ b/wdsp/eqp.hpp @@ -89,10 +89,10 @@ public: void setProfile(int nfreqs, const float* F, const float* G); void setCtfmode(int mode); void setWintype(int wintype); - void setGrphEQ(int *rxeq); - void setGrphEQ10(int *rxeq); + void setGrphEQ(const int *rxeq); + void setGrphEQ10(const int *rxeq); - static float* eq_impulse (int N, int nfreqs, float* F, float* G, double samplerate, double scale, int ctfmode, int wintype); + static float* eq_impulse (int N, int nfreqs, const float* F, const float* G, double samplerate, double scale, int ctfmode, int wintype); private: static int fEQcompare (const void * a, const void * b); diff --git a/wdsp/fmd.cpp b/wdsp/fmd.cpp index da74781c5..5dd043fae 100644 --- a/wdsp/fmd.cpp +++ b/wdsp/fmd.cpp @@ -25,6 +25,8 @@ warren@wpratt.com */ +#include + #include "comm.hpp" #include "fircore.hpp" #include "fcurve.hpp" @@ -91,8 +93,8 @@ void FMD::calc() void FMD::decalc() { - delete (plim); - delete (sntch); + delete plim; + delete sntch; } FMD::FMD( @@ -144,14 +146,24 @@ FMD::FMD( float* impulse; calc(); // de-emphasis filter - audio.resize(size * 2); // (float *) malloc0 (size * sizeof (complex)); - impulse = FCurve::fc_impulse (nc_de, f_low, f_high, +20.0 * log10(f_high / f_low), 0.0, 1, rate, 1.0 / (2.0 * size), 0, 0); + audio.resize(size * 2); + impulse = FCurve::fc_impulse ( + nc_de, + (float) f_low, + (float) f_high, + (float) (+20.0 * log10(f_high / f_low)), + 0.0, 1, + (float) rate, + (float) (1.0 / (2.0 * size)), + 0, + 0 + ); pde = FIRCORE::create_fircore (size, audio.data(), out, nc_de, mp_de, impulse); - delete[] (impulse); + delete[] impulse; // audio filter impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); paud = FIRCORE::create_fircore (size, out, out, nc_aud, mp_aud, impulse); - delete[] (impulse); + delete[] impulse; } FMD::~FMD() @@ -179,8 +191,11 @@ void FMD::execute() if (run) { int i; - double det, del_out; - double vco[2], corr[2]; + double det; + double del_out; + std::array vco; + std::array corr; + for (i = 0; i < size; i++) { // pll @@ -200,7 +215,7 @@ void FMD::execute() while (phs < 0.0) phs += TWOPI; // dc removal, gain, & demod output fmdc = mtau * fmdc + onem_mtau * fil_out; - audio[2 * i + 0] = again * (fil_out - fmdc); + audio[2 * i + 0] = (float) (again * (fil_out - fmdc)); audio[2 * i + 1] = audio[2 * i + 0]; } // de-emphasis @@ -212,7 +227,7 @@ void FMD::execute() if (lim_run) { for (i = 0; i < 2 * size; i++) - out[i] *= lim_pre_gain; + out[i] *= (float) lim_pre_gain; plim->execute(); } } @@ -238,13 +253,24 @@ void FMD::setSamplerate(int _rate) rate = _rate; calc(); // de-emphasis filter - impulse = FCurve::fc_impulse (nc_de, f_low, f_high, +20.0 * log10(f_high / f_low), 0.0, 1, rate, 1.0 / (2.0 * size), 0, 0); + impulse = FCurve::fc_impulse ( + nc_de, + (float) f_low, + (float) f_high, + (float) (+20.0 * log10(f_high / f_low)), + 0.0, + 1, + (float) rate, + (float) (1.0 / (2.0 * size)), + 0, + 0 + ); FIRCORE::setImpulse_fircore (pde, impulse, 1); - delete[] (impulse); + delete[] impulse; // audio filter impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); FIRCORE::setImpulse_fircore (paud, impulse, 1); - delete[] (impulse); + delete[] impulse; plim->setSamplerate((int) rate); } @@ -254,17 +280,28 @@ void FMD::setSize(int _size) decalc(); size = _size; calc(); - audio.resize(size * 2); // (float *) malloc0 (size * sizeof (complex)); + audio.resize(size * 2); // de-emphasis filter FIRCORE::destroy_fircore (pde); - impulse = FCurve::fc_impulse (nc_de, f_low, f_high, +20.0 * log10(f_high / f_low), 0.0, 1, rate, 1.0 / (2.0 * size), 0, 0); + impulse = FCurve::fc_impulse ( + nc_de, + (float) f_low, + (float) f_high, + (float) (+20.0 * log10(f_high / f_low)), + 0.0, + 1, + (float) rate, + (float) (1.0 / (2.0 * size)), + 0, + 0 + ); pde = FIRCORE::create_fircore (size, audio.data(), out, nc_de, mp_de, impulse); - delete[] (impulse); + delete[] impulse; // audio filter FIRCORE::destroy_fircore (paud); impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); paud = FIRCORE::create_fircore (size, out, out, nc_aud, mp_aud, impulse); - delete[] (impulse); + delete[] impulse; plim->setSize(size); } @@ -286,9 +323,9 @@ void FMD::setCTCSSFreq(double freq) sntch->setFreq(ctcss_freq); } -void FMD::setCTCSSRun(int run) +void FMD::setCTCSSRun(int _run) { - sntch_run = run; + sntch_run = _run; sntch->setRun(sntch_run); } @@ -299,9 +336,20 @@ void FMD::setNCde(int nc) if (nc_de != nc) { nc_de = nc; - impulse = FCurve::fc_impulse (nc_de, f_low, f_high, +20.0 * log10(f_high / f_low), 0.0, 1, rate, 1.0 / (2.0 * size), 0, 0); + impulse = FCurve::fc_impulse ( + nc_de, + (float) f_low, + (float) f_high, + (float) (+20.0 * log10(f_high / f_low)), + 0.0, + 1, + (float) rate, + (float) (1.0 / (2.0 * size)), + 0, + 0 + ); FIRCORE::setNc_fircore (pde, nc_de, impulse); - delete[] (impulse); + delete[] impulse; } } @@ -323,7 +371,7 @@ void FMD::setNCaud(int nc) nc_aud = nc; impulse = FIR::fir_bandpass(nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); FIRCORE::setNc_fircore (paud, nc_aud, impulse); - delete[] (impulse); + delete[] impulse; } } @@ -336,10 +384,10 @@ void FMD::setMPaud(int mp) } } -void FMD::setLimRun(int run) +void FMD::setLimRun(int _run) { - if (lim_run != run) { - lim_run = run; + if (lim_run != _run) { + lim_run = _run; } } @@ -364,13 +412,24 @@ void FMD::setAFFilter(double low, double high) f_low = low; f_high = high; // de-emphasis filter - impulse = FCurve::fc_impulse (nc_de, f_low, f_high, +20.0 * log10(f_high / f_low), 0.0, 1, rate, 1.0 / (2.0 * size), 0, 0); + impulse = FCurve::fc_impulse ( + nc_de, + (float) f_low, + (float) f_high, + (float) (+20.0 * log10(f_high / f_low)), + 0.0, + 1, + (float) rate, + (float) (1.0 / (2.0 * size)), + 0, + 0 + ); FIRCORE::setImpulse_fircore (pde, impulse, 1); - delete[] (impulse); + delete[] impulse; // audio filter impulse = FIR::fir_bandpass (nc_aud, 0.8 * f_low, 1.1 * f_high, rate, 0, 1, afgain / (2.0 * size)); FIRCORE::setImpulse_fircore (paud, impulse, 1); - delete[] (impulse); + delete[] impulse; } } diff --git a/wdsp/fmsq.cpp b/wdsp/fmsq.cpp index 74a9891e9..41980f20c 100644 --- a/wdsp/fmsq.cpp +++ b/wdsp/fmsq.cpp @@ -34,22 +34,23 @@ namespace WDSP { void FMSQ::calc() { - double delta, theta; + double delta; + double theta; float* impulse; int i; // noise filter - noise.resize(2 * size * 2); // (float *)malloc0(2 * size * sizeof(complex)); + noise.resize(2 * size * 2); F[0] = 0.0; - F[1] = fc; - F[2] = *pllpole; + F[1] = (float) fc; + F[2] = (float) *pllpole; F[3] = 20000.0; G[0] = 0.0; G[1] = 0.0; G[2] = 3.0; - G[3] = +20.0 * log10(20000.0 / *pllpole); + G[3] = (float) (+20.0 * log10(20000.0 / *pllpole)); impulse = EQP::eq_impulse (nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); p = FIRCORE::create_fircore (size, trigger, noise.data(), nc, mp, impulse); - delete[] (impulse); + delete[] impulse; // noise averaging avm = exp(-1.0 / (rate * avtau)); onem_avm = 1.0 - avm; @@ -60,8 +61,8 @@ void FMSQ::calc() // level change ntup = (int)(tup * rate); ntdown = (int)(tdown * rate); - cup.resize(ntup + 1); // (float *)malloc0 ((ntup + 1) * sizeof(float)); - cdown.resize(ntdown + 1); //(float *)malloc0 ((ntdown + 1) * sizeof(float)); + cup.resize(ntup + 1); + cdown.resize(ntdown + 1); delta = PI / (double) ntup; theta = 0.0; @@ -80,7 +81,7 @@ void FMSQ::calc() theta += delta; } // control - state = 0; + state = FMSQState::MUTED; ready = 0; ramp = 0.0; rstep = 1.0 / rate; @@ -145,29 +146,20 @@ void FMSQ::flush() FIRCORE::flush_fircore (p); avnoise = 100.0; longnoise = 1.0; - state = 0; + state = FMSQState::MUTED; ready = 0; ramp = 0.0; } -enum _fmsqstate -{ - MUTED, - INCREASE, - UNMUTED, - TAIL, - DECREASE -}; - void FMSQ::execute() { if (run) { - int i; - double _noise, lnlimit; + double _noise; + double lnlimit; FIRCORE::xfircore (p); - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { double noise0 = noise[2 * i + 0]; double noise1 = noise[2 * i + 1]; @@ -183,10 +175,10 @@ void FMSQ::execute() switch (state) { - case MUTED: + case FMSQState::MUTED: if (avnoise < unmute_thresh && ready) { - state = INCREASE; + state = FMSQState::INCREASE; count = ntup; } @@ -195,19 +187,19 @@ void FMSQ::execute() break; - case INCREASE: - outsig[2 * i + 0] = insig[2 * i + 0] * cup[ntup - count]; - outsig[2 * i + 1] = insig[2 * i + 1] * cup[ntup - count]; + case FMSQState::INCREASE: + outsig[2 * i + 0] = (float) (insig[2 * i + 0] * cup[ntup - count]); + outsig[2 * i + 1] = (float) (insig[2 * i + 1] * cup[ntup - count]); if (count-- == 0) - state = UNMUTED; + state = FMSQState::UNMUTED; break; - case UNMUTED: + case FMSQState::UNMUTED: if (avnoise > tail_thresh) { - state = TAIL; + state = FMSQState::TAIL; if ((lnlimit = longnoise) > 1.0) lnlimit = 1.0; @@ -220,28 +212,28 @@ void FMSQ::execute() break; - case TAIL: + case FMSQState::TAIL: outsig[2 * i + 0] = insig[2 * i + 0]; outsig[2 * i + 1] = insig[2 * i + 1]; if (avnoise < unmute_thresh) { - state = UNMUTED; + state = FMSQState::UNMUTED; } else if (count-- == 0) { - state = DECREASE; + state = FMSQState::DECREASE; count = ntdown; } break; - case DECREASE: - outsig[2 * i + 0] = insig[2 * i + 0] * cdown[ntdown - count]; - outsig[2 * i + 1] = insig[2 * i + 1] * cdown[ntdown - count]; + case FMSQState::DECREASE: + outsig[2 * i + 0] = (float) (insig[2 * i + 0] * cdown[ntdown - count]); + outsig[2 * i + 1] = (float) (insig[2 * i + 1] * cdown[ntdown - count]); if (count-- == 0) - state = MUTED; + state = FMSQState::MUTED; break; } @@ -301,7 +293,7 @@ void FMSQ::setNC(int _nc) nc = _nc; impulse = EQP::eq_impulse (nc, 3, F.data(), G.data(), rate, 1.0 / (2.0 * size), 0, 0); FIRCORE::setNc_fircore (p, nc, impulse); - delete[] (impulse); + delete[] impulse; } } diff --git a/wdsp/fmsq.hpp b/wdsp/fmsq.hpp index 1d5b8f614..288a5c0a7 100644 --- a/wdsp/fmsq.hpp +++ b/wdsp/fmsq.hpp @@ -40,6 +40,15 @@ class FIRCORE; class WDSP_API FMSQ { public: + enum class FMSQState + { + MUTED, + INCREASE, + UNMUTED, + TAIL, + DECREASE + }; + int run; // 0 if squelch system is OFF; 1 if it's ON int size; // size of input/output buffers float* insig; // squelch input signal buffer @@ -59,7 +68,7 @@ public: double longavm; double onem_longavm; double longnoise; - int state; // state machine control + FMSQState state; // state machine control int count; double tup; double tdown; diff --git a/wdsp/gen.cpp b/wdsp/gen.cpp index 76f56927d..d7029889a 100644 --- a/wdsp/gen.cpp +++ b/wdsp/gen.cpp @@ -78,8 +78,8 @@ void GEN::calc_triangle() void GEN::calc_pulse () { - int i; - float delta, theta; + double delta; + double theta; pulse.pperiod = 1.0 / pulse.pf; pulse.tphs = 0.0; pulse.tdelta = TWOPI * pulse.tf / rate; @@ -93,11 +93,11 @@ void GEN::calc_pulse () pulse.pnoff = 0; pulse.pcount = pulse.pnoff; - pulse.state = 0; - pulse.ctrans = new float[pulse.pntrans + 1]; // (float *) malloc0 ((pulse.pntrans + 1) * sizeof (float)); + pulse.state = PState::OFF; + pulse.ctrans = new double[pulse.pntrans + 1]; delta = PI / (float)pulse.pntrans; theta = 0.0; - for (i = 0; i <= pulse.pntrans; i++) + for (int i = 0; i <= pulse.pntrans; i++) { pulse.ctrans[i] = 0.5 * (1.0 - cos (theta)); theta += delta; @@ -143,7 +143,7 @@ GEN::GEN( tt.f1 = + 900.0; tt.f2 = + 1700.0; // noise - srand ((unsigned int) time (0)); + srand ((unsigned int) time (nullptr)); noise.mag = 1.0; // sweep sweep.mag = 1.0; @@ -172,17 +172,9 @@ GEN::~GEN() void GEN::flush() { - pulse.state = 0; + pulse.state = PState::OFF; } -enum pstate -{ - OFF, - UP, - ON, - DOWN -}; - void GEN::execute() { if (run) @@ -191,14 +183,14 @@ void GEN::execute() { case 0: // tone { - int i; - float t1, t2; - float cosphase = cos (tone.phs); - float sinphase = sin (tone.phs); - for (i = 0; i < size; i++) + double t1; + double t2; + double cosphase = cos (tone.phs); + double sinphase = sin (tone.phs); + for (int i = 0; i < size; i++) { - out[2 * i + 0] = + tone.mag * cosphase; - out[2 * i + 1] = - tone.mag * sinphase; + out[2 * i + 0] = (float) (+ tone.mag * cosphase); + out[2 * i + 1] = (float) (- tone.mag * sinphase); t1 = cosphase; t2 = sinphase; cosphase = t1 * tone.cosdelta - t2 * tone.sindelta; @@ -211,16 +203,16 @@ void GEN::execute() } case 1: // two-tone { - int i; - float tcos, tsin; - float cosphs1 = cos (tt.phs1); - float sinphs1 = sin (tt.phs1); - float cosphs2 = cos (tt.phs2); - float sinphs2 = sin (tt.phs2); - for (i = 0; i < size; i++) + double tcos; + double tsin; + double cosphs1 = cos (tt.phs1); + double sinphs1 = sin (tt.phs1); + double cosphs2 = cos (tt.phs2); + double sinphs2 = sin (tt.phs2); + for (int i = 0; i < size; i++) { - out[2 * i + 0] = + tt.mag1 * cosphs1 + tt.mag2 * cosphs2; - out[2 * i + 1] = - tt.mag1 * sinphs1 - tt.mag2 * sinphs2; + out[2 * i + 0] = (float) (+ tt.mag1 * cosphs1 + tt.mag2 * cosphs2); + out[2 * i + 1] = (float) (- tt.mag1 * sinphs1 - tt.mag2 * sinphs2); tcos = cosphs1; tsin = sinphs1; cosphs1 = tcos * tt.cosdelta1 - tsin * tt.sindelta1; @@ -240,29 +232,30 @@ void GEN::execute() } case 2: // noise { - int i; - float r1, r2, c, rad; - for (i = 0; i < size; i++) + double r1; + double r2; + double c; + double rad; + for (int i = 0; i < size; i++) { do { - r1 = 2.0 * (float)rand() / (float)RAND_MAX - 1.0; - r2 = 2.0 * (float)rand() / (float)RAND_MAX - 1.0; + r1 = 2.0 * (double)rand() / (double)RAND_MAX - 1.0; + r2 = 2.0 * (double)rand() / (double)RAND_MAX - 1.0; c = r1 * r1 + r2 * r2; } while (c >= 1.0); rad = sqrt (-2.0 * log (c) / c); - out[2 * i + 0] = noise.mag * rad * r1; - out[2 * i + 1] = noise.mag * rad * r2; + out[2 * i + 0] = (float) (noise.mag * rad * r1); + out[2 * i + 1] = (float) (noise.mag * rad * r2); } break; } case 3: // sweep { - int i; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { - out[2 * i + 0] = + sweep.mag * cos(sweep.phs); - out[2 * i + 1] = - sweep.mag * sin(sweep.phs); + out[2 * i + 0] = (float) (+ sweep.mag * cos(sweep.phs)); + out[2 * i + 1] = (float) (- sweep.mag * sin(sweep.phs)); sweep.phs += sweep.dphs; sweep.dphs += sweep.d2phs; if (sweep.phs >= TWOPI) sweep.phs -= TWOPI; @@ -274,11 +267,10 @@ void GEN::execute() } case 4: // sawtooth (audio only) { - int i; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { if (saw.t > saw.period) saw.t -= saw.period; - out[2 * i + 0] = saw.mag * (saw.t * saw.f - 1.0); + out[2 * i + 0] = (float) (saw.mag * (saw.t * saw.f - 1.0)); out[2 * i + 1] = 0.0; saw.t += saw.delta; } @@ -286,13 +278,12 @@ void GEN::execute() break; case 5: // triangle (audio only) { - int i; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { if (tri.t > tri.period) tri.t1 = tri.t -= tri.period; if (tri.t > tri.half) tri.t1 -= tri.delta; else tri.t1 += tri.delta; - out[2 * i + 0] = tri.mag * (4.0 * tri.t1 * tri.f - 1.0); + out[2 * i + 0] = (float) (tri.mag * (4.0 * tri.t1 * tri.f - 1.0)); out[2 * i + 1] = 0.0; tri.t += tri.delta; } @@ -300,44 +291,44 @@ void GEN::execute() break; case 6: // pulse (audio only) { - int i; - float t1, t2; - float cosphase = cos (pulse.tphs); - float sinphase = sin (pulse.tphs); - for (i = 0; i < size; i++) + double t1; + double t2; + double cosphase = cos (pulse.tphs); + double sinphase = sin (pulse.tphs); + for (int i = 0; i < size; i++) { if (pulse.pnoff != 0) switch (pulse.state) { - case OFF: + case PState::OFF: out[2 * i + 0] = 0.0; if (--pulse.pcount == 0) { - pulse.state = UP; + pulse.state = PState::UP; pulse.pcount = pulse.pntrans; } break; - case UP: - out[2 * i + 0] = pulse.mag * cosphase * pulse.ctrans[pulse.pntrans - pulse.pcount]; + case PState::UP: + out[2 * i + 0] = (float) (pulse.mag * cosphase * pulse.ctrans[pulse.pntrans - pulse.pcount]); if (--pulse.pcount == 0) { - pulse.state = ON; + pulse.state = PState::ON; pulse.pcount = pulse.pnon; } break; - case ON: - out[2 * i + 0] = pulse.mag * cosphase; + case PState::ON: + out[2 * i + 0] = (float) (pulse.mag * cosphase); if (--pulse.pcount == 0) { - pulse.state = DOWN; + pulse.state = PState::DOWN; pulse.pcount = pulse.pntrans; } break; - case DOWN: - out[2 * i + 0] = pulse.mag * cosphase * pulse.ctrans[pulse.pcount]; + case PState::DOWN: + out[2 * i + 0] = (float) (pulse.mag * cosphase * pulse.ctrans[pulse.pcount]); if (--pulse.pcount == 0) { - pulse.state = OFF; + pulse.state = PState::OFF; pulse.pcount = pulse.pnoff; } break; @@ -432,9 +423,9 @@ void GEN::SetPreSweepFreq(float freq1, float freq2) calc_sweep(); } -void GEN::SetPreSweepRate(float rate) +void GEN::SetPreSweepRate(float _rate) { - sweep.sweeprate = rate; + sweep.sweeprate = _rate; calc_sweep(); } diff --git a/wdsp/gen.hpp b/wdsp/gen.hpp index d4703374e..8c2ee9225 100644 --- a/wdsp/gen.hpp +++ b/wdsp/gen.hpp @@ -37,88 +37,103 @@ class TXA; class WDSP_API GEN { public: + enum class PState + { + OFF, + UP, + ON, + DOWN + }; + int run; // run int size; // number of samples per buffer float* in; // input buffer (retained in case I want to mix in a generated signal) float* out; // output buffer - float rate; // sample rate + double rate; // sample rate int mode; struct _tone { - float mag; - float freq; - float phs; - float delta; - float cosdelta; - float sindelta; - } tone; + double mag; + double freq; + double phs; + double delta; + double cosdelta; + double sindelta; + }; + _tone tone; struct _tt { - float mag1; - float mag2; - float f1; - float f2; - float phs1; - float phs2; - float delta1; - float delta2; - float cosdelta1; - float cosdelta2; - float sindelta1; - float sindelta2; - } tt; + double mag1; + double mag2; + double f1; + double f2; + double phs1; + double phs2; + double delta1; + double delta2; + double cosdelta1; + double cosdelta2; + double sindelta1; + double sindelta2; + }; + _tt tt; struct _noise { - float mag; - } noise; + double mag; + }; + _noise noise; struct _sweep { - float mag; - float f1; - float f2; - float sweeprate; - float phs; - float dphs; - float d2phs; - float dphsmax; - } sweep; + double mag; + double f1; + double f2; + double sweeprate; + double phs; + double dphs; + double d2phs; + double dphsmax; + }; + _sweep sweep; struct _saw { - float mag; - float f; - float period; - float delta; - float t; - } saw; + double mag; + double f; + double period; + double delta; + double t; + }; + _saw saw; struct _tri { - float mag; - float f; - float period; - float half; - float delta; - float t; - float t1; - } tri; + double mag; + double f; + double period; + double half; + double delta; + double t; + double t1; + }; + _tri tri; struct _pulse { - float mag; - float pf; - float pdutycycle; - float ptranstime; - float* ctrans; + double mag; + double pf; + double pdutycycle; + double ptranstime; + double* ctrans; int pcount; int pnon; int pntrans; int pnoff; - float pperiod; - float tf; - float tphs; - float tdelta; - float tcosdelta; - float tsindelta; - int state; - } pulse; + double pperiod; + double tf; + double tphs; + double tdelta; + double tcosdelta; + double tsindelta; + PState state; + }; + _pulse pulse; GEN( int run, diff --git a/wdsp/meter.cpp b/wdsp/meter.cpp index 5ad168920..09797f3dc 100644 --- a/wdsp/meter.cpp +++ b/wdsp/meter.cpp @@ -51,20 +51,20 @@ METER::METER( int _enum_pk, int _enum_gain, double* _pgain -) +) : + run(_run), + prun(_prun), + size(_size), + buff(_buff), + rate((double) _rate), + tau_average(_tau_av), + tau_peak_decay(_tau_decay), + result(_result), + enum_av(_enum_av), + enum_pk(_enum_pk), + enum_gain(_enum_gain), + pgain(_pgain) { - run = _run; - prun = _prun; - size = _size; - buff = _buff; - rate = (double) _rate; - tau_average = _tau_av; - tau_peak_decay = _tau_decay; - result = _result; - enum_av = _enum_av; - enum_pk = _enum_pk; - enum_gain = _enum_gain; - pgain = _pgain; calc(); } @@ -75,7 +75,7 @@ void METER::flush() result[enum_av] = -100.0; result[enum_pk] = -100.0; - if ((pgain != 0) && (enum_gain >= 0)) + if ((pgain != nullptr) && (enum_gain >= 0)) result[enum_gain] = 0.0; } @@ -83,18 +83,17 @@ void METER::execute() { int srun; - if (prun != 0) - srun = *(prun); + if (prun != nullptr) + srun = *prun; else srun = 1; if (run && srun) { - int i; double smag; double np = 0.0; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { double xr = buff[2 * i + 0]; double xi = buff[2 * i + 1]; @@ -112,7 +111,7 @@ void METER::execute() result[enum_av] = 10.0 * MemLog::mlog10 (avg <= 0 ? 1.0e-20 : avg); result[enum_pk] = 10.0 * MemLog::mlog10 (peak <= 0 ? 1.0e-20 : peak); - if ((pgain != 0) && (enum_gain >= 0)) + if ((pgain != nullptr) && (enum_gain >= 0)) result[enum_gain] = 20.0 * MemLog::mlog10 (*pgain <= 0 ? 1.0e-20 : *pgain); } else @@ -150,7 +149,7 @@ void METER::setSize(int _size) * * ********************************************************************************************************/ -double METER::getMeter(int mt) +double METER::getMeter(int mt) const { return result[mt]; } diff --git a/wdsp/meter.hpp b/wdsp/meter.hpp index e84f07651..2bea6d4c4 100644 --- a/wdsp/meter.hpp +++ b/wdsp/meter.hpp @@ -75,7 +75,7 @@ public: void setBuffers(float* in); void setSamplerate(int rate); void setSize(int size); - double getMeter(int mt); + double getMeter(int mt) const; private: void calc(); diff --git a/wdsp/mpeak.cpp b/wdsp/mpeak.cpp index ea4318563..7e551a848 100644 --- a/wdsp/mpeak.cpp +++ b/wdsp/mpeak.cpp @@ -39,8 +39,8 @@ namespace WDSP { void MPEAK::calc() { - tmp.resize(size * 2); // (float *) malloc0 (size * sizeof (complex)); - mix.resize(size * 2); // (float *) malloc0 (size * sizeof (complex)); + tmp.resize(size * 2); + mix.resize(size * 2); for (int i = 0; i < npeaks; i++) { pfil[i] = new SPEAK( @@ -85,15 +85,15 @@ MPEAK::MPEAK( rate = _rate; npeaks = _npeaks; nstages = _nstages; - enable.resize(npeaks); // (int *) malloc0 (npeaks * sizeof (int)); - f.resize(npeaks); // (float *) malloc0 (npeaks * sizeof (float)); - bw.resize(npeaks); // (float *) malloc0 (npeaks * sizeof (float)); - gain.resize(npeaks); // (float *) malloc0 (npeaks * sizeof (float)); + enable.resize(npeaks); + f.resize(npeaks); + bw.resize(npeaks); + gain.resize(npeaks); std::copy(_enable, _enable + npeaks, enable.begin()); std::copy(_f, _f + npeaks, f.begin()); std::copy(_bw, _bw + npeaks, bw.begin()); std::copy(_gain, _gain + npeaks, gain.begin()); - pfil.resize(npeaks); // (SPEAK *) malloc0 (npeaks * sizeof (SPEAK)); + pfil.resize(npeaks); calc(); } diff --git a/wdsp/nbp.cpp b/wdsp/nbp.cpp index 37bc29bc5..b9784ecb2 100644 --- a/wdsp/nbp.cpp +++ b/wdsp/nbp.cpp @@ -25,6 +25,8 @@ warren@wpratt.com */ +#include + #include "comm.hpp" #include "fir.hpp" #include "fircore.hpp" @@ -44,16 +46,17 @@ NOTCHDB::NOTCHDB(int _master_run, int _maxnotches) master_run = _master_run; maxnotches = _maxnotches; nn = 0; - fcenter.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float)); - fwidth.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float)); - nlow.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float)); - nhigh.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float)); - active.resize(maxnotches); // (int *) malloc0 (maxnotches * sizeof (int )); + fcenter.resize(maxnotches); + fwidth.resize(maxnotches); + nlow.resize(maxnotches); + nhigh.resize(maxnotches); + active.resize(maxnotches); } int NOTCHDB::addNotch(int notch, double _fcenter, double _fwidth, int _active) { - int i, j; + int i; + int j; int rval; if (notch <= nn && nn < maxnotches) @@ -104,7 +107,8 @@ int NOTCHDB::getNotch(int _notch, double* _fcenter, double* _fwidth, int* _activ int NOTCHDB::deleteNotch(int _notch) { - int i, j; + int i; + int j; int rval; if (_notch < nn) @@ -143,7 +147,7 @@ int NOTCHDB::editNotch(int _notch, double _fcenter, double _fwidth, int _active) return rval; } -void NOTCHDB::getNumNotches(int* _nnotches) +void NOTCHDB::getNumNotches(int* _nnotches) const { *_nnotches = nn; } @@ -154,25 +158,24 @@ void NOTCHDB::getNumNotches(int* _nnotches) * * ********************************************************************************************************/ -float* NBP::fir_mbandpass (int N, int nbp, double* flow, double* fhigh, double rate, double scale, int wintype) +float* NBP::fir_mbandpass (int N, int nbp, const double* flow, const double* fhigh, double rate, double scale, int wintype) { - int i, k; - float* impulse = new float[N * 2]; // (float *) malloc0 (N * sizeof (complex)); - float* imp; - for (k = 0; k < nbp; k++) + auto* impulse = new float[N * 2]; + std::fill(impulse, impulse + N*2, 0); + for (int k = 0; k < nbp; k++) { - imp = FIR::fir_bandpass (N, flow[k], fhigh[k], rate, wintype, 1, scale); - for (i = 0; i < N; i++) + float* imp = FIR::fir_bandpass (N, flow[k], fhigh[k], rate, wintype, 1, scale); + for (int i = 0; i < N; i++) { impulse[2 * i + 0] += imp[2 * i + 0]; impulse[2 * i + 1] += imp[2 * i + 1]; } - delete[] (imp); + delete[] imp; } return impulse; } -double NBP::min_notch_width() +double NBP::min_notch_width() const { double min_width; switch (wintype) @@ -183,6 +186,8 @@ double NBP::min_notch_width() case 1: min_width = 2200.0 / (nc / 256) * (rate / 48000); break; + default: + min_width = 0; } return min_width; } @@ -204,10 +209,12 @@ int NBP::make_nbp ( ) { int nbp; - int nnbp, adds; - int i, j, k; - double nl, nh; - int* del = new int[1024]; // (int *) malloc0 (1024 * sizeof (int)); + int nnbp; + int adds; + int i; + double nl; + double nh; + std::array del; if (fhigh > flow) { bplow[0] = flow; @@ -217,11 +224,10 @@ int NBP::make_nbp ( else { nbp = 0; - delete[] del; return nbp; } *havnotch = 0; - for (k = 0; k < nn; k++) + for (int k = 0; k < nn; k++) { if (autoincr && width[k] < minwidth) { @@ -270,7 +276,7 @@ int NBP::make_nbp ( if (del[i] == 1) { nnbp--; - for (j = i; j < nnbp; j++) + for (int j = i; j < nnbp; j++) { bplow[j] = bplow[j + 1]; bphigh[j] = bphigh[j + 1]; @@ -281,14 +287,13 @@ int NBP::make_nbp ( nbp = nnbp; } } - delete[] (del); return nbp; } void NBP::calc_lightweight() { // calculate and set new impulse response; used when changing tune freq or shift freq - int i; - double fl, fh; + double fl; + double fh; double offset; NOTCHDB *b = notchdb; if (fnfrun) @@ -314,7 +319,7 @@ void NBP::calc_lightweight() // when tuning, no need to recalc filter if there were not and are not any notches in passband if (hadnotch || havnotch) { - for (i = 0; i < numpb; i++) + for (int i = 0; i < numpb; i++) { bplow[i] -= offset; bphigh[i] -= offset; @@ -330,7 +335,7 @@ void NBP::calc_lightweight() ); FIRCORE::setImpulse_fircore (fircore, impulse, 1); // print_impulse ("nbp.txt", size + 1, impulse, 1, 0); - delete[](impulse); + delete[] impulse; } hadnotch = havnotch; } @@ -340,8 +345,8 @@ void NBP::calc_lightweight() void NBP::calc_impulse () { // calculates impulse response; for create_fircore() and parameter changes - int i; - float fl, fh; + double fl; + double fh; double offset; NOTCHDB *b = notchdb; @@ -365,7 +370,7 @@ void NBP::calc_impulse () bphigh, &havnotch ); - for (i = 0; i < numpb; i++) + for (int i = 0; i < numpb; i++) { bplow[i] -= offset; bphigh[i] -= offset; @@ -429,12 +434,12 @@ NBP::NBP( maxpb(_maxpb), notchdb(_notchdb) { - bplow.resize(maxpb); // (float *) malloc0 (maxpb * sizeof (float)); - bphigh.resize(maxpb); // (float *) malloc0 (maxpb * sizeof (float)); + bplow.resize(maxpb); + bphigh.resize(maxpb); calc_impulse (); fircore = FIRCORE::create_fircore (size, in, out, nc, mp, impulse); // print_impulse ("nbp.txt", size + 1, impulse, 1, 0); - delete[](impulse); + delete[]impulse; } NBP::~NBP() @@ -467,7 +472,7 @@ void NBP::setSamplerate(int _rate) rate = _rate; calc_impulse (); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } void NBP::setSize(int _size) @@ -477,14 +482,14 @@ void NBP::setSize(int _size) FIRCORE::setSize_fircore (fircore, size); calc_impulse (); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } void NBP::setNc() { calc_impulse(); FIRCORE::setNc_fircore (fircore, nc, impulse); - delete[] (impulse); + delete[] impulse; } void NBP::setMp() @@ -513,7 +518,7 @@ void NBP::SetFreqs(double _flow, double _fhigh) fhigh = _fhigh; calc_impulse(); FIRCORE::setImpulse_fircore (fircore, impulse, 1); - delete[] (impulse); + delete[] impulse; } } @@ -536,7 +541,7 @@ void NBP::SetMP(int _mp) } } -void NBP::GetMinNotchWidth(double* minwidth) +void NBP::GetMinNotchWidth(double* minwidth) const { *minwidth = min_notch_width(); } diff --git a/wdsp/nbp.hpp b/wdsp/nbp.hpp index 4bb04429f..c56f71225 100644 --- a/wdsp/nbp.hpp +++ b/wdsp/nbp.hpp @@ -59,7 +59,7 @@ public: int getNotch (int notch, double* fcenter, double* fwidth, int* active); int deleteNotch (int notch); int editNotch (int notch, double fcenter, double fwidth, int active); - void getNumNotches (int* nnotches); + void getNumNotches (int* nnotches) const; }; @@ -125,12 +125,12 @@ public: void SetFreqs(double flow, double fhigh); void SetNC(int nc); void SetMP(int mp); - void GetMinNotchWidth(double* minwidth); + void GetMinNotchWidth(double* minwidth) const; void calc_lightweight(); private: - static float* fir_mbandpass (int N, int nbp, double* flow, double* fhigh, double rate, double scale, int wintype); - double min_notch_width (); + static float* fir_mbandpass (int N, int nbp, const double* flow, const double* fhigh, double rate, double scale, int wintype); + double min_notch_width () const; static int make_nbp ( int nn, std::vector& active, diff --git a/wdsp/nob.cpp b/wdsp/nob.cpp index 5b7834315..ac3eb9cfb 100644 --- a/wdsp/nob.cpp +++ b/wdsp/nob.cpp @@ -150,8 +150,10 @@ void NOB::execute() double mag; int bf_idx; int ff_idx; - int lidx, tidx; - int i, j, k; + int lidx; + int tidx; + int j; + int k; int bfboutidx; int ffboutidx; int hcount; @@ -161,7 +163,7 @@ void NOB::execute() if (run) { - for (i = 0; i < buffsize; i++) + for (int i = 0; i < buffsize; i++) { dline[2 * in_idx + 0] = in[2 * i + 0]; dline[2 * in_idx + 1] = in[2 * i + 1]; @@ -189,8 +191,8 @@ void NOB::execute() { case 0: // normal output & impulse setup { - out[2 * i + 0] = dline[2 * out_idx + 0]; - out[2 * i + 1] = dline[2 * out_idx + 1]; + out[2 * i + 0] = (float) (dline[2 * out_idx + 0]); + out[2 * i + 1] = (float) (dline[2 * out_idx + 1]); Ilast = dline[2 * out_idx + 0]; Qlast = dline[2 * out_idx + 1]; @@ -210,7 +212,6 @@ void NOB::execute() do { - len = 0; hcount = 0; while ((imp[tidx] > 0 || hcount > 0) && blank_count < max_imp_seq) @@ -314,7 +315,7 @@ void NOB::execute() switch (mode) { - case 0: // zero + default: // zero deltaI = 0.0; deltaQ = 0.0; I = 0.0; @@ -367,8 +368,8 @@ void NOB::execute() case 1: // slew output in advance of blanking period { scale = 0.5 + awave[time]; - out[2 * i + 0] = Ilast * scale + (1.0 - scale) * I; - out[2 * i + 1] = Qlast * scale + (1.0 - scale) * Q; + out[2 * i + 0] = (float) (Ilast * scale + (1.0 - scale) * I); + out[2 * i + 1] = (float) (Qlast * scale + (1.0 - scale) * Q); if (++time == adv_slew_count) { @@ -385,8 +386,8 @@ void NOB::execute() case 2: // initial advance period { - out[2 * i + 0] = I; - out[2 * i + 1] = Q; + out[2 * i + 0] = (float) I; + out[2 * i + 1] = (float) Q; I += deltaI; Q += deltaQ; @@ -401,8 +402,8 @@ void NOB::execute() case 3: // impulse & hang period { - out[2 * i + 0] = I; - out[2 * i + 1] = Q; + out[2 * i + 0] = (float) I; + out[2 * i + 1] = (float) Q; I += deltaI; Q += deltaQ; @@ -425,8 +426,8 @@ void NOB::execute() case 4: // slew output after blanking period { scale = 0.5 - hwave[time]; - out[2 * i + 0] = Inext * scale + (1.0 - scale) * I; - out[2 * i + 1] = Qnext * scale + (1.0 - scale) * Q; + out[2 * i + 0] = (float) (Inext * scale + (1.0 - scale) * I); + out[2 * i + 1] = (float) (Qnext * scale + (1.0 - scale) * Q); if (++time == hang_slew_count) state = 0; @@ -437,8 +438,8 @@ void NOB::execute() case 5: { scale = 0.5 + awave[time]; - out[2 * i + 0] = Ilast * scale; - out[2 * i + 1] = Qlast * scale; + out[2 * i + 0] = (float) (Ilast * scale); + out[2 * i + 1] = (float) (Qlast * scale); if (++time == adv_slew_count) { @@ -542,8 +543,8 @@ void NOB::execute() case 9: { scale = 0.5 - hwave[time]; - out[2 * i + 0] = Inext * scale; - out[2 * i + 1] = Qnext * scale; + out[2 * i + 0] = (float) (Inext * scale); + out[2 * i + 1] = (float) (Qnext * scale); if (++time >= hang_slew_count) { diff --git a/wdsp/patchpanel.cpp b/wdsp/patchpanel.cpp index 9499846a5..a8b9b8a01 100644 --- a/wdsp/patchpanel.cpp +++ b/wdsp/patchpanel.cpp @@ -55,24 +55,26 @@ PANEL::PANEL( void PANEL::flush() { + // There is no data to be reset internally } void PANEL::execute() { int i; - double I, Q; + double I; + double Q; double gainI = gain1 * gain2I; double gainQ = gain1 * gain2Q; // inselect is either 0(neither), 1(Q), 2(I), or 3(both) switch (copy) { - case 0: // no copy + default: // 0 (default) no copy for (i = 0; i < size; i++) { I = in[2 * i + 0] * (inselect >> 1); Q = in[2 * i + 1] * (inselect & 1); - out[2 * i + 0] = gainI * I; - out[2 * i + 1] = gainQ * Q; + out[2 * i + 0] = (float) (gainI * I); + out[2 * i + 1] = (float) (gainQ * Q); } break; case 1: // copy I to Q (then Q == I) @@ -80,17 +82,17 @@ void PANEL::execute() { I = in[2 * i + 0] * (inselect >> 1); Q = I; - out[2 * i + 0] = gainI * I; - out[2 * i + 1] = gainQ * Q; + out[2 * i + 0] = (float) (gainI * I); + out[2 * i + 1] = (float) (gainQ * Q); } break; case 2: // copy Q to I (then I == Q) for (i = 0; i < size; i++) { - Q = in[2 * i + 1] * (inselect & 1); + Q = in[2 * i + 1] * (inselect & 1); I = Q; - out[2 * i + 0] = gainI * I; - out[2 * i + 1] = gainQ * Q; + out[2 * i + 0] = (float) (gainI * I); + out[2 * i + 1] = (float) (gainQ * Q); } break; case 3: // reverse (I=>Q and Q=>I) @@ -98,8 +100,8 @@ void PANEL::execute() { Q = in[2 * i + 0] * (inselect >> 1); I = in[2 * i + 1] * (inselect & 1); - out[2 * i + 0] = gainI * I; - out[2 * i + 1] = gainQ * Q; + out[2 * i + 0] = (float) (gainI * I); + out[2 * i + 1] = (float) (gainQ * Q); } break; } @@ -113,6 +115,7 @@ void PANEL::setBuffers(float* _in, float* _out) void PANEL::setSamplerate(int) { + // There is no sample rate to be set for this component } void PANEL::setSize(int _size) @@ -149,21 +152,22 @@ void PANEL::setGain2(double _gainI, double _gainQ) void PANEL::setPan(double _pan) { - double gain1, gain2; + double _gain1; + double _gain2; if (_pan <= 0.5) { - gain1 = 1.0; - gain2 = sin (_pan * PI); + _gain1 = 1.0; + _gain2 = sin (_pan * PI); } else { - gain1 = sin (_pan * PI); - gain2 = 1.0; + _gain1 = sin (_pan * PI); + _gain2 = 1.0; } - gain2I = gain1; - gain2Q = gain2; + gain2I = _gain1; + gain2Q = _gain2; } void PANEL::setCopy(int _copy) diff --git a/wdsp/phrot.cpp b/wdsp/phrot.cpp index d7821554e..f4812b322 100644 --- a/wdsp/phrot.cpp +++ b/wdsp/phrot.cpp @@ -39,10 +39,10 @@ namespace WDSP { void PHROT::calc() { double g; - x0.resize(nstages); // (float *) malloc0 (nstages * sizeof (float)); - x1.resize(nstages); // (float *) malloc0 (nstages * sizeof (float)); - y0.resize(nstages); // (float *) malloc0 (nstages * sizeof (float)); - y1.resize(nstages); // (float *) malloc0 (nstages * sizeof (float)); + x0.resize(nstages); + x1.resize(nstages); + y0.resize(nstages); + y1.resize(nstages); g = tan (PI * fc / (float)rate); b0 = (g - 1.0) / (g + 1.0); b1 = 1.0; @@ -58,7 +58,6 @@ PHROT::PHROT( double _fc, int _nstages ) : - reverse(0), run(_run), size(_size), in(_in), @@ -67,6 +66,7 @@ PHROT::PHROT( fc(_fc), nstages(_nstages) { + reverse = 0; calc(); } @@ -102,7 +102,7 @@ void PHROT::execute() x1[n] = x0[n]; } - out[2 * i + 0] = y0[nstages - 1]; + out[2 * i + 0] = (float) y0[nstages - 1]; } } else if (out != in) @@ -135,9 +135,9 @@ void PHROT::setSize(int _size) * * ********************************************************************************************************/ -void PHROT::setRun(int run) +void PHROT::setRun(int _run) { - run = run; + run = _run; if (run) flush(); diff --git a/wdsp/phrot.hpp b/wdsp/phrot.hpp index 79e4c9397..c71deb43e 100644 --- a/wdsp/phrot.hpp +++ b/wdsp/phrot.hpp @@ -54,8 +54,13 @@ public: double fc; int nstages; // normalized such that a0 = 1 - double a1, b0, b1; - std::vector x0, x1, y0, y1; + double a1; + double b0; + double b1; + std::vector x0; + std::vector x1; + std::vector y0; + std::vector y1; PHROT( int run, diff --git a/wdsp/resample.cpp b/wdsp/resample.cpp index e4f24309c..19d16e3b3 100644 --- a/wdsp/resample.cpp +++ b/wdsp/resample.cpp @@ -39,11 +39,14 @@ namespace WDSP { void RESAMPLE::calc() { - int x, y, z; - int i, j, k; + int x; + int y; + int z; + int i; int min_rate; double full_rate; - double fc_norm_high, fc_norm_low; + double fc_norm_high; + double fc_norm_low; float* impulse; fc = fcin; ncoef = ncoefin; @@ -84,22 +87,22 @@ void RESAMPLE::calc() ncoef = (ncoef / L + 1) * L; cpp = ncoef / L; - h.resize(ncoef); // (float *)malloc0(ncoef * sizeof(float)); + h.resize(ncoef); impulse = FIR::fir_bandpass(ncoef, fc_norm_low, fc_norm_high, 1.0, 1, 0, gain * (double)L); i = 0; - for (j = 0; j < L; j++) + for (int j = 0; j < L; j++) { - for (k = 0; k < ncoef; k += L) + for (int k = 0; k < ncoef; k += L) h[i++] = impulse[j + k]; } ringsize = cpp; - ring.resize(ringsize); // (float *)malloc0(ringsize * sizeof(complex)); + ring.resize(ringsize); idx_in = ringsize - 1; phnum = 0; - delete[] (impulse); + delete[] impulse; } RESAMPLE::RESAMPLE ( @@ -141,11 +144,12 @@ int RESAMPLE::execute() if (run) { - int i, j, n; + int n; int idx_out; - double I, Q; + double I; + double Q; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { ring[2 * idx_in + 0] = in[2 * i + 0]; ring[2 * idx_in + 1] = in[2 * i + 1]; @@ -156,7 +160,7 @@ int RESAMPLE::execute() Q = 0.0; n = cpp * phnum; - for (j = 0; j < cpp; j++) + for (int j = 0; j < cpp; j++) { if ((idx_out = idx_in + j) >= ringsize) idx_out -= ringsize; @@ -165,8 +169,8 @@ int RESAMPLE::execute() Q += h[n + j] * ring[2 * idx_out + 1]; } - out[2 * outsamps + 0] = I; - out[2 * outsamps + 1] = Q; + out[2 * outsamps + 0] = (float) I; + out[2 * outsamps + 1] = (float) Q; outsamps++; phnum += M; } @@ -231,25 +235,24 @@ void RESAMPLE::setBandwidth(double _fc_low, double _fc_high) // exported calls -void* RESAMPLE::createV (int in_rate, int out_rate) +RESAMPLE* RESAMPLE::Create(int in_rate, int out_rate) { - return (void *) new RESAMPLE(1, 0, 0, 0, in_rate, out_rate, 0.0, 0, 1.0); + return new RESAMPLE(1, 0, nullptr, nullptr, in_rate, out_rate, 0.0, 0, 1.0); } -void RESAMPLE::executeV (float* input, float* output, int numsamps, int* outsamps, void* ptr) +void RESAMPLE::Execute(float* input, float* output, int numsamps, int* outsamps, RESAMPLE* ptr) { - RESAMPLE *a = (RESAMPLE*) ptr; - a->in = input; - a->out = output; - a->size = numsamps; - *outsamps = a->execute(); + ptr->in = input; + ptr->out = output; + ptr->size = numsamps; + *outsamps = ptr->execute(); } -void RESAMPLE::destroyV (void* ptr) +void RESAMPLE::Destroy(RESAMPLE* ptr) { - delete ( (RESAMPLE*) ptr ); + delete ptr; } } // namespace WDSP diff --git a/wdsp/resample.hpp b/wdsp/resample.hpp index 5b4a12357..a1450b55c 100644 --- a/wdsp/resample.hpp +++ b/wdsp/resample.hpp @@ -87,10 +87,10 @@ public: void setOutRate(int rate); void setFCLow(double fc_low); void setBandwidth(double fc_low, double fc_high); - // Exported calls - static void* createV (int in_rate, int out_rate); - static void executeV (float* input, float* output, int numsamps, int* outsamps, void* ptr); - static void destroyV (void* ptr); + // Static methods + static RESAMPLE* Create (int in_rate, int out_rate); + static void Execute (float* input, float* output, int numsamps, int* outsamps, RESAMPLE* ptr); + static void Destroy (RESAMPLE* ptr); private: void calc(); diff --git a/wdsp/sender.cpp b/wdsp/sender.cpp index cc55b31fd..c7e1c7bd7 100644 --- a/wdsp/sender.cpp +++ b/wdsp/sender.cpp @@ -36,29 +36,20 @@ SENDER::SENDER(int _run, int _flag, int _mode, int _size, float* _in) : flag(_flag), mode(_mode), size(_size), - in(_in) + in(_in), + spectrumProbe(nullptr) { - spectrumProbe = nullptr; } void SENDER::flush() { + // There is no internal data to be reset } void SENDER::execute() { - if (run && flag) - { - switch (mode) - { - case 0: - { - if (spectrumProbe) { - spectrumProbe->proceed(in, size); - } - break; - } - } + if (run && flag && (mode == 0) && spectrumProbe) { + spectrumProbe->proceed(in, size); } } diff --git a/wdsp/shift.cpp b/wdsp/shift.cpp index 80cdb0d8f..72fe18f3e 100644 --- a/wdsp/shift.cpp +++ b/wdsp/shift.cpp @@ -50,9 +50,9 @@ SHIFT::SHIFT ( in(_in), out(_out), rate((double) _rate), - shift(_fshift) + shift(_fshift), + phase(0.0) { - phase = 0.0; calc(); } @@ -65,17 +65,19 @@ void SHIFT::execute() { if (run) { - int i; - double I1, Q1, t1, t2; + double I1; + double Q1; + double t1; + double t2; double cos_phase = cos (phase); double sin_phase = sin (phase); - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { I1 = in[2 * i + 0]; Q1 = in[2 * i + 1]; - out[2 * i + 0] = I1 * cos_phase - Q1 * sin_phase; - out[2 * i + 1] = I1 * sin_phase + Q1 * cos_phase; + out[2 * i + 0] = (float) (I1 * cos_phase - Q1 * sin_phase); + out[2 * i + 1] = (float) (I1 * sin_phase + Q1 * cos_phase); t1 = cos_phase; t2 = sin_phase; cos_phase = t1 * cos_delta - t2 * sin_delta; diff --git a/wdsp/siphon.cpp b/wdsp/siphon.cpp index c7ca1ec5f..b04f56af3 100644 --- a/wdsp/siphon.cpp +++ b/wdsp/siphon.cpp @@ -34,23 +34,25 @@ namespace WDSP { void SIPHON::build_window() { int i; - double arg0, cosphi; - double sum, scale; + double arg0; + double cosphi; + double sum; + float scale; arg0 = 2.0 * PI / ((double) fftsize - 1.0); sum = 0.0; for (i = 0; i < fftsize; i++) { cosphi = cos (arg0 * (float)i); - window[i] = + 6.3964424114390378e-02 + window[i] = (float) (+ 6.3964424114390378e-02 + cosphi * ( - 2.3993864599352804e-01 + cosphi * ( + 3.5015956323820469e-01 + cosphi * ( - 2.4774111897080783e-01 + cosphi * ( + 8.5438256055858031e-02 + cosphi * ( - 1.2320203369293225e-02 - + cosphi * ( + 4.3778825791773474e-04 )))))); + + cosphi * ( + 4.3778825791773474e-04 ))))))); sum += window[i]; } - scale = 1.0 / sum; + scale = 1.0f / (float) sum; for (i = 0; i < fftsize; i++) window[i] *= scale; } @@ -65,23 +67,23 @@ SIPHON::SIPHON( int _sipsize, int _fftsize, int _specmode -) +) : + run(_run), + position(_position), + mode(_mode), + disp(_disp), + insize(_insize), + in(_in), + sipsize(_sipsize), // NOTE: sipsize MUST BE A POWER OF TWO!! + fftsize(_fftsize), + specmode(_specmode) { - run = _run; - position = _position; - mode = _mode; - disp = _disp; - insize = _insize; - in = _in; - sipsize = _sipsize; // NOTE: sipsize MUST BE A POWER OF TWO!! - fftsize = _fftsize; - specmode = _specmode; - sipbuff.resize(sipsize * 2); // (float *) malloc0 (sipsize * sizeof (complex)); + sipbuff.resize(sipsize * 2); idx = 0; - sipout.resize(sipsize * 2); // (float *) malloc0 (sipsize * sizeof (complex)); - specout.resize(fftsize * 2); // (float *) malloc0 (fftsize * sizeof (complex)); + sipout.resize(sipsize * 2); + specout.resize(fftsize * 2); sipplan = fftwf_plan_dft_1d (fftsize, (fftwf_complex *) sipout.data(), (fftwf_complex *) specout.data(), FFTW_FORWARD, FFTW_PATIENT); - window.resize(fftsize * 2); // (float *) malloc0 (fftsize * sizeof (complex)); + window.resize(fftsize * 2); build_window(); } @@ -100,35 +102,28 @@ void SIPHON::flush() void SIPHON::execute(int pos) { - int first, second; + int first; + int second; - if (run && position == pos) + if (run && (position == pos) && (mode == 0)) { - switch (mode) + if (insize >= sipsize) + std::copy(&(in[2 * (insize - sipsize)]), &(in[2 * (insize - sipsize)]) + sipsize * 2, sipbuff.begin()); + else { - case 0: - if (insize >= sipsize) - std::copy(&(in[2 * (insize - sipsize)]), &(in[2 * (insize - sipsize)]) + sipsize * 2, sipbuff.begin()); + if (insize > (sipsize - idx)) + { + first = sipsize - idx; + second = insize - first; + } else { - if (insize > (sipsize - idx)) - { - first = sipsize - idx; - second = insize - first; - } - else - { - first = insize; - second = 0; - } - std::copy(in, in + first * 2, sipbuff.begin() + 2 * idx); - std::copy(in + 2 * first, in + 2 * first + second * 2, sipbuff.begin()); - if ((idx += insize) >= sipsize) idx -= sipsize; + first = insize; + second = 0; } - break; - case 1: - // Spectrum0 (1, disp, 0, 0, in); - break; + std::copy(in, in + first * 2, sipbuff.begin() + 2 * idx); + std::copy(in + 2 * first, in + 2 * first + second * 2, sipbuff.begin()); + if ((idx += insize) >= sipsize) idx -= sipsize; } } } @@ -168,8 +163,7 @@ void SIPHON::suck() void SIPHON::sip_spectrum() { - int i; - for (i = 0; i < fftsize; i++) + for (int i = 0; i < fftsize; i++) { sipout[2 * i + 0] *= window[i]; sipout[2 * i + 1] *= window[i]; @@ -189,7 +183,7 @@ void SIPHON::getaSipF(float* _out, int _size) suck (); for (int i = 0; i < _size; i++) { - _out[i] = (float) sipout[2 * i + 0]; + _out[i] = sipout[2 * i + 0]; } } @@ -200,8 +194,8 @@ void SIPHON::getaSipF1(float* _out, int _size) for (int i = 0; i < _size; i++) { - _out[2 * i + 0] = (float) sipout[2 * i + 0]; - _out[2 * i + 1] = (float) sipout[2 * i + 1]; + _out[2 * i + 0] = sipout[2 * i + 0]; + _out[2 * i + 1] = sipout[2 * i + 1]; } } @@ -236,7 +230,11 @@ void SIPHON::setSipSpecmode(int _mode) void SIPHON::getSpecF1(float* _out) { // return spectrum magnitudes in dB - int i, j, mid, m, n; + int i; + int j; + int mid; + int m; + int n; outsize = fftsize; suck(); sip_spectrum(); @@ -262,68 +260,5 @@ void SIPHON::getSpecF1(float* _out) } } -/******************************************************************************************************** -* * -* CALLS FOR EXTERNAL USE * -* * -********************************************************************************************************/ - -/* -#define MAX_EXT_SIPHONS (2) // maximum number of Siphons called from outside wdsp -__declspec (align (16)) SIPHON psiphon[MAX_EXT_SIPHONS]; // array of pointers for Siphons used EXTERNAL to wdsp - - -PORT -void create_siphonEXT (int id, int run, int insize, int sipsize, int fftsize, int specmode) -{ - psiphon[id] = create_siphon (run, 0, 0, 0, insize, 0, sipsize, fftsize, specmode); -} - -PORT -void destroy_siphonEXT (int id) -{ - destroy_siphon (psiphon[id]); -} - -PORT -void flush_siphonEXT (int id) -{ - flush_siphon (psiphon[id]); -} - -PORT -void xsiphonEXT (int id, float* buff) -{ - SIPHON a = psiphon[id]; - a->in = buff; - xsiphon (a, 0); -} - -PORT -void GetaSipF1EXT (int id, float* out, int size) -{ // return raw samples as floats - SIPHON a = psiphon[id]; - int i; - a->update.lock(); - a->outsize = size; - suck (a); - a->update.unlock(); - for (i = 0; i < size; i++) - { - out[2 * i + 0] = (float)a->sipout[2 * i + 0]; - out[2 * i + 1] = (float)a->sipout[2 * i + 1]; - } -} - -PORT -void SetSiphonInsize (int id, int size) -{ - SIPHON a = psiphon[id]; - a->update.lock(); - a->insize = size; - a->update.unlock(); -} -*/ - } // namespace WDSP diff --git a/wdsp/siphon.hpp b/wdsp/siphon.hpp index bad4065d3..4517223ae 100644 --- a/wdsp/siphon.hpp +++ b/wdsp/siphon.hpp @@ -87,11 +87,6 @@ public: void setSipDisplay(int disp); void getSpecF1(float* out); void setSipSpecmode(int mode); - // Calls for External Use - // static void create_siphonEXT (int id, int run, int insize, int sipsize, int fftsize, int specmode); - // static void destroy_siphonEXT (int id); - // static void xsiphonEXT (int id, float* buff); - // static void SetSiphonInsize (int id, int size); private: void build_window(); diff --git a/wdsp/snba.cpp b/wdsp/snba.cpp index 1783066c5..c212aa3ca 100644 --- a/wdsp/snba.cpp +++ b/wdsp/snba.cpp @@ -25,6 +25,8 @@ warren@wpratt.com */ +#include + #include "comm.hpp" #include "resample.hpp" #include "lmath.hpp" @@ -36,10 +38,75 @@ warren@wpratt.com #include "emnr.hpp" #include "snba.hpp" -#define MAXIMP 256 - namespace WDSP { +SNBA::Exec::Exec(int xsize, int _asize, int _npasses) : + asize(_asize), + npasses(_npasses) +{ + a.resize(xsize); + v.resize(xsize); + detout.resize(xsize); + savex.resize(xsize); + xHout.resize(xsize); + unfixed.resize(xsize); +} + +void SNBA::Exec::fluxh() +{ + std::fill (a.begin(), a.end(), 0); + std::fill (v.begin(), v.end(), 0); + std::fill (detout.begin(), detout.end(), 0); + std::fill (savex.begin(), savex.end(), 0); + std::fill (xHout.begin(), xHout.end(), 0); + std::fill (unfixed.begin(), unfixed.end(), 0); +} + +SNBA::Det::Det( + int _xsize, + double _k1, + double _k2, + int _b, + int _pre, + int _post +) : + k1(_k1), + k2(_k2), + b(_b), + pre(_pre), + post(_post) +{ + vp.resize(_xsize); + vpwr.resize(_xsize); +} + +void SNBA::Det::flush() +{ + std::fill(vp.begin(), vp.end(), 0); + std::fill(vpwr.begin(), vpwr.end(), 0); +} + +SNBA::Wrk::Wrk( + int xsize, + int asize +) : + xHat_a1rows_max(xsize + asize), + xHat_a2cols_max(xsize + 2 * asize) +{ + xHat_r.resize(xsize); + xHat_ATAI.resize(xsize * xsize); + xHat_A1.resize(xHat_a1rows_max * xsize); + xHat_A2.resize(xHat_a1rows_max * xHat_a2cols_max); + xHat_P1.resize(xsize * xHat_a2cols_max); + xHat_P2.resize(xsize); + trI_y.resize(xsize - 1); + trI_v.resize(xsize - 1); + dR_z.resize(xsize - 2); + asolve_r.resize(asize + 1); + asolve_z.resize(asize + 1); + +} + void SNBA::calc() { if (inrate >= internalrate) @@ -47,8 +114,8 @@ void SNBA::calc() else isize = bsize * (internalrate / inrate); - inbuff = new float[isize * 2]; // (double *) malloc0 (isize * sizeof (complex)); - outbuff = new float[isize * 2]; // (double *) malloc0 (isize * sizeof (complex)); + inbuff = new float[isize * 2]; + outbuff = new float[isize * 2]; if (inrate != internalrate) resamprun = 1; @@ -88,7 +155,7 @@ void SNBA::calc() iainidx = 0; iaoutidx = 0; - inaccum = new double[iasize * 2]; // (double *) malloc0 (iasize * sizeof (double)); + inaccum.resize(iasize * 2); nsamps = 0; if (incr > isize) @@ -105,7 +172,7 @@ void SNBA::calc() } init_oaoutidx = oaoutidx; - outaccum = new double[oasize * 2]; // (double *) malloc0 (oasize * sizeof (double)); + outaccum.resize(oasize * 2); } SNBA::SNBA( @@ -140,15 +207,12 @@ SNBA::SNBA( iasize(0), iainidx(0), iaoutidx(0), - inaccum(nullptr), - xbase(nullptr), xaux(nullptr), nsamps(0), oasize(0), oainidx(0), oaoutidx(0), init_oaoutidx(0), - outaccum(nullptr), resamprun(0), isize(0), inresamp(nullptr), @@ -156,80 +220,29 @@ SNBA::SNBA( inbuff(nullptr), outbuff(nullptr), out_low_cut(_out_low_cut), - out_high_cut(_out_high_cut) + out_high_cut(_out_high_cut), + exec(_xsize, _asize, _npasses), + sdet(_xsize, _k1, _k2, _b, _pre, _post), + wrk(_xsize, _asize) { - exec.asize = _asize; - exec.npasses = _npasses; - sdet.k1 = _k1; - sdet.k2 = _k2; - sdet.b = _b; - sdet.pre = _pre; - sdet.post = _post; scan.pmultmin = _pmultmin; calc(); - xbase = new double[2 * xsize]; // (double *) malloc0 (2 * xsize * sizeof (double)); - xaux = xbase + xsize; - exec.a = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - exec.v = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - exec.detout = new int[xsize]; //(int *) malloc0 (xsize * sizeof (int)); - exec.savex = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - exec.xHout = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - exec.unfixed = new int[xsize]; //(int *) malloc0 (xsize * sizeof (int)); - sdet.vp = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - sdet.vpwr = new double[xsize]; //(double *) malloc0 (xsize * sizeof (double)); - - wrk.xHat_a1rows_max = xsize + exec.asize; - wrk.xHat_a2cols_max = xsize + 2 * exec.asize; - wrk.xHat_r = new double[xsize]; // (double *) malloc0 (xsize * sizeof(double)); - wrk.xHat_ATAI = new double[xsize * xsize]; // (double *) malloc0 (xsize * xsize * sizeof(double)); - wrk.xHat_A1 = new double[wrk.xHat_a1rows_max * xsize]; // (double *) malloc0 (wrk.xHat_a1rows_max * xsize * sizeof(double)); - wrk.xHat_A2 = new double[wrk.xHat_a1rows_max * wrk.xHat_a2cols_max]; // (double *) malloc0 (wrk.xHat_a1rows_max * wrk.xHat_a2cols_max * sizeof(double)); - wrk.xHat_P1 = new double[xsize * wrk.xHat_a2cols_max]; // (double *) malloc0 (xsize * wrk.xHat_a2cols_max * sizeof(double)); - wrk.xHat_P2 = new double[xsize]; // (double *) malloc0 (xsize * sizeof(double)); - wrk.trI_y = new double[xsize - 1]; // (double *) malloc0 ((xsize - 1) * sizeof(double)); - wrk.trI_v = new double[xsize - 1]; // (double *) malloc0 ((xsize - 1) * sizeof(double)); - wrk.dR_z = new double[xsize - 2]; // (double *) malloc0 ((xsize - 2) * sizeof(double)); - wrk.asolve_r = new double[exec.asize + 1]; // (double *) malloc0 ((exec.asize + 1) * sizeof(double)); - wrk.asolve_z = new double[exec.asize + 1]; // (double *) malloc0 ((exec.asize + 1) * sizeof(double)); + xbase.resize(2 * xsize); + xaux = &xbase[xsize]; } void SNBA::decalc() { - delete (outresamp); - delete (inresamp); - delete[] (outbuff); - delete[] (inbuff); - delete[] (outaccum); - delete[] (inaccum); + delete outresamp; + delete inresamp; + delete[] outbuff; + delete[] inbuff; } SNBA::~SNBA() { - delete[] (wrk.xHat_r); - delete[] (wrk.xHat_ATAI); - delete[] (wrk.xHat_A1); - delete[] (wrk.xHat_A2); - delete[] (wrk.xHat_P1); - delete[] (wrk.xHat_P2); - delete[] (wrk.trI_y); - delete[] (wrk.trI_v); - delete[] (wrk.dR_z); - delete[] (wrk.asolve_r); - delete[] (wrk.asolve_z); - - delete[] (sdet.vpwr); - delete[] (sdet.vp); - delete[] (exec.unfixed); - delete[] (exec.xHout); - delete[] (exec.savex); - delete[] (exec.detout); - delete[] (exec.v); - delete[] (exec.a); - - delete[] (xbase); - decalc(); } @@ -241,20 +254,13 @@ void SNBA::flush() oainidx = 0; oaoutidx = init_oaoutidx; - memset (inaccum, 0, iasize * sizeof (double)); - memset (outaccum, 0, oasize * sizeof (double)); - memset (xaux, 0, xsize * sizeof (double)); - memset (exec.a, 0, xsize * sizeof (double)); - memset (exec.v, 0, xsize * sizeof (double)); - memset (exec.detout, 0, xsize * sizeof (int)); - memset (exec.savex, 0, xsize * sizeof (double)); - memset (exec.xHout, 0, xsize * sizeof (double)); - memset (exec.unfixed, 0, xsize * sizeof (int)); - memset (sdet.vp, 0, xsize * sizeof (double)); - memset (sdet.vpwr, 0, xsize * sizeof (double)); - - std::fill(inbuff, inbuff + isize * 2, 0); - std::fill(outbuff, outbuff + isize * 2, 0); + exec.fluxh(); + sdet.flush(); + std::fill(inaccum.begin(), inaccum.end(), 0); + std::fill(outaccum.begin(), outaccum.end(), 0); + std::fill(xaux, xaux + xsize, 0); + std::fill(inbuff, inbuff + isize * 2, 0); + std::fill(outbuff, outbuff + isize * 2, 0); inresamp->flush(); outresamp->flush(); @@ -282,27 +288,26 @@ void SNBA::setSize(int size) calc(); } -void SNBA::ATAc0 (int n, int nr, double* A, double* r) +void SNBA::ATAc0 (int n, int nr, std::vector& A, std::vector& r) { - int i, j; - memset(r, 0, n * sizeof (double)); + std::fill(r.begin(), r.begin() + n, 0); - for (i = 0; i < n; i++) + for (int i = 0; i < n; i++) { - for (j = 0; j < nr; j++) + for (int j = 0; j < nr; j++) r[i] += A[j * n + i] * A[j * n + 0]; } } -void SNBA::multA1TA2(double* a1, double* a2, int m, int n, int q, double* c) +void SNBA::multA1TA2(std::vector& a1, std::vector& a2, int m, int n, int q, std::vector& c) { - int i, j, k; + int k; int p = q - m; - memset (c, 0, m * n * sizeof (double)); + std::fill(c.begin(), c.begin() + m*n, 0); - for (i = 0; i < m; i++) + for (int i = 0; i < m; i++) { - for (j = 0; j < n; j++) + for (int j = 0; j < n; j++) { if (j < p) { @@ -318,12 +323,12 @@ void SNBA::multA1TA2(double* a1, double* a2, int m, int n, int q, double* c) } } -void SNBA::multXKE(double* a, double* xk, int m, int q, int p, double* vout) +void SNBA::multXKE(std::vector& a, const double* xk, int m, int q, int p, std::vector& vout) { - int i, k; - memset (vout, 0, m * sizeof (double)); + int k; + std::fill(vout.begin(), vout.begin() + m, 0); - for (i = 0; i < m; i++) + for (int i = 0; i < m; i++) { for (k = i; k < p; k++) vout[i] += a[i * q + k] * xk[k]; @@ -332,14 +337,13 @@ void SNBA::multXKE(double* a, double* xk, int m, int q, int p, double* vout) } } -void SNBA::multAv(double* a, double* v, int m, int q, double* vout) +void SNBA::multAv(std::vector& a, std::vector& v, int m, int q, std::vector& vout) { - int i, k; - memset (vout, 0, m * sizeof (double)); + std::fill(vout.begin(), vout.begin() + m, 0); - for (i = 0; i < m; i++) + for (int i = 0; i < m; i++) { - for (k = 0; k < q; k++) + for (int k = 0; k < q; k++) vout[i] += a[i * q + k] * v[k]; } } @@ -347,29 +351,31 @@ void SNBA::multAv(double* a, double* v, int m, int q, double* vout) void SNBA::xHat( int xusize, int asize, - double* xk, - double* a, - double* xout, - double* r, - double* ATAI, - double* A1, - double* A2, - double* P1, - double* P2, - double* trI_y, - double* trI_v, - double* dR_z + const double* xk, + std::vector& a, + std::vector& xout, + std::vector& r, + std::vector& ATAI, + std::vector& A1, + std::vector& A2, + std::vector& P1, + std::vector& P2, + std::vector& trI_y, + std::vector& trI_v, + std::vector& dR_z ) { - int i, j, k; + int i; + int j; + int k; int a1rows = xusize + asize; int a2cols = xusize + 2 * asize; - memset (r, 0, xusize * sizeof(double)); // work space - memset (ATAI, 0, xusize * xusize * sizeof(double)); // work space - memset (A1, 0, a1rows * xusize * sizeof(double)); // work space - memset (A2, 0, a1rows * a2cols * sizeof(double)); // work space - memset (P1, 0, xusize * a2cols * sizeof(double)); // work space - memset (P2, 0, xusize * sizeof(double)); // work space + std::fill (r.begin(), r.begin() + xusize, 0); // work space + std::fill (ATAI.begin(), ATAI.begin() + xusize * xusize, 0); // work space + std::fill (A1.begin(), A1.begin() + a1rows * xusize, 0); // work space + std::fill (A2.begin(), A2.begin() + a1rows * a2cols, 0); // work space + std::fill (P1.begin(), P1.begin() + xusize * a2cols, 0); // work space + std::fill (P2.begin(), P2.begin() + xusize, 0); // work space for (i = 0; i < xusize; i++) { @@ -380,28 +386,29 @@ void SNBA::xHat( } for (i = 0; i < asize; i++) - { - for (k = asize - i - 1, j = 0; k < asize; k++, j++) - A2[j * a2cols + i] = a[k]; - } + { + for (k = asize - i - 1, j = 0; k < asize; k++, j++) + A2[j * a2cols + i] = a[k]; + } for (i = asize + xusize; i < 2 * asize + xusize; i++) - { - A2[(i - asize) * a2cols + i] = - 1.0; - for (j = i - asize + 1, k = 0; j < xusize + asize; j++, k++) - A2[j * a2cols + i] = a[k]; - } + { + A2[(i - asize) * a2cols + i] = - 1.0; + for (j = i - asize + 1, k = 0; j < xusize + asize; j++, k++) + A2[j * a2cols + i] = a[k]; + } ATAc0(xusize, xusize + asize, A1, r); - LMathd::trI(xusize, r, ATAI, trI_y, trI_v, dR_z); + LMathd::trI(xusize, r.data(), ATAI.data(), trI_y.data(), trI_v.data(), dR_z.data()); multA1TA2(A1, A2, xusize, 2 * asize + xusize, xusize + asize, P1); multXKE(P1, xk, xusize, xusize + 2 * asize, asize, P2); multAv(ATAI, P2, xusize, xusize, xout); } -void SNBA::invf(int xsize, int asize, double* a, double* x, double* v) +void SNBA::invf(int xsize, int asize, std::vector& a, const double* x, std::vector& v) { - int i, j; - memset (v, 0, xsize * sizeof (double)); + int i; + int j; + std::fill(v.begin(), v.begin() + xsize, 0); for (i = asize; i < xsize - asize; i++) { @@ -417,12 +424,16 @@ void SNBA::invf(int xsize, int asize, double* a, double* x, double* v) } } -void SNBA::det(int asize, double* v, int* detout) +void SNBA::det(int asize, std::vector& v, std::vector& detout) { - int i, j; + int i; + int j; double medpwr; - double t1, t2; - int bstate, bcount, bsamp; + double t1; + double t2; + int bstate; + int bcount; + int bsamp; for (i = asize, j = 0; i < xsize; i++, j++) { @@ -430,7 +441,7 @@ void SNBA::det(int asize, double* v, int* detout) sdet.vp[j] = sdet.vpwr[i]; } - LMathd::median(xsize - asize, sdet.vp, &medpwr); + LMathd::median(xsize - asize, sdet.vp.data(), &medpwr); t1 = sdet.k1 * medpwr; t2 = 0.0; @@ -492,6 +503,8 @@ void SNBA::det(int asize, double* v, int* detout) bstate = 1; } + break; + default: break; } } @@ -525,24 +538,26 @@ int SNBA::scanFrame( int xsize, int pval, double pmultmin, - int* det, - int* bimp, - int* limp, - int* befimp, - int* aftimp, - int* p_opt, + std::vector& det, + std::array& bimp, + std::array& limp, + std::array& befimp, + std::array& aftimp, + std::array& p_opt, int* next ) { int inflag = 0; - int i = 0, j = 0, k = 0; + int i = 0; + int j = 0; + int k = 0; int nimp = 0; double td; int ti; - double merit[MAXIMP] = { 0 }; - int nextlist[MAXIMP]; - memset (befimp, 0, MAXIMP * sizeof (int)); - memset (aftimp, 0, MAXIMP * sizeof (int)); + std::array merit = { 0 }; + std::array nextlist; + std::fill(befimp.begin(), befimp.end(), 0); + std::fill(aftimp.begin(), aftimp.end(), 0); while (i < xsize && nimp < MAXIMP) { @@ -555,7 +570,8 @@ int SNBA::scanFrame( } else if (det[i] == 1) { - limp[nimp - 1]++; + if (nimp > 0) + limp[nimp - 1]++; } else { @@ -634,22 +650,20 @@ int SNBA::scanFrame( void SNBA::execFrame(double* x) { - int i, k; - int pass; int nimp; - int bimp[MAXIMP]; - int limp[MAXIMP]; - int befimp[MAXIMP]; - int aftimp[MAXIMP]; - int p_opt[MAXIMP]; + std::array bimp; + std::array limp; + std::array befimp; + std::array aftimp; + std::array p_opt; int next = 0; int p; - memcpy (exec.savex, x, xsize * sizeof (double)); - LMathd::asolve(xsize, exec.asize, x, exec.a, wrk.asolve_r, wrk.asolve_z); + std::copy(x, x + xsize, exec.savex.begin()); + LMathd::asolve(xsize, exec.asize, x, exec.a.data(), wrk.asolve_r.data(), wrk.asolve_z.data()); invf(xsize, exec.asize, exec.a, x, exec.v); det(exec.asize, exec.v, exec.detout); - for (i = 0; i < xsize; i++) + for (int i = 0; i < xsize; i++) { if (exec.detout[i] != 0) x[i] = 0.0; @@ -657,18 +671,18 @@ void SNBA::execFrame(double* x) nimp = scanFrame(xsize, exec.asize, scan.pmultmin, exec.detout, bimp, limp, befimp, aftimp, p_opt, &next); - for (pass = 0; pass < exec.npasses; pass++) + for (int pass = 0; pass < exec.npasses; pass++) { - memcpy (exec.unfixed, exec.detout, xsize * sizeof (int)); + std::copy(exec.detout.begin(), exec.detout.end(), exec.unfixed.begin()); - for (k = 0; k < nimp; k++) + for (int k = 0; k < nimp; k++) { if (k > 0) scanFrame(xsize, exec.asize, scan.pmultmin, exec.unfixed, bimp, limp, befimp, aftimp, p_opt, &next); if ((p = p_opt[next]) > 0) { - LMathd::asolve(xsize, p, x, exec.a, wrk.asolve_r, wrk.asolve_z); + LMathd::asolve(xsize, p, x, exec.a.data(), wrk.asolve_r.data(), wrk.asolve_z.data()); xHat( limp[next], p, @@ -685,7 +699,7 @@ void SNBA::execFrame(double* x) wrk.trI_v, wrk.dR_z ); - memcpy (&x[bimp[next]], exec.xHout, limp[next] * sizeof (double)); + std::copy(exec.xHout.begin(), exec.xHout.begin() + limp[next], &x[bimp[next]]); memset (&exec.unfixed[bimp[next]], 0, limp[next] * sizeof (int)); } else @@ -719,12 +733,12 @@ void SNBA::execute() nsamps -= incr; memcpy (&outaccum[oainidx], xaux, incr * sizeof (double)); oainidx = (oainidx + incr) % oasize; - memmove (xbase, &xbase[incr], (2 * xsize - incr) * sizeof (double)); + std::copy(&xbase[incr], &xbase[incr] + (2 * xsize - incr), xbase.begin()); } for (i = 0; i < isize; i++) { - outbuff[2 * i + 0] = outaccum[oaoutidx]; + outbuff[2 * i + 0] = (float) outaccum[oaoutidx]; outbuff[2 * i + 1] = 0.0; oaoutidx = (oaoutidx + 1) % oasize; } @@ -792,7 +806,8 @@ void SNBA::setPmultmin(double pmultmin) void SNBA::setOutputBandwidth(double flow, double fhigh) { - double f_low, f_high; + double f_low = 0; + double f_high = 0; if (flow >= 0 && fhigh >= 0) { @@ -802,7 +817,7 @@ void SNBA::setOutputBandwidth(double flow, double fhigh) if (flow > out_high_cut) flow = out_high_cut; - f_low = std::max ( out_low_cut, flow); + f_low = std::max (out_low_cut, flow); f_high = std::min (out_high_cut, fhigh); } else if (flow <= 0 && fhigh <= 0) @@ -813,7 +828,7 @@ void SNBA::setOutputBandwidth(double flow, double fhigh) if (fhigh < -out_high_cut) fhigh = -out_high_cut; - f_low = std::max ( out_low_cut, -fhigh); + f_low = std::max (out_low_cut, -fhigh); f_high = std::min (out_high_cut, -flow); } else if (flow < 0 && fhigh > 0) diff --git a/wdsp/snba.hpp b/wdsp/snba.hpp index e356c02a6..ab12d871c 100644 --- a/wdsp/snba.hpp +++ b/wdsp/snba.hpp @@ -28,11 +28,15 @@ warren@wpratt.com #ifndef wdsp_snba_h #define wdsp_snba_h +#include + +#include "export.h" + namespace WDSP{ class RESAMPLE; -class SNBA +class WDSP_API SNBA { public: int run; @@ -47,15 +51,15 @@ public: int iasize; int iainidx; int iaoutidx; - double* inaccum; - double* xbase; + std::vector inaccum; + std::vector xbase; double* xaux; int nsamps; int oasize; int oainidx; int oaoutidx; int init_oaoutidx; - double* outaccum; + std::vector outaccum; int resamprun; int isize; RESAMPLE *inresamp; @@ -64,48 +68,72 @@ public: float* outbuff; double out_low_cut; double out_high_cut; + static const int MAXIMP = 256; - struct _exec + struct Exec { int asize; - double* a; - double* v; - int* detout; - double* savex; - double* xHout; - int* unfixed; + std::vector a; + std::vector v; + std::vector detout; + std::vector savex; + std::vector xHout; + std::vector unfixed; int npasses; - } exec; - struct _det + + Exec(int xsize, int _asize, int _npasses); + void fluxh(); + }; + Exec exec; + struct Det { double k1; double k2; int b; int pre; int post; - double* vp; - double* vpwr; - } sdet; - struct _scan + std::vector vp; + std::vector vpwr; + + Det( + int xsize, + double k1, + double k2, + int b, + int pre, + int post + ); + void flush(); + }; + Det sdet; + struct Scan { double pmultmin; - } scan; - struct _wrk + }; + Scan scan; + struct Wrk { int xHat_a1rows_max; int xHat_a2cols_max; - double* xHat_r; - double* xHat_ATAI; - double* xHat_A1; - double* xHat_A2; - double* xHat_P1; - double* xHat_P2; - double* trI_y; - double* trI_v; - double* dR_z; - double* asolve_r; - double* asolve_z; - } wrk; + std::vector xHat_r; + std::vector xHat_ATAI; + std::vector xHat_A1; + std::vector xHat_A2; + std::vector xHat_P1; + std::vector xHat_P2; + std::vector trI_y; + std::vector trI_v; + std::vector dR_z; + std::vector asolve_r; + std::vector asolve_z; + + Wrk( + int xsize, + int asize + ); + void flush(); + }; + Wrk wrk; SNBA( int run, @@ -149,40 +177,40 @@ public: private: void calc(); void decalc(); - static void ATAc0 (int n, int nr, double* A, double* r); - static void multA1TA2(double* a1, double* a2, int m, int n, int q, double* c); - static void multXKE(double* a, double* xk, int m, int q, int p, double* vout); - static void multAv(double* a, double* v, int m, int q, double* vout); + static void ATAc0 (int n, int nr, std::vector& A, std::vector& r); + static void multA1TA2(std::vector& a1, std::vector& a2, int m, int n, int q, std::vector& c); + static void multXKE(std::vector& a, const double* xk, int m, int q, int p, std::vector& vout); + static void multAv(std::vector& a, std::vector& v, int m, int q, std::vector& vout); static void xHat( int xusize, int asize, - double* xk, - double* a, - double* xout, - double* r, - double* ATAI, - double* A1, - double* A2, - double* P1, - double* P2, - double* trI_y, - double* trI_v, - double* dR_z + const double* xk, + std::vector& a, + std::vector& xout, + std::vector& r, + std::vector& ATAI, + std::vector& A1, + std::vector& A2, + std::vector& P1, + std::vector& P2, + std::vector& trI_y, + std::vector& trI_v, + std::vector& dR_z ); - static void invf(int xsize, int asize, double* a, double* x, double* v); + static void invf(int xsize, int asize, std::vector& a, const double* x, std::vector& v); static int scanFrame( int xsize, int pval, double pmultmin, - int* det, - int* bimp, - int* limp, - int* befimp, - int* aftimp, - int* p_opt, + std::vector& det, + std::array& bimp, + std::array& limp, + std::array& befimp, + std::array& aftimp, + std::array& p_opt, int* next ); - void det(int asize, double* v, int* detout); + void det(int asize, std::vector& v, std::vector& detout); void execFrame(double* x); }; diff --git a/wdsp/snotch.cpp b/wdsp/snotch.cpp index d26e6a5ad..f2d532c0b 100644 --- a/wdsp/snotch.cpp +++ b/wdsp/snotch.cpp @@ -38,8 +38,11 @@ namespace WDSP { void SNOTCH::calc() { - double fn, qk, qr, csn; - fn = f / (double) rate; + double fn; + double qk; + double qr; + double csn; + fn = f / rate; csn = cos (TWOPI * fn); qr = 1.0 - 3.0 * bw; qk = (1.0 - 2.0 * qr * csn + qr * qr) / (2.0 * (1.0 - csn)); @@ -80,11 +83,10 @@ void SNOTCH::execute() { if (run) { - int i; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { x0 = in[2 * i + 0]; - out[2 * i + 0] = a0 * x0 + a1 * x1 + a2 * x2 + b1 * y1 + b2 * y2; + out[2 * i + 0] = (float) (a0 * x0 + a1 * x1 + a2 * x2 + b1 * y1 + b2 * y2); y2 = y1; y1 = out[2 * i + 0]; x2 = x1; diff --git a/wdsp/snotch.hpp b/wdsp/snotch.hpp index bbed01d1c..027e02bbb 100644 --- a/wdsp/snotch.hpp +++ b/wdsp/snotch.hpp @@ -48,8 +48,16 @@ public: double rate; double f; double bw; - double a0, a1, a2, b1, b2; - double x0, x1, x2, y1, y2; + double a0; + double a1; + double a2; + double b1; + double b2; + double x0; + double x1; + double x2; + double y1; + double y2; SNOTCH( int run, @@ -62,7 +70,7 @@ public: ); SNOTCH(const SNOTCH&) = delete; SNOTCH& operator=(SNOTCH& other) = delete; - ~SNOTCH() {} + ~SNOTCH() = default; void flush(); void execute(); diff --git a/wdsp/speak.cpp b/wdsp/speak.cpp index b2a1f0a20..e07e5a168 100644 --- a/wdsp/speak.cpp +++ b/wdsp/speak.cpp @@ -39,31 +39,38 @@ namespace WDSP { void SPEAK::calc() { double ratio; - double f_corr, g_corr, bw_corr, bw_parm, A, f_min; + double f_corr; + double g_corr; + double bw_corr; + double bw_parm; + double A; + double f_min; switch (design) { case 0: ratio = bw / f; - switch (nstages) + if (nstages == 4) { - case 4: bw_parm = 2.4; f_corr = 1.0 - 0.160 * ratio + 1.440 * ratio * ratio; g_corr = 1.0 - 1.003 * ratio + 3.990 * ratio * ratio; - break; - default: + } + else + { bw_parm = 1.0; f_corr = 1.0; g_corr = 1.0; - break; } { - double fn, qk, qr, csn; + double fn; + double qk; + double qr; + double csn; fgain = gain / g_corr; - fn = f / (double)rate / f_corr; + fn = f / rate / f_corr; csn = cos (TWOPI * fn); - qr = 1.0 - 3.0 * bw / (double)rate * bw_parm; + qr = 1.0 - 3.0 * bw / rate * bw_parm; qk = (1.0 - 2.0 * qr * csn + qr * qr) / (2.0 * (1.0 - csn)); a0 = 1.0 - qk; a1 = 2.0 * (qk - qr) * csn; @@ -76,26 +83,27 @@ void SPEAK::calc() case 1: if (f < 200.0) f = 200.0; ratio = bw / f; - switch (nstages) + if (nstages == 4) { - case 4: bw_parm = 5.0; bw_corr = 1.13 * ratio - 0.956 * ratio * ratio; A = 2.5; f_min = 50.0; - break; - default: + } + else + { bw_parm = 1.0; bw_corr = 1.0; - g_corr = 1.0; A = 2.5; f_min = 50.0; - break; } { - double w0, sn, c, den; + double w0; + double sn; + double c; + double den; if (f < f_min) f = f_min; - w0 = TWOPI * f / (double)rate; + w0 = TWOPI * f / rate; sn = sin (w0); cbw = bw_corr * f; c = sn * sinh(0.5 * log((f + 0.5 * cbw * bw_parm) / (f - 0.5 * cbw * bw_parm)) * w0 / sn); @@ -108,6 +116,8 @@ void SPEAK::calc() fgain = gain / pow (A * A, (double)nstages); } break; + default: + break; } flush(); } @@ -135,12 +145,12 @@ SPEAK::SPEAK( nstages(_nstages), design(_design) { - x0.resize(nstages * 2); // (float *) malloc0 (nstages * sizeof (complex)); - x1.resize(nstages * 2); // (float *) malloc0 (nstages * sizeof (complex)); - x2.resize(nstages * 2); //(float *) malloc0 (nstages * sizeof (complex)); - y0.resize(nstages * 2); // (float *) malloc0 (nstages * sizeof (complex)); - y1.resize(nstages * 2); // (float *) malloc0 (nstages * sizeof (complex)); - y2.resize(nstages * 2); // (float *) malloc0 (nstages * sizeof (complex)); + x0.resize(nstages * 2); + x1.resize(nstages * 2); + x2.resize(nstages * 2); + y0.resize(nstages * 2); + y1.resize(nstages * 2); + y2.resize(nstages * 2); calc(); } @@ -178,7 +188,7 @@ void SPEAK::execute() x1[2 * n + j] = x0[2 * n + j]; } - out[2 * i + j] = y0[2 * (nstages - 1) + j]; + out[2 * i + j] = (float) y0[2 * (nstages - 1) + j]; } } } diff --git a/wdsp/speak.hpp b/wdsp/speak.hpp index b5602a1f2..b216b91ac 100644 --- a/wdsp/speak.hpp +++ b/wdsp/speak.hpp @@ -55,8 +55,17 @@ public: double fgain; int nstages; int design; - double a0, a1, a2, b1, b2; - std::vector x0, x1, x2, y0, y1, y2; + double a0; + double a1; + double a2; + double b1; + double b2; + std::vector x0; + std::vector x1; + std::vector x2; + std::vector y0; + std::vector y1; + std::vector y2; SPEAK( int run, @@ -72,7 +81,7 @@ public: ); SPEAK(const SPEAK&) = delete; SPEAK& operator=(const SPEAK& other) = delete; - ~SPEAK() {} + ~SPEAK() = default; void flush(); void execute(); diff --git a/wdsp/sphp.cpp b/wdsp/sphp.cpp index 2b392b6fe..b17b7d248 100644 --- a/wdsp/sphp.cpp +++ b/wdsp/sphp.cpp @@ -81,14 +81,13 @@ void SPHP::execute() { if (run) { - int i, j, n; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) { - for (j = 0; j < 2; j++) + for (int j = 0; j < 2; j++) { x0[j] = in[2 * i + j]; - for (n = 0; n < nstages; n++) + for (int n = 0; n < nstages; n++) { if (n > 0) x0[2 * n + j] = y0[2 * (n - 1) + j]; @@ -100,7 +99,7 @@ void SPHP::execute() x1[2 * n + j] = x0[2 * n + j]; } - out[2 * i + j] = y0[2 * (nstages - 1) + j]; + out[2 * i + j] = (float) y0[2 * (nstages - 1) + j]; } } } diff --git a/wdsp/ssql.cpp b/wdsp/ssql.cpp index 69ec65aa0..98410fc3e 100644 --- a/wdsp/ssql.cpp +++ b/wdsp/ssql.cpp @@ -56,7 +56,7 @@ FTOV::FTOV( in = _in; out = _out; eps = 0.01; - ring.resize(rsize); // (int*) malloc0 (rsize * sizeof (int)); + ring.resize(rsize); rptr = 0; inlast = 0.0; rcount = 0; @@ -91,7 +91,7 @@ void FTOV::execute() rcount++; // increment the count } if (++rptr == rsize) rptr = 0; // increment and wrap the pointer as needed - out[0] = std::min (1.0, (double)rcount / div); // calculate the output sample + out[0] = (float) std::min (1.0, (double)rcount / div); // calculate the output sample inlast = in[size - 1]; // save the last input sample for next buffer for (int i = 1; i < size; i++) { @@ -107,7 +107,7 @@ void FTOV::execute() rcount++; // increment the count } if (++rptr == rsize) rptr = 0; // increment and wrap the pointer as needed - out[i] = std::min(1.0, (double)rcount / div); // calculate the output sample + out[i] = (float) std::min(1.0, (double)rcount / div); // calculate the output sample } } } @@ -118,7 +118,8 @@ void FTOV::execute() void SSQL::compute_slews() { - double delta, theta; + double delta; + double theta; delta = PI / (double) ntup; theta = 0.0; for (int i = 0; i <= ntup; i++) @@ -137,15 +138,33 @@ void SSQL::compute_slews() void SSQL::calc() { - b1 = new float[size * 2]; // (float*) malloc0 (size * sizeof (complex)); - dcbl = new CBL(1, size, in, b1, 0, rate, 0.02); - ibuff = new float[size]; // (float*) malloc0 (size * sizeof (float)); - ftovbuff = new float[size]; // (float*) malloc0(size * sizeof (float)); - cvtr = new FTOV(1, size, rate, ftov_rsize, ftov_fmax, ibuff, ftovbuff); - lpbuff = new float[size]; // (float*) malloc0 (size * sizeof (float)); - filt = new DBQLP(1, size, ftovbuff, lpbuff, rate, 11.3, 1.0, 1.0, 1); - wdbuff = new int[size]; // (int*) malloc0 (size * sizeof (int)); - tr_signal = new int[size]; // (int*) malloc0 (size * sizeof (int)); + b1.resize(size * 2); + dcbl = new CBL(1, size, in, b1.data(), 0, rate, 0.02); + ibuff.resize(size); + ftovbuff.resize(size); + cvtr = new FTOV( + 1, + size, + rate, + ftov_rsize, + ftov_fmax, + ibuff.data(), + ftovbuff.data() + ); + lpbuff.resize(size); + filt = new DBQLP( + 1, + size, + ftovbuff.data(), + lpbuff.data(), + rate, + 11.3, + 1.0, + 1.0, + 1 + ); + wdbuff.resize(size); + tr_signal.resize(size); // window detector wdmult = exp (-1.0 / (rate * wdtau)); wdaverage = 0.0; @@ -156,27 +175,19 @@ void SSQL::calc() // level change ntup = (int)(tup * rate); ntdown = (int)(tdown * rate); - cup = new float[ntup + 1]; // (float*) malloc0 ((ntup + 1) * sizeof (float)); - cdown = new float[ntdown + 1]; // (float*) malloc0 ((ntdown + 1) * sizeof (float)); + cup.resize(ntup + 1); + cdown.resize(ntdown + 1); compute_slews(); // control - state = 0; + state = SSQLState::MUTED; count = 0; } void SSQL::decalc() { - delete[] (tr_signal); - delete[] (wdbuff); - delete (filt); - delete[] (lpbuff); - delete (cvtr); - delete[] (ftovbuff); - delete[] (ibuff); - delete (dcbl); - delete[] (b1); - delete[] (cdown); - delete[] (cup); + delete filt; + delete cvtr; + delete dcbl; } SSQL::SSQL( @@ -223,24 +234,17 @@ SSQL::~SSQL() void SSQL::flush() { - std::fill(b1, b1 + size * 2, 0); + std::fill(b1.begin(), b1.end(), 0); dcbl->flush(); - memset (ibuff, 0, size * sizeof (float)); - memset (ftovbuff, 0, size * sizeof (float)); + std::fill(ibuff.begin(), ibuff.end(), 0); + std::fill(ftovbuff.begin(), ftovbuff.end(), 0); cvtr->flush(); - memset (lpbuff, 0, size * sizeof (float)); + std::fill(lpbuff.begin(), lpbuff.end(), 0); filt->flush(); - memset (wdbuff, 0, size * sizeof (int)); - memset (tr_signal, 0, size * sizeof (int)); + std::fill(wdbuff.begin(), wdbuff.end(), 0); + std::fill(tr_signal.begin(), tr_signal.end(), 0); } -enum _ssqlstate -{ - MUTED, - INCREASE, - UNMUTED, - DECREASE -}; void SSQL::execute() { @@ -277,35 +281,35 @@ void SSQL::execute() { switch (state) { - case MUTED: + case SSQLState::MUTED: if (tr_signal[i] == 1) { - state = INCREASE; + state = SSQLState::INCREASE; count = ntup; } - out[2 * i + 0] = muted_gain * in[2 * i + 0]; - out[2 * i + 1] = muted_gain * in[2 * i + 1]; + out[2 * i + 0] = (float) (muted_gain * in[2 * i + 0]); + out[2 * i + 1] = (float) (muted_gain * in[2 * i + 1]); break; - case INCREASE: - out[2 * i + 0] = in[2 * i + 0] * cup[ntup - count]; - out[2 * i + 1] = in[2 * i + 1] * cup[ntup - count]; + case SSQLState::INCREASE: + out[2 * i + 0] = (float) (in[2 * i + 0] * cup[ntup - count]); + out[2 * i + 1] = (float) (in[2 * i + 1] * cup[ntup - count]); if (count-- == 0) - state = UNMUTED; + state = SSQLState::UNMUTED; break; - case UNMUTED: + case SSQLState::UNMUTED: if (tr_signal[i] == 0) { - state = DECREASE; + state = SSQLState::DECREASE; count = ntdown; } out[2 * i + 0] = in[2 * i + 0]; out[2 * i + 1] = in[2 * i + 1]; break; - case DECREASE: - out[2 * i + 0] = in[2 * i + 0] * cdown[ntdown - count]; - out[2 * i + 1] = in[2 * i + 1] * cdown[ntdown - count]; + case SSQLState::DECREASE: + out[2 * i + 0] = (float) (in[2 * i + 0] * cdown[ntdown - count]); + out[2 * i + 1] = (float) (in[2 * i + 1] * cdown[ntdown - count]); if (count-- == 0) - state = MUTED; + state = SSQLState::MUTED; break; } } diff --git a/wdsp/ssql.hpp b/wdsp/ssql.hpp index 04261304e..e5bc8590b 100644 --- a/wdsp/ssql.hpp +++ b/wdsp/ssql.hpp @@ -75,26 +75,33 @@ class DBQLP; class WDSP_API SSQL // Syllabic Squelch { public: + enum class SSQLState + { + MUTED, + INCREASE, + UNMUTED, + DECREASE + }; int run; // 0 if squelch system is OFF; 1 if it's ON int size; // size of input/output buffers float* in; // squelch input signal buffer float* out; // squelch output signal buffer int rate; // sample rate - int state; // state machine control + SSQLState state; // state machine control int count; // count variable for raised cosine transitions double tup; // time for turn-on transition double tdown; // time for turn-off transition int ntup; // number of samples for turn-on transition int ntdown; // number of samples for turn-off transition - float* cup; // coefficients for up-slew - float* cdown; // coefficients for down-slew + std::vector cup; // coefficients for up-slew + std::vector cdown; // coefficients for down-slew double muted_gain; // audio gain while muted; 0.0 for complete silence - float* b1; // buffer to hold output of dc-block function - float* ibuff; // buffer containing only 'I' component - float* ftovbuff; // buffer containing output of f to v converter - float* lpbuff; // buffer containing output of low-pass filter - int* wdbuff; // buffer containing output of window detector + std::vector b1; // buffer to hold output of dc-block function + std::vector ibuff; // buffer containing only 'I' component + std::vector ftovbuff; // buffer containing output of f to v converter + std::vector lpbuff; // buffer containing output of low-pass filter + std::vector wdbuff; // buffer containing output of window detector CBL *dcbl; // pointer to DC Blocker data structure FTOV *cvtr; // pointer to F to V Converter data structure DBQLP *filt; // pointer to Bi-Quad Low-Pass Filter data structure @@ -114,7 +121,7 @@ public: double tr_voltage; // trigger voltage double mute_mult; // multiplier for successive voltage calcs when muted double unmute_mult; // multiplier for successive voltage calcs when unmuted - int* tr_signal; // trigger signal, 0 or 1 + std::vector tr_signal; // trigger signal, 0 or 1 SSQL( int run, diff --git a/wdsp/wcpAGC.cpp b/wdsp/wcpAGC.cpp index 455bc856d..ae7aac1f5 100644 --- a/wdsp/wcpAGC.cpp +++ b/wdsp/wcpAGC.cpp @@ -146,7 +146,8 @@ void WCPAGC::flush() void WCPAGC::execute() { - int i, j, k; + int i; + int k; double mult; if (run) @@ -155,8 +156,8 @@ void WCPAGC::execute() { for (i = 0; i < io_buffsize; i++) { - out[2 * i + 0] = fixed_gain * in[2 * i + 0]; - out[2 * i + 1] = fixed_gain * in[2 * i + 1]; + out[2 * i + 0] = (float) (fixed_gain * in[2 * i + 0]); + out[2 * i + 1] = (float) (fixed_gain * in[2 * i + 1]); } return; @@ -173,8 +174,10 @@ void WCPAGC::execute() out_sample[0] = ring[2 * out_index + 0]; out_sample[1] = ring[2 * out_index + 1]; abs_out_sample = abs_ring[out_index]; - double xr = ring[2 * in_index + 0] = in[2 * i + 0]; - double xi = ring[2 * in_index + 1] = in[2 * i + 1]; + ring[2 * in_index + 0] = in[2 * i + 0]; + ring[2 * in_index + 1] = in[2 * i + 1]; + double xr = ring[2 * in_index + 0]; + double xi = ring[2 * in_index + 1]; if (pmode == 0) abs_ring[in_index] = std::max(fabs(xr), fabs(xi)); @@ -189,7 +192,7 @@ void WCPAGC::execute() ring_max = 0.0; k = out_index; - for (j = 0; j < attack_buffsize; j++) + for (int j = 0; j < attack_buffsize; j++) { if (++k == ring_buffsize) k = 0; @@ -323,6 +326,8 @@ void WCPAGC::execute() } break; } + default: + break; } if (volts < min_volts) @@ -330,8 +335,8 @@ void WCPAGC::execute() gain = volts * inv_out_target; mult = (out_target - slope_constant * std::min (0.0, log10(inv_max_input * volts))) / volts; - out[2 * i + 0] = out_sample[0] * mult; - out[2 * i + 1] = out_sample[1] * mult; + out[2 * i + 0] = (float) (out_sample[0] * mult); + out[2 * i + 1] = (float) (out_sample[1] * mult); } } else if (out != in) @@ -406,7 +411,7 @@ void WCPAGC::setMode(int _mode) void WCPAGC::setFixed(double _fixed_agc) { - fixed_gain = pow (10.0, (double) _fixed_agc / 20.0); + fixed_gain = pow (10.0, _fixed_agc / 20.0); loadWcpAGC(); } @@ -428,7 +433,7 @@ void WCPAGC::setHang(int _hang) loadWcpAGC(); } -void WCPAGC::getHangLevel(double *hangLevel) +void WCPAGC::getHangLevel(double *hangLevel) const //for line on bandscope { *hangLevel = 20.0 * log10(hang_level / 0.637); @@ -437,7 +442,8 @@ void WCPAGC::getHangLevel(double *hangLevel) void WCPAGC::setHangLevel(double _hangLevel) //for line on bandscope { - double convert, tmp; + double convert; + double tmp; if (max_input > min_volts) { @@ -451,7 +457,7 @@ void WCPAGC::setHangLevel(double _hangLevel) loadWcpAGC(); } -void WCPAGC::getHangThreshold(int *hangthreshold) +void WCPAGC::getHangThreshold(int *hangthreshold) const //for slider in setup { *hangthreshold = (int) (100.0 * hang_thresh); @@ -464,7 +470,7 @@ void WCPAGC::setHangThreshold(int _hangthreshold) loadWcpAGC(); } -void WCPAGC::getTop(double *max_agc) +void WCPAGC::getTop(double *max_agc) const //for AGC Max Gain in setup { *max_agc = 20 * log10 (max_gain); @@ -473,7 +479,7 @@ void WCPAGC::getTop(double *max_agc) void WCPAGC::setTop(double _max_agc) //for AGC Max Gain in setup { - max_gain = pow (10.0, (double) _max_agc / 20.0); + max_gain = pow (10.0, _max_agc / 20.0); loadWcpAGC(); } @@ -489,9 +495,9 @@ void WCPAGC::setMaxInputLevel(double _level) loadWcpAGC(); } -void WCPAGC::setRun(int state) +void WCPAGC::setRun(int _state) { - run = state; + run = _state; } } // namespace WDSP diff --git a/wdsp/wcpAGC.hpp b/wdsp/wcpAGC.hpp index a52e9620d..c643062b5 100644 --- a/wdsp/wcpAGC.hpp +++ b/wdsp/wcpAGC.hpp @@ -145,11 +145,11 @@ public: void setAttack(int attack); void setDecay(int decay); void setHang(int hang); - void getHangLevel(double *hangLevel); + void getHangLevel(double *hangLevel) const; void setHangLevel(double hangLevel); - void getHangThreshold(int *hangthreshold); + void getHangThreshold(int *hangthreshold) const; void setHangThreshold(int hangthreshold); - void getTop(double *max_agc); + void getTop(double *max_agc) const; void setTop(double max_agc); void setSlope(int slope); void setMaxInputLevel(double level);