diff options
Diffstat (limited to 'gr-analog/include/analog/agc2.h')
-rw-r--r-- | gr-analog/include/analog/agc2.h | 180 |
1 files changed, 0 insertions, 180 deletions
diff --git a/gr-analog/include/analog/agc2.h b/gr-analog/include/analog/agc2.h deleted file mode 100644 index b035e8e222..0000000000 --- a/gr-analog/include/analog/agc2.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006,2012 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_ANALOG_AGC2_H -#define INCLUDED_ANALOG_AGC2_H - -#include <analog/api.h> -#include <gnuradio/gr_complex.h> -#include <math.h> - -namespace gr { - namespace analog { - namespace kernel { - - /*! - * \brief high performance Automatic Gain Control class - * \ingroup level_controllers_blk - * - * \details - * For Power the absolute value of the complex number is used. - */ - class ANALOG_API agc2_cc - { - public: - /*! - * Construct a comple value AGC loop implementation object. - * - * \param attack_rate the update rate of the loop when in attack mode. - * \param decay_rate the update rate of the loop when in decay mode. - * \param reference reference value to adjust signal power to. - * \param gain initial gain value. - * \param max_gain maximum gain value (0 for unlimited). - */ - agc2_cc(float attack_rate = 1e-1, float decay_rate = 1e-2, - float reference = 1.0, - float gain = 1.0, float max_gain = 0.0) - : _attack_rate(attack_rate), _decay_rate(decay_rate), - _reference(reference), - _gain(gain), _max_gain(max_gain) {}; - - float decay_rate() const { return _decay_rate; } - float attack_rate() const { return _attack_rate; } - float reference() const { return _reference; } - float gain() const { return _gain; } - float max_gain() const { return _max_gain; } - - void set_decay_rate(float rate) { _decay_rate = rate; } - void set_attack_rate(float rate) { _attack_rate = rate; } - void set_reference(float reference) { _reference = reference; } - void set_gain(float gain) { _gain = gain; } - void set_max_gain(float max_gain) { _max_gain = max_gain; } - - gr_complex scale(gr_complex input) - { - gr_complex output = input * _gain; - - float tmp = -_reference + sqrt(output.real()*output.real() + - output.imag()*output.imag()); - float rate = _decay_rate; - if((tmp) > _gain) { - rate = _attack_rate; - } - _gain -= tmp*rate; - - // Not sure about this; will blow up if _gain < 0 (happens - // when rates are too high), but is this the solution? - if(_gain < 0.0) - _gain = 10e-5; - - if(_max_gain > 0.0 && _gain > _max_gain) { - _gain = _max_gain; - } - return output; - } - - void scaleN(gr_complex output[], const gr_complex input[], unsigned n) - { - for(unsigned i = 0; i < n; i++) - output[i] = scale (input[i]); - } - - protected: - float _attack_rate; // attack rate for fast changing signals - float _decay_rate; // decay rate for slow changing signals - float _reference; // reference value - float _gain; // current gain - float _max_gain; // max allowable gain - }; - - - class ANALOG_API agc2_ff - { - public: - /*! - * Construct a floating point value AGC loop implementation object. - * - * \param attack_rate the update rate of the loop when in attack mode. - * \param decay_rate the update rate of the loop when in decay mode. - * \param reference reference value to adjust signal power to. - * \param gain initial gain value. - * \param max_gain maximum gain value (0 for unlimited). - */ - agc2_ff(float attack_rate = 1e-1, float decay_rate = 1e-2, - float reference = 1.0, - float gain = 1.0, float max_gain = 0.0) - : _attack_rate(attack_rate), _decay_rate(decay_rate), - _reference(reference), - _gain(gain), _max_gain(max_gain) {}; - - float attack_rate() const { return _attack_rate; } - float decay_rate() const { return _decay_rate; } - float reference() const { return _reference; } - float gain() const { return _gain; } - float max_gain() const { return _max_gain; } - - void set_attack_rate(float rate) { _attack_rate = rate; } - void set_decay_rate(float rate) { _decay_rate = rate; } - void set_reference(float reference) { _reference = reference; } - void set_gain(float gain) { _gain = gain; } - void set_max_gain(float max_gain) { _max_gain = max_gain; } - - float scale(float input) - { - float output = input * _gain; - - float tmp = (fabsf(output)) - _reference; - float rate = _decay_rate; - if(fabsf(tmp) > _gain) { - rate = _attack_rate; - } - _gain -= tmp*rate; - - // Not sure about this - if(_gain < 0.0) - _gain = 10e-5; - - if(_max_gain > 0.0 && _gain > _max_gain) { - _gain = _max_gain; - } - return output; - } - - void scaleN(float output[], const float input[], unsigned n) - { - for(unsigned i = 0; i < n; i++) - output[i] = scale (input[i]); - } - - protected: - float _attack_rate; // attack_rate for fast changing signals - float _decay_rate; // decay rate for slow changing signals - float _reference; // reference value - float _gain; // current gain - float _max_gain; // maximum gain - }; - - } /* namespace kernel */ - } /* namespace analog */ -} /* namespace gr */ - -#endif /* INCLUDED_ANALOG_AGC2_H */ |