23 #ifndef INCLUDED_ANALOG_AGC2_H
24 #define INCLUDED_ANALOG_AGC2_H
43 agc2_cc(
float attack_rate = 1e-1,
float decay_rate = 1e-2,
44 float reference = 1.0,
45 float gain = 1.0,
float max_gain = 0.0)
46 : _attack_rate(attack_rate), _decay_rate(decay_rate),
47 _reference(reference),
48 _gain(gain), _max_gain(max_gain) {};
53 float gain()
const {
return _gain; }
66 float tmp = -_reference + sqrt(output.real()*output.real() +
67 output.imag()*output.imag());
68 float rate = _decay_rate;
79 if(_max_gain > 0.0 && _gain > _max_gain) {
87 for(
unsigned i = 0; i < n; i++)
88 output[i] = scale (input[i]);
103 agc2_ff(
float attack_rate = 1e-1,
float decay_rate = 1e-2,
104 float reference = 1.0,
105 float gain = 1.0,
float max_gain = 0.0)
106 : _attack_rate(attack_rate), _decay_rate(decay_rate),
107 _reference(reference),
108 _gain(gain), _max_gain(max_gain) {};
113 float gain()
const {
return _gain; }
122 float scale(
float input)
124 float output = input * _gain;
126 float tmp = (fabsf(output)) - _reference;
127 float rate = _decay_rate;
128 if(fabsf(tmp) > _gain) {
137 if(_max_gain > 0.0 && _gain > _max_gain) {
143 void scaleN(
float output[],
const float input[],
unsigned n)
145 for(
unsigned i = 0; i < n; i++)
146 output[i] = scale (input[i]);