diff options
Diffstat (limited to 'gr-analog/lib')
-rw-r--r-- | gr-analog/lib/agc2_cc_impl.cc | 18 | ||||
-rw-r--r-- | gr-analog/lib/agc2_cc_impl.h | 3 | ||||
-rw-r--r-- | gr-analog/lib/agc2_ff_impl.cc | 19 | ||||
-rw-r--r-- | gr-analog/lib/agc2_ff_impl.h | 3 | ||||
-rw-r--r-- | gr-analog/lib/agc3_cc_impl.cc | 38 | ||||
-rw-r--r-- | gr-analog/lib/agc3_cc_impl.h | 5 | ||||
-rw-r--r-- | gr-analog/lib/agc_cc_impl.cc | 18 | ||||
-rw-r--r-- | gr-analog/lib/agc_cc_impl.h | 2 | ||||
-rw-r--r-- | gr-analog/lib/agc_ff_impl.cc | 8 | ||||
-rw-r--r-- | gr-analog/lib/agc_ff_impl.h | 2 |
10 files changed, 65 insertions, 51 deletions
diff --git a/gr-analog/lib/agc2_cc_impl.cc b/gr-analog/lib/agc2_cc_impl.cc index fbca18777b..4897559560 100644 --- a/gr-analog/lib/agc2_cc_impl.cc +++ b/gr-analog/lib/agc2_cc_impl.cc @@ -26,29 +26,31 @@ #include "agc2_cc_impl.h" #include <gnuradio/io_signature.h> +#include <volk/volk.h> namespace gr { namespace analog { agc2_cc::sptr agc2_cc::make(float attack_rate, float decay_rate, - float reference, - float gain, float max_gain) + float reference, float gain) { return gnuradio::get_initial_sptr (new agc2_cc_impl(attack_rate, decay_rate, - reference, gain, max_gain)); + reference, gain)); } agc2_cc_impl::agc2_cc_impl(float attack_rate, float decay_rate, - float reference, - float gain, float max_gain) + float reference, float gain) : sync_block("agc2_cc", - io_signature::make(1, 1, sizeof(gr_complex)), - io_signature::make(1, 1, sizeof(gr_complex))), + io_signature::make(1, 1, sizeof(gr_complex)), + io_signature::make(1, 1, sizeof(gr_complex))), kernel::agc2_cc(attack_rate, decay_rate, - reference, gain, max_gain) + reference, gain, 2e16) { + const int alignment_multiple = + volk_get_alignment() / sizeof(gr_complex); + set_alignment(std::max(1, alignment_multiple)); } agc2_cc_impl::~agc2_cc_impl() diff --git a/gr-analog/lib/agc2_cc_impl.h b/gr-analog/lib/agc2_cc_impl.h index 9220501323..bfb420789f 100644 --- a/gr-analog/lib/agc2_cc_impl.h +++ b/gr-analog/lib/agc2_cc_impl.h @@ -32,8 +32,7 @@ namespace gr { { public: agc2_cc_impl(float attack_rate = 1e-1, float decay_rate = 1e-2, - float reference = 1.0, - float gain = 1.0, float max_gain = 0.0); + float reference = 1.0, float gain = 1.0); ~agc2_cc_impl(); float attack_rate() const { return kernel::agc2_cc::attack_rate(); } diff --git a/gr-analog/lib/agc2_ff_impl.cc b/gr-analog/lib/agc2_ff_impl.cc index 93a404c6df..02e27ea139 100644 --- a/gr-analog/lib/agc2_ff_impl.cc +++ b/gr-analog/lib/agc2_ff_impl.cc @@ -32,13 +32,11 @@ namespace gr { agc2_ff::sptr agc2_ff::make(float attack_rate, float decay_rate, - float reference, - float gain, float max_gain) + float reference, float gain) { return gnuradio::get_initial_sptr (new agc2_ff_impl(attack_rate, decay_rate, - reference, - gain, max_gain)); + reference, gain)); } agc2_ff_impl::~agc2_ff_impl() @@ -46,13 +44,12 @@ namespace gr { } agc2_ff_impl::agc2_ff_impl(float attack_rate, float decay_rate, - float reference, - float gain, float max_gain) - : sync_block("agc2_ff", - io_signature::make(1, 1, sizeof(float)), - io_signature::make(1, 1, sizeof(float))) - , kernel::agc2_ff(attack_rate, decay_rate, - reference, gain, max_gain) + float reference, float gain) + : sync_block("agc2_ff", + io_signature::make(1, 1, sizeof(float)), + io_signature::make(1, 1, sizeof(float))), + kernel::agc2_ff(attack_rate, decay_rate, + reference, gain, 2e16) { } diff --git a/gr-analog/lib/agc2_ff_impl.h b/gr-analog/lib/agc2_ff_impl.h index 8c068c4e34..5c7a7b486a 100644 --- a/gr-analog/lib/agc2_ff_impl.h +++ b/gr-analog/lib/agc2_ff_impl.h @@ -32,8 +32,7 @@ namespace gr { { public: agc2_ff_impl(float attack_rate = 1e-1, float decay_rate = 1e-2, - float reference = 1.0, - float gain = 1.0, float max_gain = 0.0); + float reference = 1.0, float gain = 1.0); ~agc2_ff_impl(); float attack_rate() const { return kernel::agc2_ff::attack_rate(); } diff --git a/gr-analog/lib/agc3_cc_impl.cc b/gr-analog/lib/agc3_cc_impl.cc index 286c6be2a2..21c9f471ea 100644 --- a/gr-analog/lib/agc3_cc_impl.cc +++ b/gr-analog/lib/agc3_cc_impl.cc @@ -32,19 +32,22 @@ namespace gr { namespace analog { agc3_cc::sptr - agc3_cc::make(float attack_rate, float decay_rate, float reference) + agc3_cc::make(float attack_rate, float decay_rate, + float reference, float gain) { return gnuradio::get_initial_sptr - (new agc3_cc_impl(attack_rate, decay_rate, reference)); + (new agc3_cc_impl(attack_rate, decay_rate, + reference, gain)); } - agc3_cc_impl::agc3_cc_impl(float attack_rate, float decay_rate, float reference) - : sync_block("agc3_cc", - io_signature::make(1, 1, sizeof(gr_complex)), - io_signature::make(1, 1, sizeof(gr_complex))), - d_attack(attack_rate), d_decay(decay_rate), - d_reference(reference), d_gain(1.0), - d_reset(true) + agc3_cc_impl::agc3_cc_impl(float attack_rate, float decay_rate, + float reference, float gain) + : sync_block("agc3_cc", + io_signature::make(1, 1, sizeof(gr_complex)), + io_signature::make(1, 1, sizeof(gr_complex))), + d_attack(attack_rate), d_decay(decay_rate), + d_reference(reference), d_gain(gain), d_max_gain(2e16), + d_reset(true) { const int alignment_multiple = volk_get_alignment() / sizeof(gr_complex); @@ -70,20 +73,29 @@ namespace gr { #endif volk_32fc_magnitude_32f(mags, &in[0], noutput_items); // Compute a linear average on reset (no expected) - if(__builtin_expect (d_reset, false)){ + if(__builtin_expect(d_reset, false)) { float mag; - for(int i=0; i<noutput_items; i++){ + for(int i=0; i<noutput_items; i++) { mag += mags[i]; } d_gain = d_reference * (noutput_items/mag); + + if(d_gain < 0.0) + d_gain = 10e-5; + + if(d_max_gain > 0.0 && d_gain > d_max_gain) { + d_gain = d_max_gain; + } + // scale output values for(int i=0; i<noutput_items; i++){ out[i] = in[i] * d_gain; } d_reset = false; - } else { + } + else { // Otherwise perform a normal iir update - for(int i=0; i<noutput_items; i++){ + for(int i=0; i<noutput_items; i++) { float newlevel = mags[i]; // abs(in[i]); float rate = (newlevel > d_reference/d_gain)?d_attack:d_decay; d_gain = (d_gain*(1-rate)) + (d_reference/newlevel)*rate; diff --git a/gr-analog/lib/agc3_cc_impl.h b/gr-analog/lib/agc3_cc_impl.h index 28136ac6a2..77cc1978c5 100644 --- a/gr-analog/lib/agc3_cc_impl.h +++ b/gr-analog/lib/agc3_cc_impl.h @@ -32,18 +32,20 @@ namespace gr { { public: agc3_cc_impl(float attack_rate = 1e-1, float decay_rate = 1e-2, - float reference = 1.0); + float reference = 1.0, float gain = 1.0); ~agc3_cc_impl(); float attack_rate() const { return d_attack; } float decay_rate() const { return d_decay; } float reference() const { return d_reference; } float gain() const { return d_gain; } + float max_gain() const { return d_max_gain; } void set_attack_rate(float rate) { d_attack = rate; } void set_decay_rate(float rate) { d_decay = rate; } void set_reference(float reference) { d_reference = reference; } void set_gain(float gain) { d_gain = gain; } + void set_max_gain(float max_gain) { d_max_gain = max_gain; } int work(int noutput_items, gr_vector_const_void_star &input_items, @@ -54,6 +56,7 @@ namespace gr { float d_decay; float d_reference; float d_gain; + float d_max_gain; bool d_reset; }; diff --git a/gr-analog/lib/agc_cc_impl.cc b/gr-analog/lib/agc_cc_impl.cc index 04d70d5421..4ce9b415ee 100644 --- a/gr-analog/lib/agc_cc_impl.cc +++ b/gr-analog/lib/agc_cc_impl.cc @@ -26,25 +26,27 @@ #include "agc_cc_impl.h" #include <gnuradio/io_signature.h> +#include <volk/volk.h> namespace gr { namespace analog { agc_cc::sptr - agc_cc::make(float rate, float reference, - float gain, float max_gain) + agc_cc::make(float rate, float reference, float gain) { return gnuradio::get_initial_sptr - (new agc_cc_impl(rate, reference, gain, max_gain)); + (new agc_cc_impl(rate, reference, gain)); } - agc_cc_impl::agc_cc_impl(float rate, float reference, - float gain, float max_gain) + agc_cc_impl::agc_cc_impl(float rate, float reference, float gain) : sync_block("agc_cc", - io_signature::make(1, 1, sizeof(gr_complex)), - io_signature::make(1, 1, sizeof(gr_complex))), - kernel::agc_cc(rate, reference, gain, max_gain) + io_signature::make(1, 1, sizeof(gr_complex)), + io_signature::make(1, 1, sizeof(gr_complex))), + kernel::agc_cc(rate, reference, gain, 2e16) { + const int alignment_multiple = + volk_get_alignment() / sizeof(gr_complex); + set_alignment(std::max(1, alignment_multiple)); } agc_cc_impl::~agc_cc_impl() diff --git a/gr-analog/lib/agc_cc_impl.h b/gr-analog/lib/agc_cc_impl.h index fda154d021..7772cb4092 100644 --- a/gr-analog/lib/agc_cc_impl.h +++ b/gr-analog/lib/agc_cc_impl.h @@ -32,7 +32,7 @@ namespace gr { { public: agc_cc_impl(float rate = 1e-4, float reference = 1.0, - float gain = 1.0, float max_gain = 0.0); + float gain = 1.0); ~agc_cc_impl(); float rate() const { return kernel::agc_cc::rate(); } diff --git a/gr-analog/lib/agc_ff_impl.cc b/gr-analog/lib/agc_ff_impl.cc index 1c29934361..afde83c5d2 100644 --- a/gr-analog/lib/agc_ff_impl.cc +++ b/gr-analog/lib/agc_ff_impl.cc @@ -31,17 +31,17 @@ namespace gr { namespace analog { agc_ff::sptr - agc_ff::make(float rate, float reference, float gain, float max_gain) + agc_ff::make(float rate, float reference, float gain) { return gnuradio::get_initial_sptr - (new agc_ff_impl(rate, reference, gain, max_gain)); + (new agc_ff_impl(rate, reference, gain)); } - agc_ff_impl::agc_ff_impl(float rate, float reference, float gain, float max_gain) + agc_ff_impl::agc_ff_impl(float rate, float reference, float gain) : sync_block("agc_ff", io_signature::make(1, 1, sizeof(float)), io_signature::make(1, 1, sizeof(float))), - kernel::agc_ff(rate, reference, gain, max_gain) + kernel::agc_ff(rate, reference, gain, 2e16) { } diff --git a/gr-analog/lib/agc_ff_impl.h b/gr-analog/lib/agc_ff_impl.h index c67739b73e..319823c6aa 100644 --- a/gr-analog/lib/agc_ff_impl.h +++ b/gr-analog/lib/agc_ff_impl.h @@ -32,7 +32,7 @@ namespace gr { { public: agc_ff_impl(float rate = 1e-4, float reference = 1.0, - float gain = 1.0, float max_gain = 0.0); + float gain = 1.0); ~agc_ff_impl(); float rate() const { return kernel::agc_ff::rate(); } |