#include "agc.h" namespace dsp { template AGCBlock::AGCBlock(std::shared_ptr> input, float agc_rate, float reference, float gain, float max_gain) : Block(input), rate(agc_rate), reference(reference), gain(gain), max_gain(max_gain) { } template void AGCBlock::work() { int nsamples = Block::input_stream->read(); if (nsamples <= 0) { Block::input_stream->flush(); return; } for (int i = 0; i < nsamples; i++) { T output = Block::input_stream->readBuf[i] * gain; if constexpr (std::is_same_v) gain += rate * (reference - fabsf(output)); if constexpr (std::is_same_v) gain += rate * (reference - sqrt(output.real * output.real + output.imag * output.imag)); if (max_gain > 0.0 && gain > max_gain) gain = max_gain; Block::output_stream->writeBuf[i] = output; } Block::input_stream->flush(); Block::output_stream->swap(nsamples); } template class AGCBlock; template class AGCBlock; }