1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-23 10:05:46 -05:00

WDSP: NBP: use vectors instead of C arrays and disable copy constructor

This commit is contained in:
f4exb 2024-07-27 23:29:15 +02:00
parent 8a267240df
commit 86f27fc4d6
4 changed files with 53 additions and 66 deletions

View File

@ -44,20 +44,11 @@ NOTCHDB::NOTCHDB(int _master_run, int _maxnotches)
master_run = _master_run; master_run = _master_run;
maxnotches = _maxnotches; maxnotches = _maxnotches;
nn = 0; nn = 0;
fcenter = new double[maxnotches]; // (float *) malloc0 (maxnotches * sizeof (float)); fcenter.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float));
fwidth = new double[maxnotches]; // (float *) malloc0 (maxnotches * sizeof (float)); fwidth.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float));
nlow = new double[maxnotches]; // (float *) malloc0 (maxnotches * sizeof (float)); nlow.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float));
nhigh = new double[maxnotches]; // (float *) malloc0 (maxnotches * sizeof (float)); nhigh.resize(maxnotches); // (float *) malloc0 (maxnotches * sizeof (float));
active = new int[maxnotches]; // (int *) malloc0 (maxnotches * sizeof (int )); active.resize(maxnotches); // (int *) malloc0 (maxnotches * sizeof (int ));
}
NOTCHDB::~NOTCHDB()
{
delete[] (active);
delete[] (nhigh);
delete[] (nlow);
delete[] (fwidth);
delete[] (fcenter);
} }
int NOTCHDB::addNotch(int notch, double _fcenter, double _fwidth, int _active) int NOTCHDB::addNotch(int notch, double _fcenter, double _fwidth, int _active)
@ -198,17 +189,17 @@ double NBP::min_notch_width()
int NBP::make_nbp ( int NBP::make_nbp (
int nn, int nn,
int* active, std::vector<int>& active,
double* center, std::vector<double>& center,
double* width, std::vector<double>& width,
double* nlow, std::vector<double>& nlow,
double* nhigh, std::vector<double>& nhigh,
double minwidth, double minwidth,
int autoincr, int autoincr,
double flow, double flow,
double fhigh, double fhigh,
double* bplow, std::vector<double>& bplow,
double* bphigh, std::vector<double>& bphigh,
int* havnotch int* havnotch
) )
{ {
@ -328,8 +319,15 @@ void NBP::calc_lightweight()
bplow[i] -= offset; bplow[i] -= offset;
bphigh[i] -= offset; bphigh[i] -= offset;
} }
impulse = fir_mbandpass (nc, numpb, bplow, bphigh, impulse = fir_mbandpass (
rate, gain / (float)(2 * size), wintype); nc,
numpb,
bplow.data(),
bphigh.data(),
rate,
gain / (float)(2 * size),
wintype
);
FIRCORE::setImpulse_fircore (fircore, impulse, 1); FIRCORE::setImpulse_fircore (fircore, impulse, 1);
// print_impulse ("nbp.txt", size + 1, impulse, 1, 0); // print_impulse ("nbp.txt", size + 1, impulse, 1, 0);
delete[](impulse); delete[](impulse);
@ -375,8 +373,8 @@ void NBP::calc_impulse ()
impulse = fir_mbandpass ( impulse = fir_mbandpass (
nc, nc,
numpb, numpb,
bplow, bplow.data(),
bphigh, bphigh.data(),
rate, rate,
gain / (float)(2 * size), gain / (float)(2 * size),
wintype wintype
@ -431,8 +429,8 @@ NBP::NBP(
maxpb(_maxpb), maxpb(_maxpb),
notchdb(_notchdb) notchdb(_notchdb)
{ {
bplow = new double[maxpb]; // (float *) malloc0 (maxpb * sizeof (float)); bplow.resize(maxpb); // (float *) malloc0 (maxpb * sizeof (float));
bphigh = new double[maxpb]; // (float *) malloc0 (maxpb * sizeof (float)); bphigh.resize(maxpb); // (float *) malloc0 (maxpb * sizeof (float));
calc_impulse (); calc_impulse ();
fircore = FIRCORE::create_fircore (size, in, out, nc, mp, impulse); fircore = FIRCORE::create_fircore (size, in, out, nc, mp, impulse);
// print_impulse ("nbp.txt", size + 1, impulse, 1, 0); // print_impulse ("nbp.txt", size + 1, impulse, 1, 0);
@ -442,8 +440,6 @@ NBP::NBP(
NBP::~NBP() NBP::~NBP()
{ {
FIRCORE::destroy_fircore (fircore); FIRCORE::destroy_fircore (fircore);
delete[] (bphigh);
delete[] (bplow);
} }
void NBP::flush() void NBP::flush()

View File

@ -28,6 +28,8 @@ warren@wpratt.com
#ifndef wdsp_nbp_h #ifndef wdsp_nbp_h
#define wdsp_nbp_h #define wdsp_nbp_h
#include <vector>
#include "export.h" #include "export.h"
namespace WDSP { namespace WDSP {
@ -41,15 +43,16 @@ public:
double tunefreq; double tunefreq;
double shift; double shift;
int nn; int nn;
int* active; std::vector<int> active;
double* fcenter; std::vector<double> fcenter;
double* fwidth; std::vector<double> fwidth;
double* nlow; std::vector<double> nlow;
double* nhigh; std::vector<double> nhigh;
int maxnotches; int maxnotches;
NOTCHDB(int master_run, int maxnotches); NOTCHDB(int master_run, int maxnotches);
~NOTCHDB(); NOTCHDB(const NOTCHDB&) = delete;
~NOTCHDB() = default;
int addNotch (int notch, double fcenter, double fwidth, int active); int addNotch (int notch, double fcenter, double fwidth, int active);
int getNotch (int notch, double* fcenter, double* fwidth, int* active); int getNotch (int notch, double* fcenter, double* fwidth, int* active);
@ -79,8 +82,8 @@ public:
float* impulse; // filter impulse response float* impulse; // filter impulse response
int maxpb; // maximum number of passbands int maxpb; // maximum number of passbands
NOTCHDB* notchdb; // ptr to addr of notch-database data structure NOTCHDB* notchdb; // ptr to addr of notch-database data structure
double* bplow; // array of passband lows std::vector<double> bplow; // array of passband lows
double* bphigh; // array of passband highs std::vector<double> bphigh; // array of passband highs
int numpb; // number of passbands int numpb; // number of passbands
FIRCORE *fircore; FIRCORE *fircore;
int havnotch; int havnotch;
@ -104,6 +107,7 @@ public:
int maxpb, int maxpb,
NOTCHDB* notchdb NOTCHDB* notchdb
); );
NBP(const NBP&) = delete;
~NBP(); ~NBP();
void flush(); void flush();
@ -127,17 +131,17 @@ private:
double min_notch_width (); double min_notch_width ();
static int make_nbp ( static int make_nbp (
int nn, int nn,
int* active, std::vector<int>& active,
double* center, std::vector<double>& center,
double* width, std::vector<double>& width,
double* nlow, std::vector<double>& nlow,
double* nhigh, std::vector<double>& nhigh,
double minwidth, double minwidth,
int autoincr, int autoincr,
double flow, double flow,
double fhigh, double fhigh,
double* bplow, std::vector<double>& bplow,
double* bphigh, std::vector<double>& bphigh,
int* havnotch int* havnotch
); );
}; };

View File

@ -84,7 +84,7 @@ void RESAMPLE::calc()
ncoef = (ncoef / L + 1) * L; ncoef = (ncoef / L + 1) * L;
cpp = ncoef / L; cpp = ncoef / L;
h = new double[ncoef]; // (float *)malloc0(ncoef * sizeof(float)); h.resize(ncoef); // (float *)malloc0(ncoef * sizeof(float));
impulse = FIR::fir_bandpass(ncoef, fc_norm_low, fc_norm_high, 1.0, 1, 0, gain * (double)L); impulse = FIR::fir_bandpass(ncoef, fc_norm_low, fc_norm_high, 1.0, 1, 0, gain * (double)L);
i = 0; i = 0;
@ -95,19 +95,13 @@ void RESAMPLE::calc()
} }
ringsize = cpp; ringsize = cpp;
ring = new double[ringsize]; // (float *)malloc0(ringsize * sizeof(complex)); ring.resize(ringsize); // (float *)malloc0(ringsize * sizeof(complex));
idx_in = ringsize - 1; idx_in = ringsize - 1;
phnum = 0; phnum = 0;
delete[] (impulse); delete[] (impulse);
} }
void RESAMPLE::decalc()
{
delete[] ring;
delete[] h;
}
RESAMPLE::RESAMPLE ( RESAMPLE::RESAMPLE (
int _run, int _run,
int _size, int _size,
@ -133,15 +127,10 @@ RESAMPLE::RESAMPLE (
calc(); calc();
} }
RESAMPLE::~RESAMPLE()
{
decalc();
}
void RESAMPLE::flush() void RESAMPLE::flush()
{ {
std::fill(ring, ring + 2 * ringsize, 0); std::fill(ring.begin(), ring.end(), 0);
idx_in = ringsize - 1; idx_in = ringsize - 1;
phnum = 0; phnum = 0;
} }
@ -210,14 +199,12 @@ void RESAMPLE::setSize(int _size)
void RESAMPLE::setInRate(int _rate) void RESAMPLE::setInRate(int _rate)
{ {
decalc();
in_rate = _rate; in_rate = _rate;
calc(); calc();
} }
void RESAMPLE::setOutRate(int _rate) void RESAMPLE::setOutRate(int _rate)
{ {
decalc();
out_rate = _rate; out_rate = _rate;
calc(); calc();
} }
@ -226,7 +213,6 @@ void RESAMPLE::setFCLow(double _fc_low)
{ {
if (fc_low != _fc_low) if (fc_low != _fc_low)
{ {
decalc();
fc_low = _fc_low; fc_low = _fc_low;
calc(); calc();
} }
@ -236,7 +222,6 @@ void RESAMPLE::setBandwidth(double _fc_low, double _fc_high)
{ {
if (fc_low != _fc_low || _fc_high != fcin) if (fc_low != _fc_low || _fc_high != fcin)
{ {
decalc();
fc_low = _fc_low; fc_low = _fc_low;
fcin = _fc_high; fcin = _fc_high;
calc(); calc();

View File

@ -34,6 +34,8 @@ warren@wpratt.com
#ifndef wdsp_resample_h #ifndef wdsp_resample_h
#define wdsp_resample_h #define wdsp_resample_h
#include <vector>
#include "export.h" #include "export.h"
namespace WDSP { namespace WDSP {
@ -56,9 +58,9 @@ public:
int ncoef; // number of coefficients int ncoef; // number of coefficients
int L; // interpolation factor int L; // interpolation factor
int M; // decimation factor int M; // decimation factor
double* h; // coefficients std::vector<double> h; // coefficients
int ringsize; // number of complex pairs the ring buffer holds int ringsize; // number of complex pairs the ring buffer holds
double* ring; // ring buffer std::vector<double> ring; // ring buffer
int cpp; // coefficients of the phase int cpp; // coefficients of the phase
int phnum; // phase number int phnum; // phase number
@ -73,7 +75,8 @@ public:
int ncoef, int ncoef,
double gain double gain
); );
~RESAMPLE(); RESAMPLE(const RESAMPLE&) = delete;
~RESAMPLE() = default;
void flush(); void flush();
int execute(); int execute();
@ -90,7 +93,6 @@ public:
private: private:
void calc(); void calc();
void decalc();
}; };
} // namespace WDSP } // namespace WDSP