summaryrefslogtreecommitdiff
path: root/gr-digital/lib/interpolating_resampler.cc
diff options
context:
space:
mode:
authorMarcus Müller <mmueller@gnuradio.org>2019-08-07 21:45:12 +0200
committerMarcus Müller <marcus@hostalia.de>2019-08-09 23:04:28 +0200
commitf7bbf2c1d8d780294f3e016aff239ca35eb6516e (patch)
treee09ab6112e02b2215b2d59ac24d3d6ea2edac745 /gr-digital/lib/interpolating_resampler.cc
parent78431dc6941e3acc67c858277dfe4a0ed583643c (diff)
Tree: clang-format without the include sorting
Diffstat (limited to 'gr-digital/lib/interpolating_resampler.cc')
-rw-r--r--gr-digital/lib/interpolating_resampler.cc1231
1 files changed, 580 insertions, 651 deletions
diff --git a/gr-digital/lib/interpolating_resampler.cc b/gr-digital/lib/interpolating_resampler.cc
index 7ff1e7e753..ddf34317b0 100644
--- a/gr-digital/lib/interpolating_resampler.cc
+++ b/gr-digital/lib/interpolating_resampler.cc
@@ -30,753 +30,682 @@
#include <deque>
namespace gr {
- namespace digital {
-
- interpolating_resampler::interpolating_resampler(enum ir_type type,
- bool derivative)
- : d_type(type),
- d_derivative(derivative),
- d_phase(0.0f),
- d_phase_wrapped(0.0f),
- d_phase_n(0),
- d_prev_phase(0.0f),
- d_prev_phase_wrapped(0.0f),
- d_prev_phase_n(0)
- {
- switch (d_type) {
- case IR_MMSE_8TAP:
- break;
- case IR_PFB_NO_MF:
- break;
- case IR_PFB_MF:
- break;
- case IR_NONE:
- default:
- throw std::invalid_argument(
- "interpolating_resampler: invalid interpolating resampler type.");
- break;
- }
-
- sync_reset(0.0f);
- }
-
- void
- interpolating_resampler::next_phase(float increment,
- float &phase,
- int &phase_n,
- float &phase_wrapped)
- {
- float n;
-
- phase = d_phase_wrapped + increment;
- n = floorf(phase);
- phase_wrapped = phase - n;
- phase_n = static_cast<int>(n);
- }
-
- void
- interpolating_resampler::advance_phase(float increment)
- {
- d_prev_phase = d_phase;
- d_prev_phase_wrapped = d_phase_wrapped;
- d_prev_phase_n = d_phase_n;
-
- next_phase(increment, d_phase, d_phase_n, d_phase_wrapped);
- }
-
- void
- interpolating_resampler::revert_phase()
- {
- d_phase = d_prev_phase;
- d_phase_wrapped = d_prev_phase_wrapped;
- d_phase_n = d_prev_phase_n;
- }
-
- void
- interpolating_resampler::sync_reset(float phase)
- {
- float n;
-
- d_phase = phase;
- n = floorf(d_phase);
- d_phase_wrapped = d_phase - n;
- d_phase_n = static_cast<int>(n);
-
- d_prev_phase = d_phase;
- d_prev_phase_wrapped = d_phase_wrapped;
- d_prev_phase_n = d_phase_n;
- }
-
- /*************************************************************************/
-
- interpolating_resampler_ccf *
- interpolating_resampler_ccf::make(enum ir_type type,
- bool derivative,
- int nfilts,
- const std::vector<float> &taps)
- {
- interpolating_resampler_ccf *ret = NULL;
- switch (type) {
- case IR_MMSE_8TAP:
- ret = new interp_resampler_mmse_8tap_cc(derivative);
- break;
- case IR_PFB_NO_MF:
- ret = new interp_resampler_pfb_no_mf_cc(derivative, nfilts);
- break;
- case IR_PFB_MF:
- ret = new interp_resampler_pfb_mf_ccf(taps, nfilts, derivative);
- break;
- case IR_NONE:
- default:
- throw std::invalid_argument("interpolating_resampler_ccf: invalid "
- "interpolating resampler type.");
- break;
- }
- return ret;
- }
-
- /*************************************************************************/
-
- interpolating_resampler_fff *
- interpolating_resampler_fff::make(enum ir_type type,
- bool derivative,
- int nfilts,
- const std::vector<float> &taps)
- {
- interpolating_resampler_fff *ret = NULL;
- switch (type) {
- case IR_MMSE_8TAP:
- ret = new interp_resampler_mmse_8tap_ff(derivative);
- break;
- case IR_PFB_NO_MF:
- ret = new interp_resampler_pfb_no_mf_ff(derivative, nfilts);
- break;
- case IR_PFB_MF:
- ret = new interp_resampler_pfb_mf_fff(taps, nfilts, derivative);
- break;
- case IR_NONE:
- default:
- throw std::invalid_argument("interpolating_resampler_fff: invalid "
- "interpolating resampler type.");
- break;
- }
- return ret;
- }
-
- /*************************************************************************/
-
- interp_resampler_mmse_8tap_cc::interp_resampler_mmse_8tap_cc(
- bool derivative)
+namespace digital {
+
+interpolating_resampler::interpolating_resampler(enum ir_type type, bool derivative)
+ : d_type(type),
+ d_derivative(derivative),
+ d_phase(0.0f),
+ d_phase_wrapped(0.0f),
+ d_phase_n(0),
+ d_prev_phase(0.0f),
+ d_prev_phase_wrapped(0.0f),
+ d_prev_phase_n(0)
+{
+ switch (d_type) {
+ case IR_MMSE_8TAP:
+ break;
+ case IR_PFB_NO_MF:
+ break;
+ case IR_PFB_MF:
+ break;
+ case IR_NONE:
+ default:
+ throw std::invalid_argument(
+ "interpolating_resampler: invalid interpolating resampler type.");
+ break;
+ }
+
+ sync_reset(0.0f);
+}
+
+void interpolating_resampler::next_phase(float increment,
+ float& phase,
+ int& phase_n,
+ float& phase_wrapped)
+{
+ float n;
+
+ phase = d_phase_wrapped + increment;
+ n = floorf(phase);
+ phase_wrapped = phase - n;
+ phase_n = static_cast<int>(n);
+}
+
+void interpolating_resampler::advance_phase(float increment)
+{
+ d_prev_phase = d_phase;
+ d_prev_phase_wrapped = d_phase_wrapped;
+ d_prev_phase_n = d_phase_n;
+
+ next_phase(increment, d_phase, d_phase_n, d_phase_wrapped);
+}
+
+void interpolating_resampler::revert_phase()
+{
+ d_phase = d_prev_phase;
+ d_phase_wrapped = d_prev_phase_wrapped;
+ d_phase_n = d_prev_phase_n;
+}
+
+void interpolating_resampler::sync_reset(float phase)
+{
+ float n;
+
+ d_phase = phase;
+ n = floorf(d_phase);
+ d_phase_wrapped = d_phase - n;
+ d_phase_n = static_cast<int>(n);
+
+ d_prev_phase = d_phase;
+ d_prev_phase_wrapped = d_phase_wrapped;
+ d_prev_phase_n = d_phase_n;
+}
+
+/*************************************************************************/
+
+interpolating_resampler_ccf* interpolating_resampler_ccf::make(
+ enum ir_type type, bool derivative, int nfilts, const std::vector<float>& taps)
+{
+ interpolating_resampler_ccf* ret = NULL;
+ switch (type) {
+ case IR_MMSE_8TAP:
+ ret = new interp_resampler_mmse_8tap_cc(derivative);
+ break;
+ case IR_PFB_NO_MF:
+ ret = new interp_resampler_pfb_no_mf_cc(derivative, nfilts);
+ break;
+ case IR_PFB_MF:
+ ret = new interp_resampler_pfb_mf_ccf(taps, nfilts, derivative);
+ break;
+ case IR_NONE:
+ default:
+ throw std::invalid_argument("interpolating_resampler_ccf: invalid "
+ "interpolating resampler type.");
+ break;
+ }
+ return ret;
+}
+
+/*************************************************************************/
+
+interpolating_resampler_fff* interpolating_resampler_fff::make(
+ enum ir_type type, bool derivative, int nfilts, const std::vector<float>& taps)
+{
+ interpolating_resampler_fff* ret = NULL;
+ switch (type) {
+ case IR_MMSE_8TAP:
+ ret = new interp_resampler_mmse_8tap_ff(derivative);
+ break;
+ case IR_PFB_NO_MF:
+ ret = new interp_resampler_pfb_no_mf_ff(derivative, nfilts);
+ break;
+ case IR_PFB_MF:
+ ret = new interp_resampler_pfb_mf_fff(taps, nfilts, derivative);
+ break;
+ case IR_NONE:
+ default:
+ throw std::invalid_argument("interpolating_resampler_fff: invalid "
+ "interpolating resampler type.");
+ break;
+ }
+ return ret;
+}
+
+/*************************************************************************/
+
+interp_resampler_mmse_8tap_cc::interp_resampler_mmse_8tap_cc(bool derivative)
: interpolating_resampler_ccf(IR_MMSE_8TAP, derivative),
d_interp(NULL),
d_interp_diff(NULL)
- {
- d_interp = new filter::mmse_fir_interpolator_cc();
- if (d_interp == NULL)
- throw std::runtime_error("unable to create mmse_fir_interpolator_cc");
-
- if (d_derivative) {
- d_interp_diff = new filter::mmse_interp_differentiator_cc();
- if (d_interp_diff == NULL)
- throw std::runtime_error("unable to create "
- "mmse_interp_differentiator_cc");
- }
- }
-
- interp_resampler_mmse_8tap_cc::~interp_resampler_mmse_8tap_cc()
- {
- delete d_interp;
- if (d_derivative)
- delete d_interp_diff;
- }
-
- gr_complex
- interp_resampler_mmse_8tap_cc::interpolate(const gr_complex input[],
- float mu) const
- {
- return d_interp->interpolate(input, mu);
- }
-
- gr_complex
- interp_resampler_mmse_8tap_cc::differentiate(const gr_complex input[],
- float mu) const
- {
- return d_interp_diff->differentiate(input, mu);
- }
-
- unsigned int
- interp_resampler_mmse_8tap_cc::ntaps() const
- {
- return d_interp->ntaps();
- }
-
- /*************************************************************************/
-
- interp_resampler_mmse_8tap_ff::interp_resampler_mmse_8tap_ff(
- bool derivative)
+{
+ d_interp = new filter::mmse_fir_interpolator_cc();
+ if (d_interp == NULL)
+ throw std::runtime_error("unable to create mmse_fir_interpolator_cc");
+
+ if (d_derivative) {
+ d_interp_diff = new filter::mmse_interp_differentiator_cc();
+ if (d_interp_diff == NULL)
+ throw std::runtime_error("unable to create "
+ "mmse_interp_differentiator_cc");
+ }
+}
+
+interp_resampler_mmse_8tap_cc::~interp_resampler_mmse_8tap_cc()
+{
+ delete d_interp;
+ if (d_derivative)
+ delete d_interp_diff;
+}
+
+gr_complex interp_resampler_mmse_8tap_cc::interpolate(const gr_complex input[],
+ float mu) const
+{
+ return d_interp->interpolate(input, mu);
+}
+
+gr_complex interp_resampler_mmse_8tap_cc::differentiate(const gr_complex input[],
+ float mu) const
+{
+ return d_interp_diff->differentiate(input, mu);
+}
+
+unsigned int interp_resampler_mmse_8tap_cc::ntaps() const { return d_interp->ntaps(); }
+
+/*************************************************************************/
+
+interp_resampler_mmse_8tap_ff::interp_resampler_mmse_8tap_ff(bool derivative)
: interpolating_resampler_fff(IR_MMSE_8TAP, derivative),
d_interp(NULL),
d_interp_diff(NULL)
- {
- d_interp = new filter::mmse_fir_interpolator_ff();
- if (d_interp == NULL)
- throw std::runtime_error("unable to create mmse_fir_interpolator_ff");
+{
+ d_interp = new filter::mmse_fir_interpolator_ff();
+ if (d_interp == NULL)
+ throw std::runtime_error("unable to create mmse_fir_interpolator_ff");
- if (d_derivative) {
- d_interp_diff = new filter::mmse_interp_differentiator_ff();
- if (d_interp_diff == NULL)
- throw std::runtime_error("unable to create "
- "mmse_interp_differentiator_ff");
- }
+ if (d_derivative) {
+ d_interp_diff = new filter::mmse_interp_differentiator_ff();
+ if (d_interp_diff == NULL)
+ throw std::runtime_error("unable to create "
+ "mmse_interp_differentiator_ff");
}
+}
- interp_resampler_mmse_8tap_ff::~interp_resampler_mmse_8tap_ff()
- {
- delete d_interp;
- if (d_derivative)
- delete d_interp_diff;
- }
+interp_resampler_mmse_8tap_ff::~interp_resampler_mmse_8tap_ff()
+{
+ delete d_interp;
+ if (d_derivative)
+ delete d_interp_diff;
+}
- float
- interp_resampler_mmse_8tap_ff::interpolate(const float input[],
- float mu) const
- {
- return d_interp->interpolate(input, mu);
- }
+float interp_resampler_mmse_8tap_ff::interpolate(const float input[], float mu) const
+{
+ return d_interp->interpolate(input, mu);
+}
- float
- interp_resampler_mmse_8tap_ff::differentiate(const float input[],
- float mu) const
- {
- return d_interp_diff->differentiate(input, mu);
- }
+float interp_resampler_mmse_8tap_ff::differentiate(const float input[], float mu) const
+{
+ return d_interp_diff->differentiate(input, mu);
+}
- unsigned int
- interp_resampler_mmse_8tap_ff::ntaps() const
- {
- return d_interp->ntaps();
- }
+unsigned int interp_resampler_mmse_8tap_ff::ntaps() const { return d_interp->ntaps(); }
- /*************************************************************************/
+/*************************************************************************/
#include "gnuradio/filter/interpolator_taps.h"
#include "gnuradio/filter/interp_differentiator_taps.h"
- interp_resampler_pfb_no_mf_cc::interp_resampler_pfb_no_mf_cc(
- bool derivative,
- int nfilts)
+interp_resampler_pfb_no_mf_cc::interp_resampler_pfb_no_mf_cc(bool derivative, int nfilts)
: interpolating_resampler_ccf(IR_PFB_NO_MF, derivative),
d_nfilters(0),
d_filters(),
d_diff_filters()
- {
- if (nfilts <= 1)
- throw std::invalid_argument("interpolating_resampler_pfb_no_mf_cc: "
- "number of polyphase filter arms "
- "must be greater than 1");
-
- // Round up the number of filter arms to the current or next power of 2
- d_nfilters =
- 1 << (static_cast<int>(log2f(static_cast<float>(nfilts-1))) + 1);
-
- // N.B. We assume in this class: NSTEPS == DNSTEPS and NTAPS == DNTAPS
-
- // Limit to the maximum number of precomputed MMSE tap sets
- if (d_nfilters <= 0 || d_nfilters > NSTEPS)
- d_nfilters = NSTEPS;
-
- // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
- // the MMSE interpolating filter and MMSE interpolating differentiator
- // taps rows.
- // N.B. We create an extra final row for an offset of 1.0, because it's
- // easier than dealing with wrap around from 0.99... to 0.0 shifted
- // by 1 tap.
- d_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
- d_diff_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
-
- std::vector<float> t(NTAPS, 0);
- int incr = NSTEPS/d_nfilters;
- int src, dst;
- for (src = 0, dst = 0; src <= NSTEPS; src += incr, dst++) {
-
- t.assign(&taps[src][0], &taps[src][NTAPS]);
- d_filters[dst] = new filter::kernel::fir_filter_ccf(1, t);
- if (d_filters[dst] == NULL)
- throw std::runtime_error("unable to create fir_filter_ccf");
+{
+ if (nfilts <= 1)
+ throw std::invalid_argument("interpolating_resampler_pfb_no_mf_cc: "
+ "number of polyphase filter arms "
+ "must be greater than 1");
+
+ // Round up the number of filter arms to the current or next power of 2
+ d_nfilters = 1 << (static_cast<int>(log2f(static_cast<float>(nfilts - 1))) + 1);
+
+ // N.B. We assume in this class: NSTEPS == DNSTEPS and NTAPS == DNTAPS
+
+ // Limit to the maximum number of precomputed MMSE tap sets
+ if (d_nfilters <= 0 || d_nfilters > NSTEPS)
+ d_nfilters = NSTEPS;
+
+ // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
+ // the MMSE interpolating filter and MMSE interpolating differentiator
+ // taps rows.
+ // N.B. We create an extra final row for an offset of 1.0, because it's
+ // easier than dealing with wrap around from 0.99... to 0.0 shifted
+ // by 1 tap.
+ d_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
+ d_diff_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
+
+ std::vector<float> t(NTAPS, 0);
+ int incr = NSTEPS / d_nfilters;
+ int src, dst;
+ for (src = 0, dst = 0; src <= NSTEPS; src += incr, dst++) {
+
+ t.assign(&taps[src][0], &taps[src][NTAPS]);
+ d_filters[dst] = new filter::kernel::fir_filter_ccf(1, t);
+ if (d_filters[dst] == NULL)
+ throw std::runtime_error("unable to create fir_filter_ccf");
- if (d_derivative) {
- t.assign(&Dtaps[src][0], &Dtaps[src][DNTAPS]);
- d_diff_filters[dst] = new filter::kernel::fir_filter_ccf(1, t);
- if (d_diff_filters[dst] == NULL)
- throw std::runtime_error("unable to create fir_filter_ccf");
- }
+ if (d_derivative) {
+ t.assign(&Dtaps[src][0], &Dtaps[src][DNTAPS]);
+ d_diff_filters[dst] = new filter::kernel::fir_filter_ccf(1, t);
+ if (d_diff_filters[dst] == NULL)
+ throw std::runtime_error("unable to create fir_filter_ccf");
}
}
+}
- interp_resampler_pfb_no_mf_cc::~interp_resampler_pfb_no_mf_cc()
- {
- for (int i = 0; i <= d_nfilters; i++) {
- delete d_filters[i];
- if (d_derivative)
- delete d_diff_filters[i];
- }
+interp_resampler_pfb_no_mf_cc::~interp_resampler_pfb_no_mf_cc()
+{
+ for (int i = 0; i <= d_nfilters; i++) {
+ delete d_filters[i];
+ if (d_derivative)
+ delete d_diff_filters[i];
}
+}
- gr_complex
- interp_resampler_pfb_no_mf_cc::interpolate(const gr_complex input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+gr_complex interp_resampler_pfb_no_mf_cc::interpolate(const gr_complex input[],
+ float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_no_mf_cc: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_no_mf_cc: mu is not "
+ "in the range [0.0, 1.0]");
- return d_filters[arm]->filter(input);
- }
+ return d_filters[arm]->filter(input);
+}
- gr_complex
- interp_resampler_pfb_no_mf_cc::differentiate(const gr_complex input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+gr_complex interp_resampler_pfb_no_mf_cc::differentiate(const gr_complex input[],
+ float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_no_mf_cc: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_no_mf_cc: mu is not "
+ "in the range [0.0, 1.0]");
- return d_diff_filters[arm]->filter(input);
- }
+ return d_diff_filters[arm]->filter(input);
+}
- unsigned int
- interp_resampler_pfb_no_mf_cc::ntaps() const
- {
- return NTAPS;
- }
+unsigned int interp_resampler_pfb_no_mf_cc::ntaps() const { return NTAPS; }
- /*************************************************************************/
+/*************************************************************************/
- interp_resampler_pfb_no_mf_ff::interp_resampler_pfb_no_mf_ff(
- bool derivative,
- int nfilts)
+interp_resampler_pfb_no_mf_ff::interp_resampler_pfb_no_mf_ff(bool derivative, int nfilts)
: interpolating_resampler_fff(IR_PFB_NO_MF, derivative),
d_nfilters(0),
d_filters(),
d_diff_filters()
- {
- if (nfilts <= 1)
- throw std::invalid_argument("interpolating_resampler_pfb_no_mf_ff: "
- "number of polyphase filter arms "
- "must be greater than 1");
-
- // Round up the number of filter arms to the current or next power of 2
- d_nfilters =
- 1 << (static_cast<int>(log2f(static_cast<float>(nfilts-1))) + 1);
-
- // N.B. We assume in this class: NSTEPS == DNSTEPS and NTAPS == DNTAPS
-
- // Limit to the maximum number of precomputed MMSE tap sets
- if (d_nfilters <= 0 || d_nfilters > NSTEPS)
- d_nfilters = NSTEPS;
-
- // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
- // the MMSE interpolating filter and MMSE interpolating differentiator
- // taps rows.
- // N.B. We create an extra final row for an offset of 1.0, because it's
- // easier than dealing with wrap around from 0.99... to 0.0 shifted
- // by 1 tap.
- d_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
- d_diff_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
-
- std::vector<float> t(NTAPS, 0);
- int incr = NSTEPS/d_nfilters;
- int src, dst;
- for (src = 0, dst = 0; src <= NSTEPS; src += incr, dst++) {
-
- t.assign(&taps[src][0], &taps[src][NTAPS]);
- d_filters[dst] = new filter::kernel::fir_filter_fff(1, t);
- if (d_filters[dst] == NULL)
- throw std::runtime_error("unable to create fir_filter_fff");
+{
+ if (nfilts <= 1)
+ throw std::invalid_argument("interpolating_resampler_pfb_no_mf_ff: "
+ "number of polyphase filter arms "
+ "must be greater than 1");
+
+ // Round up the number of filter arms to the current or next power of 2
+ d_nfilters = 1 << (static_cast<int>(log2f(static_cast<float>(nfilts - 1))) + 1);
+
+ // N.B. We assume in this class: NSTEPS == DNSTEPS and NTAPS == DNTAPS
+
+ // Limit to the maximum number of precomputed MMSE tap sets
+ if (d_nfilters <= 0 || d_nfilters > NSTEPS)
+ d_nfilters = NSTEPS;
+
+ // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
+ // the MMSE interpolating filter and MMSE interpolating differentiator
+ // taps rows.
+ // N.B. We create an extra final row for an offset of 1.0, because it's
+ // easier than dealing with wrap around from 0.99... to 0.0 shifted
+ // by 1 tap.
+ d_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
+ d_diff_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
+
+ std::vector<float> t(NTAPS, 0);
+ int incr = NSTEPS / d_nfilters;
+ int src, dst;
+ for (src = 0, dst = 0; src <= NSTEPS; src += incr, dst++) {
+
+ t.assign(&taps[src][0], &taps[src][NTAPS]);
+ d_filters[dst] = new filter::kernel::fir_filter_fff(1, t);
+ if (d_filters[dst] == NULL)
+ throw std::runtime_error("unable to create fir_filter_fff");
- if (d_derivative) {
- t.assign(&Dtaps[src][0], &Dtaps[src][DNTAPS]);
- d_diff_filters[dst] = new filter::kernel::fir_filter_fff(1, t);
- if (d_diff_filters[dst] == NULL)
- throw std::runtime_error("unable to create fir_filter_fff");
- }
+ if (d_derivative) {
+ t.assign(&Dtaps[src][0], &Dtaps[src][DNTAPS]);
+ d_diff_filters[dst] = new filter::kernel::fir_filter_fff(1, t);
+ if (d_diff_filters[dst] == NULL)
+ throw std::runtime_error("unable to create fir_filter_fff");
}
}
+}
- interp_resampler_pfb_no_mf_ff::~interp_resampler_pfb_no_mf_ff()
- {
- for (int i = 0; i <= d_nfilters; i++) {
- delete d_filters[i];
- if (d_derivative)
- delete d_diff_filters[i];
- }
+interp_resampler_pfb_no_mf_ff::~interp_resampler_pfb_no_mf_ff()
+{
+ for (int i = 0; i <= d_nfilters; i++) {
+ delete d_filters[i];
+ if (d_derivative)
+ delete d_diff_filters[i];
}
+}
- float
- interp_resampler_pfb_no_mf_ff::interpolate(const float input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+float interp_resampler_pfb_no_mf_ff::interpolate(const float input[], float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_no_mf_ff: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_no_mf_ff: mu is not "
+ "in the range [0.0, 1.0]");
- return d_filters[arm]->filter(input);
- }
+ return d_filters[arm]->filter(input);
+}
- float
- interp_resampler_pfb_no_mf_ff::differentiate(const float input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+float interp_resampler_pfb_no_mf_ff::differentiate(const float input[], float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_no_mf_ff: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_no_mf_ff: mu is not "
+ "in the range [0.0, 1.0]");
- return d_diff_filters[arm]->filter(input);
- }
+ return d_diff_filters[arm]->filter(input);
+}
- unsigned int
- interp_resampler_pfb_no_mf_ff::ntaps() const
- {
- return NTAPS;
- }
+unsigned int interp_resampler_pfb_no_mf_ff::ntaps() const { return NTAPS; }
- /*************************************************************************/
+/*************************************************************************/
- interp_resampler_pfb_mf_ccf::interp_resampler_pfb_mf_ccf(
- const std::vector<float> &taps,
- int nfilts,
- bool derivative)
+interp_resampler_pfb_mf_ccf::interp_resampler_pfb_mf_ccf(const std::vector<float>& taps,
+ int nfilts,
+ bool derivative)
: interpolating_resampler_ccf(IR_PFB_MF, derivative),
d_nfilters(nfilts),
d_taps_per_filter(static_cast<unsigned int>(
- ceil( static_cast<double>(taps.size())
- / static_cast<double>(nfilts )))),
+ ceil(static_cast<double>(taps.size()) / static_cast<double>(nfilts)))),
d_filters(),
d_diff_filters(),
d_taps(),
d_diff_taps()
- {
- if (d_nfilters <= 1)
- throw std::invalid_argument("interpolating_resampler_pfb_mf_ccf: "
- "number of polyphase filter arms "
- "must be greater than 1");
- if (taps.size() < static_cast<unsigned int>(d_nfilters))
- throw std::invalid_argument("interpolating_resampler_pfb_mf_ccf: "
- "length of the prototype filter taps"
- " must be greater than or equal to "
- "the number of polyphase filter arms.");
-
- // Create a derivative filter from the provided taps
-
- // First create a truncated ideal differentiator filter
- int ideal_diff_filt_len = 3; // Must be odd; rest of init assumes odd.
- std::vector<float> ideal_diff_taps(ideal_diff_filt_len, 0.0f);
- int i, n;
- n = ideal_diff_taps.size()/2;
- for (i = -n; i < 0; i++) {
- ideal_diff_taps[i+n] = (-i & 1) == 1 ? -1.0f/i : 1.0f/i;
- ideal_diff_taps[n-i] = -ideal_diff_taps[i+n];
- }
- ideal_diff_taps[n] = 0.0f;
-
- // Perform linear convolution of prototype filter taps and the truncated
- // ideal differentiator taps to generate a derivative matched filter.
- // N.B. the truncated ideal differentiator taps must have an odd length
- int j, k, l, m;
- m = ideal_diff_taps.size();
- n = taps.size();
- l = m + n - 1; // length of convolution
- std::deque<float> diff_taps(l, 0.0f);
- for (i = 0; i < l; i++) {
- for (j = 0; j < m; j++) {
- k = i + j - (m - 1);
- if (k < 0 || k >= n)
- continue;
- diff_taps[i] += ideal_diff_taps[(m - 1) - j] * taps[k];
- }
- }
-
- // Trim the convolution so the prototype derivative filter is the same
- // length as the passed in prototype filter taps.
- n = ideal_diff_taps.size()/2;
- for (i = 0; i < n; i++) {
- diff_taps.pop_back();
- diff_taps.pop_front();
+{
+ if (d_nfilters <= 1)
+ throw std::invalid_argument("interpolating_resampler_pfb_mf_ccf: "
+ "number of polyphase filter arms "
+ "must be greater than 1");
+ if (taps.size() < static_cast<unsigned int>(d_nfilters))
+ throw std::invalid_argument("interpolating_resampler_pfb_mf_ccf: "
+ "length of the prototype filter taps"
+ " must be greater than or equal to "
+ "the number of polyphase filter arms.");
+
+ // Create a derivative filter from the provided taps
+
+ // First create a truncated ideal differentiator filter
+ int ideal_diff_filt_len = 3; // Must be odd; rest of init assumes odd.
+ std::vector<float> ideal_diff_taps(ideal_diff_filt_len, 0.0f);
+ int i, n;
+ n = ideal_diff_taps.size() / 2;
+ for (i = -n; i < 0; i++) {
+ ideal_diff_taps[i + n] = (-i & 1) == 1 ? -1.0f / i : 1.0f / i;
+ ideal_diff_taps[n - i] = -ideal_diff_taps[i + n];
+ }
+ ideal_diff_taps[n] = 0.0f;
+
+ // Perform linear convolution of prototype filter taps and the truncated
+ // ideal differentiator taps to generate a derivative matched filter.
+ // N.B. the truncated ideal differentiator taps must have an odd length
+ int j, k, l, m;
+ m = ideal_diff_taps.size();
+ n = taps.size();
+ l = m + n - 1; // length of convolution
+ std::deque<float> diff_taps(l, 0.0f);
+ for (i = 0; i < l; i++) {
+ for (j = 0; j < m; j++) {
+ k = i + j - (m - 1);
+ if (k < 0 || k >= n)
+ continue;
+ diff_taps[i] += ideal_diff_taps[(m - 1) - j] * taps[k];
}
+ }
- // Squash the differentiation noise spikes at the filter ends.
- diff_taps[0] = 0.0f;
- diff_taps[diff_taps.size()-1] = 0.0f;
-
- // Normalize the prototype derviative filter gain to the number of
- // filter arms
- n = diff_taps.size();
- float mag = 0.0f;
- for (i = 0; i < n; i++)
- mag += fabsf(diff_taps[i]);
- for (i = 0; i < n; i++) {
- diff_taps[i] *= d_nfilters/mag;
- if (d_derivative && std::isnan(diff_taps[i]))
- throw std::runtime_error("interpolating_resampler_pfb_mf_ccf: "
- "NaN error creating derivative filter."
- );
+ // Trim the convolution so the prototype derivative filter is the same
+ // length as the passed in prototype filter taps.
+ n = ideal_diff_taps.size() / 2;
+ for (i = 0; i < n; i++) {
+ diff_taps.pop_back();
+ diff_taps.pop_front();
+ }
+
+ // Squash the differentiation noise spikes at the filter ends.
+ diff_taps[0] = 0.0f;
+ diff_taps[diff_taps.size() - 1] = 0.0f;
+
+ // Normalize the prototype derviative filter gain to the number of
+ // filter arms
+ n = diff_taps.size();
+ float mag = 0.0f;
+ for (i = 0; i < n; i++)
+ mag += fabsf(diff_taps[i]);
+ for (i = 0; i < n; i++) {
+ diff_taps[i] *= d_nfilters / mag;
+ if (d_derivative && std::isnan(diff_taps[i]))
+ throw std::runtime_error("interpolating_resampler_pfb_mf_ccf: "
+ "NaN error creating derivative filter.");
+ }
+
+ // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
+ // the prototype matched filter.
+ // N.B. We create an extra final row for an offset of 1.0, because it's
+ // easier than dealing with wrap around from 0.99... to 0.0 shifted
+ // by 1 tap.
+ d_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
+ d_diff_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
+
+ m = taps.size();
+ n = diff_taps.size();
+ d_taps.resize(d_nfilters + 1);
+ d_diff_taps.resize(d_nfilters + 1);
+ signed int taps_per_filter = static_cast<signed int>(d_taps_per_filter);
+
+ for (i = 0; i <= d_nfilters; i++) {
+ d_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
+ for (j = 0; j < taps_per_filter; j++) {
+ k = i + j * d_nfilters;
+ if (k < m)
+ d_taps[i][j] = taps[k];
}
-
- // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
- // the prototype matched filter.
- // N.B. We create an extra final row for an offset of 1.0, because it's
- // easier than dealing with wrap around from 0.99... to 0.0 shifted
- // by 1 tap.
- d_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
- d_diff_filters = std::vector<filter::kernel::fir_filter_ccf*>(d_nfilters + 1);
-
- m = taps.size();
- n = diff_taps.size();
- d_taps.resize(d_nfilters+1);
- d_diff_taps.resize(d_nfilters+1);
- signed int taps_per_filter = static_cast<signed int>(d_taps_per_filter);
-
- for (i = 0; i <= d_nfilters; i++) {
- d_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
- for (j = 0; j < taps_per_filter; j++) {
- k = i+j*d_nfilters;
- if (k < m)
- d_taps[i][j] = taps[k];
- }
- d_filters[i] = new filter::kernel::fir_filter_ccf(1, d_taps[i]);
- if (d_filters[i] == NULL)
- throw std::runtime_error("unable to create fir_filter_ccf");
-
- if (!d_derivative)
- continue;
-
- d_diff_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
- for (j = 0; j < taps_per_filter; j++) {
- k = i+j*d_nfilters;
- if (k < n)
- d_diff_taps[i][j] = diff_taps[k];
- }
- d_diff_filters[i] = new filter::kernel::fir_filter_ccf(
- 1,
- d_diff_taps[i]);
- if (d_diff_filters[i] == NULL)
- throw std::runtime_error("unable to create fir_filter_ccf");
+ d_filters[i] = new filter::kernel::fir_filter_ccf(1, d_taps[i]);
+ if (d_filters[i] == NULL)
+ throw std::runtime_error("unable to create fir_filter_ccf");
+
+ if (!d_derivative)
+ continue;
+
+ d_diff_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
+ for (j = 0; j < taps_per_filter; j++) {
+ k = i + j * d_nfilters;
+ if (k < n)
+ d_diff_taps[i][j] = diff_taps[k];
}
+ d_diff_filters[i] = new filter::kernel::fir_filter_ccf(1, d_diff_taps[i]);
+ if (d_diff_filters[i] == NULL)
+ throw std::runtime_error("unable to create fir_filter_ccf");
}
+}
- interp_resampler_pfb_mf_ccf::~interp_resampler_pfb_mf_ccf()
- {
- for (int i = 0; i <= d_nfilters; i++) {
- delete d_filters[i];
- if (d_derivative)
- delete d_diff_filters[i];
- }
+interp_resampler_pfb_mf_ccf::~interp_resampler_pfb_mf_ccf()
+{
+ for (int i = 0; i <= d_nfilters; i++) {
+ delete d_filters[i];
+ if (d_derivative)
+ delete d_diff_filters[i];
}
+}
- gr_complex
- interp_resampler_pfb_mf_ccf::interpolate(const gr_complex input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+gr_complex interp_resampler_pfb_mf_ccf::interpolate(const gr_complex input[],
+ float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_mf_ccf: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_mf_ccf: mu is not "
+ "in the range [0.0, 1.0]");
- return d_filters[arm]->filter(input);
- }
+ return d_filters[arm]->filter(input);
+}
- gr_complex
- interp_resampler_pfb_mf_ccf::differentiate(const gr_complex input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+gr_complex interp_resampler_pfb_mf_ccf::differentiate(const gr_complex input[],
+ float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_mf_ccf: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_mf_ccf: mu is not "
+ "in the range [0.0, 1.0]");
- return d_diff_filters[arm]->filter(input);
- }
+ return d_diff_filters[arm]->filter(input);
+}
- unsigned int
- interp_resampler_pfb_mf_ccf::ntaps() const
- {
- return d_taps_per_filter;
- }
+unsigned int interp_resampler_pfb_mf_ccf::ntaps() const { return d_taps_per_filter; }
- /*************************************************************************/
+/*************************************************************************/
- interp_resampler_pfb_mf_fff::interp_resampler_pfb_mf_fff(
- const std::vector<float> &taps,
- int nfilts,
- bool derivative)
+interp_resampler_pfb_mf_fff::interp_resampler_pfb_mf_fff(const std::vector<float>& taps,
+ int nfilts,
+ bool derivative)
: interpolating_resampler_fff(IR_PFB_MF, derivative),
d_nfilters(nfilts),
d_taps_per_filter(static_cast<unsigned int>(
- ceil( static_cast<double>(taps.size())
- / static_cast<double>(nfilts )))),
+ ceil(static_cast<double>(taps.size()) / static_cast<double>(nfilts)))),
d_filters(),
d_diff_filters(),
d_taps(),
d_diff_taps()
- {
- if (d_nfilters <= 1)
- throw std::invalid_argument("interpolating_resampler_pfb_mf_fff: "
- "number of polyphase filter arms "
- "must be greater than 1");
- if (taps.size() < static_cast<unsigned int>(d_nfilters))
- throw std::invalid_argument("interpolating_resampler_pfb_mf_fff: "
- "length of the prototype filter taps"
- " must be greater than or equal to "
- "the number of polyphase filter arms.");
-
- // Create a derivative filter from the provided taps
-
- // First create a truncated ideal differentiator filter
- int ideal_diff_filt_len = 3; // Must be odd; rest of init assumes odd.
- std::vector<float> ideal_diff_taps(ideal_diff_filt_len, 0.0f);
- int i, n;
- n = ideal_diff_taps.size()/2;
- for (i = -n; i < 0; i++) {
- ideal_diff_taps[i+n] = (-i & 1) == 1 ? -1.0f/i : 1.0f/i;
- ideal_diff_taps[n-i] = -ideal_diff_taps[i+n];
- }
- ideal_diff_taps[n] = 0.0f;
-
- // Perform linear convolution of prototype filter taps and the truncated
- // ideal differentiator taps to generate a derivative matched filter.
- // N.B. the truncated ideal differentiator taps must have an odd length
- int j, k, l, m;
- m = ideal_diff_taps.size();
- n = taps.size();
- l = m + n - 1; // length of convolution
- std::deque<float> diff_taps(l, 0.0f);
- for (i = 0; i < l; i++) {
- for (j = 0; j < m; j++) {
- k = i + j - (m - 1);
- if (k < 0 || k >= n)
- continue;
- diff_taps[i] += ideal_diff_taps[(m - 1) - j] * taps[k];
- }
+{
+ if (d_nfilters <= 1)
+ throw std::invalid_argument("interpolating_resampler_pfb_mf_fff: "
+ "number of polyphase filter arms "
+ "must be greater than 1");
+ if (taps.size() < static_cast<unsigned int>(d_nfilters))
+ throw std::invalid_argument("interpolating_resampler_pfb_mf_fff: "
+ "length of the prototype filter taps"
+ " must be greater than or equal to "
+ "the number of polyphase filter arms.");
+
+ // Create a derivative filter from the provided taps
+
+ // First create a truncated ideal differentiator filter
+ int ideal_diff_filt_len = 3; // Must be odd; rest of init assumes odd.
+ std::vector<float> ideal_diff_taps(ideal_diff_filt_len, 0.0f);
+ int i, n;
+ n = ideal_diff_taps.size() / 2;
+ for (i = -n; i < 0; i++) {
+ ideal_diff_taps[i + n] = (-i & 1) == 1 ? -1.0f / i : 1.0f / i;
+ ideal_diff_taps[n - i] = -ideal_diff_taps[i + n];
+ }
+ ideal_diff_taps[n] = 0.0f;
+
+ // Perform linear convolution of prototype filter taps and the truncated
+ // ideal differentiator taps to generate a derivative matched filter.
+ // N.B. the truncated ideal differentiator taps must have an odd length
+ int j, k, l, m;
+ m = ideal_diff_taps.size();
+ n = taps.size();
+ l = m + n - 1; // length of convolution
+ std::deque<float> diff_taps(l, 0.0f);
+ for (i = 0; i < l; i++) {
+ for (j = 0; j < m; j++) {
+ k = i + j - (m - 1);
+ if (k < 0 || k >= n)
+ continue;
+ diff_taps[i] += ideal_diff_taps[(m - 1) - j] * taps[k];
}
+ }
- // Trim the convolution so the prototype derivative filter is the same
- // length as the passed in prototype filter taps.
- n = ideal_diff_taps.size()/2;
- for (i = 0; i < n; i++) {
- diff_taps.pop_back();
- diff_taps.pop_front();
+ // Trim the convolution so the prototype derivative filter is the same
+ // length as the passed in prototype filter taps.
+ n = ideal_diff_taps.size() / 2;
+ for (i = 0; i < n; i++) {
+ diff_taps.pop_back();
+ diff_taps.pop_front();
+ }
+
+ // Squash the differentiation noise spikes at the filter ends.
+ diff_taps[0] = 0.0f;
+ diff_taps[diff_taps.size() - 1] = 0.0f;
+
+ // Normalize the prototype derviative filter gain to the number of
+ // filter arms
+ n = diff_taps.size();
+ float mag = 0.0f;
+ for (i = 0; i < n; i++)
+ mag += fabsf(diff_taps[i]);
+ for (i = 0; i < n; i++) {
+ diff_taps[i] *= d_nfilters / mag;
+ if (d_derivative && std::isnan(diff_taps[i]))
+ throw std::runtime_error("interpolating_resampler_pfb_mf_fff: "
+ "NaN error creating derivative filter.");
+ }
+
+ // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
+ // the prototype matched filter.
+ // N.B. We create an extra final row for an offset of 1.0, because it's
+ // easier than dealing with wrap around from 0.99... to 0.0 shifted
+ // by 1 tap.
+ d_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
+ d_diff_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
+
+ m = taps.size();
+ n = diff_taps.size();
+ d_taps.resize(d_nfilters + 1);
+ d_diff_taps.resize(d_nfilters + 1);
+ signed int taps_per_filter = static_cast<signed int>(d_taps_per_filter);
+
+ for (i = 0; i <= d_nfilters; i++) {
+ d_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
+ for (j = 0; j < taps_per_filter; j++) {
+ k = i + j * d_nfilters;
+ if (k < m)
+ d_taps[i][j] = taps[k];
}
-
- // Squash the differentiation noise spikes at the filter ends.
- diff_taps[0] = 0.0f;
- diff_taps[diff_taps.size()-1] = 0.0f;
-
- // Normalize the prototype derviative filter gain to the number of
- // filter arms
- n = diff_taps.size();
- float mag = 0.0f;
- for (i = 0; i < n; i++)
- mag += fabsf(diff_taps[i]);
- for (i = 0; i < n; i++) {
- diff_taps[i] *= d_nfilters/mag;
- if (d_derivative && std::isnan(diff_taps[i]))
- throw std::runtime_error("interpolating_resampler_pfb_mf_fff: "
- "NaN error creating derivative filter."
- );
- }
-
- // Create our polyphase filter arms for the steps from 0.0 to 1.0 from
- // the prototype matched filter.
- // N.B. We create an extra final row for an offset of 1.0, because it's
- // easier than dealing with wrap around from 0.99... to 0.0 shifted
- // by 1 tap.
- d_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
- d_diff_filters = std::vector<filter::kernel::fir_filter_fff*>(d_nfilters + 1);
-
- m = taps.size();
- n = diff_taps.size();
- d_taps.resize(d_nfilters+1);
- d_diff_taps.resize(d_nfilters+1);
- signed int taps_per_filter = static_cast<signed int>(d_taps_per_filter);
-
- for (i = 0; i <= d_nfilters; i++) {
- d_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
- for (j = 0; j < taps_per_filter; j++) {
- k = i+j*d_nfilters;
- if (k < m)
- d_taps[i][j] = taps[k];
- }
- d_filters[i] = new filter::kernel::fir_filter_fff(1, d_taps[i]);
- if (d_filters[i] == NULL)
- throw std::runtime_error("unable to create fir_filter_fff");
-
- if (!d_derivative)
- continue;
-
- d_diff_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
- for (j = 0; j < taps_per_filter; j++) {
- k = i+j*d_nfilters;
- if (k < n)
- d_diff_taps[i][j] = diff_taps[k];
- }
- d_diff_filters[i] = new filter::kernel::fir_filter_fff(
- 1,
- d_diff_taps[i]);
- if (d_diff_filters[i] == NULL)
- throw std::runtime_error("unable to create fir_filter_fff");
+ d_filters[i] = new filter::kernel::fir_filter_fff(1, d_taps[i]);
+ if (d_filters[i] == NULL)
+ throw std::runtime_error("unable to create fir_filter_fff");
+
+ if (!d_derivative)
+ continue;
+
+ d_diff_taps[i] = std::vector<float>(d_taps_per_filter, 0.0f);
+ for (j = 0; j < taps_per_filter; j++) {
+ k = i + j * d_nfilters;
+ if (k < n)
+ d_diff_taps[i][j] = diff_taps[k];
}
+ d_diff_filters[i] = new filter::kernel::fir_filter_fff(1, d_diff_taps[i]);
+ if (d_diff_filters[i] == NULL)
+ throw std::runtime_error("unable to create fir_filter_fff");
}
+}
- interp_resampler_pfb_mf_fff::~interp_resampler_pfb_mf_fff()
- {
- for (int i = 0; i <= d_nfilters; i++) {
- delete d_filters[i];
- if (d_derivative)
- delete d_diff_filters[i];
- }
+interp_resampler_pfb_mf_fff::~interp_resampler_pfb_mf_fff()
+{
+ for (int i = 0; i <= d_nfilters; i++) {
+ delete d_filters[i];
+ if (d_derivative)
+ delete d_diff_filters[i];
}
+}
- float
- interp_resampler_pfb_mf_fff::interpolate(const float input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+float interp_resampler_pfb_mf_fff::interpolate(const float input[], float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_mf_fff: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_mf_fff: mu is not "
+ "in the range [0.0, 1.0]");
- return d_filters[arm]->filter(input);
- }
+ return d_filters[arm]->filter(input);
+}
- float
- interp_resampler_pfb_mf_fff::differentiate(const float input[],
- float mu) const
- {
- int arm = static_cast<int>(rint(mu * d_nfilters));
+float interp_resampler_pfb_mf_fff::differentiate(const float input[], float mu) const
+{
+ int arm = static_cast<int>(rint(mu * d_nfilters));
- if (arm < 0 || arm > d_nfilters)
- throw std::runtime_error("interp_resampler_pfb_mf_fff: mu is not "
- "in the range [0.0, 1.0]");
+ if (arm < 0 || arm > d_nfilters)
+ throw std::runtime_error("interp_resampler_pfb_mf_fff: mu is not "
+ "in the range [0.0, 1.0]");
- return d_diff_filters[arm]->filter(input);
- }
+ return d_diff_filters[arm]->filter(input);
+}
- unsigned int
- interp_resampler_pfb_mf_fff::ntaps() const
- {
- return d_taps_per_filter;
- }
+unsigned int interp_resampler_pfb_mf_fff::ntaps() const { return d_taps_per_filter; }
- } /* namespace digital */
+} /* namespace digital */
} /* namespace gr */