Loading...
Searching...
No Matches
agc.h
Go to the documentation of this file.
/* -*- c++ -*- */
/*
* Copyright 2006,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
#ifndef INCLUDED_ANALOG_AGC_H
#define INCLUDED_ANALOG_AGC_H
#include <gnuradio/analog/api.h>
#include <gnuradio/gr_complex.h>
#include <cmath>
namespace gr {
namespace analog {
namespace kernel {
/*!
* \brief high performance Automatic Gain Control class for complex signals.
* \ingroup level_controllers_blk
*
* \details
* For Power the absolute value of the complex number is used.
*/
class ANALOG_API agc_cc
{
public:
/*!
* Construct a complex value AGC loop implementation object.
*
* \param rate the update rate of the loop.
* \param reference reference value to adjust signal power to.
* \param gain initial gain value.
* \param max_gain maximum gain value (0 for unlimited).
*/
agc_cc(float rate = 1e-4,
float reference = 1.0,
float gain = 1.0,
float max_gain = 0.0)
: _rate(rate), _reference(reference), _gain(gain), _max_gain(max_gain){};
virtual ~agc_cc(){};
float rate() const { return _rate; }
float reference() const { return _reference; }
float gain() const { return _gain; }
float max_gain() const { return _max_gain; }
void set_rate(float rate) { _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;
_gain += _rate * (_reference - std::sqrt(output.real() * output.real() +
output.imag() * output.imag()));
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 _rate; // adjustment rate
float _reference; // reference value
float _gain; // current gain
float _max_gain; // max allowable gain
};
/*!
* \brief high performance Automatic Gain Control class for float signals.
*
* Power is approximated by absolute value
*/
class ANALOG_API agc_ff
{
public:
/*!
* Construct a floating point value AGC loop implementation object.
*
* \param rate the update rate of the loop.
* \param reference reference value to adjust signal power to.
* \param gain initial gain value.
* \param max_gain maximum gain value (0 for unlimited).
*/
agc_ff(float rate = 1e-4,
float reference = 1.0,
float gain = 1.0,
float max_gain = 0.0)
: _rate(rate), _reference(reference), _gain(gain), _max_gain(max_gain){};
~agc_ff(){};
float rate() const { return _rate; }
float reference() const { return _reference; }
float gain() const { return _gain; }
float max_gain() const { return _max_gain; }
void set_rate(float rate) { _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;
_gain += (_reference - fabsf(output)) * _rate;
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 _rate; // adjustment rate
float _reference; // reference value
float _gain; // current gain
float _max_gain; // maximum gain
};
} /* namespace kernel */
} /* namespace analog */
} /* namespace gr */
#endif /* INCLUDED_ANALOG_AGC_H */
gr::analog::kernel::agc_cc::~agc_cc
virtual ~agc_cc()
Definition agc.h:46
gr::analog::kernel::agc_cc::agc_cc
agc_cc(float rate=1e-4, float reference=1.0, float gain=1.0, float max_gain=0.0)
Definition agc.h:40
gr::analog::kernel::agc_cc::_max_gain
float _max_gain
Definition agc.h:81
gr::analog::kernel::agc_cc::_gain
float _gain
Definition agc.h:80
gr::analog::kernel::agc_cc::scale
gr_complex scale(gr_complex input)
Definition agc.h:58
gr::analog::kernel::agc_cc::set_gain
void set_gain(float gain)
Definition agc.h:55
gr::analog::kernel::agc_cc::_reference
float _reference
Definition agc.h:79
gr::analog::kernel::agc_cc::rate
float rate() const
Definition agc.h:48
gr::analog::kernel::agc_cc::scaleN
void scaleN(gr_complex output[], const gr_complex input[], unsigned n)
Definition agc.h:70
gr::analog::kernel::agc_cc::set_rate
void set_rate(float rate)
Definition agc.h:53
gr::analog::kernel::agc_cc::set_reference
void set_reference(float reference)
Definition agc.h:54
gr::analog::kernel::agc_cc::_rate
float _rate
Definition agc.h:78
gr::analog::kernel::agc_cc::gain
float gain() const
Definition agc.h:50
gr::analog::kernel::agc_cc::reference
float reference() const
Definition agc.h:49
gr::analog::kernel::agc_cc::max_gain
float max_gain() const
Definition agc.h:51
gr::analog::kernel::agc_cc::set_max_gain
void set_max_gain(float max_gain)
Definition agc.h:56
gr::analog::kernel::agc_ff::_gain
float _gain
Definition agc.h:136
gr::analog::kernel::agc_ff::gain
float gain() const
Definition agc.h:110
gr::analog::kernel::agc_ff::~agc_ff
~agc_ff()
Definition agc.h:106
gr::analog::kernel::agc_ff::set_gain
void set_gain(float gain)
Definition agc.h:115
gr::analog::kernel::agc_ff::reference
float reference() const
Definition agc.h:109
gr::analog::kernel::agc_ff::_max_gain
float _max_gain
Definition agc.h:137
gr::analog::kernel::agc_ff::_reference
float _reference
Definition agc.h:135
gr::analog::kernel::agc_ff::rate
float rate() const
Definition agc.h:108
gr::analog::kernel::agc_ff::max_gain
float max_gain() const
Definition agc.h:111
gr::analog::kernel::agc_ff::scaleN
void scaleN(float output[], const float input[], unsigned n)
Definition agc.h:127
gr::analog::kernel::agc_ff::set_max_gain
void set_max_gain(float max_gain)
Definition agc.h:116
gr::analog::kernel::agc_ff::agc_ff
agc_ff(float rate=1e-4, float reference=1.0, float gain=1.0, float max_gain=0.0)
Definition agc.h:100
gr::analog::kernel::agc_ff::_rate
float _rate
Definition agc.h:134
gr::analog::kernel::agc_ff::set_reference
void set_reference(float reference)
Definition agc.h:114
gr::analog::kernel::agc_ff::set_rate
void set_rate(float rate)
Definition agc.h:113
gr::analog::kernel::agc_ff::scale
float scale(float input)
Definition agc.h:118
api.h
ANALOG_API
#define ANALOG_API
Definition gr-analog/include/gnuradio/analog/api.h:18
gr_complex.h
gr_complex
std::complex< float > gr_complex
Definition gr_complex.h:15
gr::analog::kernel
Definition agc.h:20
gr::analog
Definition agc.h:19
gr
GNU Radio logging wrapper.
Definition basic_block.h:29