diff --git a/sdrbase/dsp/agc.cpp b/sdrbase/dsp/agc.cpp index 1a94b7457..c7a3ebcf7 100644 --- a/sdrbase/dsp/agc.cpp +++ b/sdrbase/dsp/agc.cpp @@ -105,12 +105,24 @@ double MagAGC::feedAndGetValue(const Complex& ci) if (m_squared) { double u0 = m_R / m_moving_average.average(); - m_u0 = (u0 * m_magsq > m_clampMax) ? m_clampMax / m_magsq : u0; + double du = (u0*m_magsq) - (m_clampMax/2.0); + if (du > 0) { + m_u0 = (m_clampMax/2.0)*(1.0 + (log10(1+du)/4.0)); // experimental clipping limiter + } else { + m_u0 = u0; + } + //m_u0 = (u0 * m_magsq > m_clampMax) ? m_clampMax / m_magsq : u0; } else { double u02 = m_R2 / m_moving_average.average(); - m_u0 = (u02 * m_magsq > m_clampMax) ? sqrt(m_clampMax / m_magsq) : sqrt(u02); + double du = (u02*m_magsq) - (m_clampMax/2.0); + if (du > 0) { + m_u0 = (m_clampMax/2.0)*(1.0 + (log10(1+du)/4.0)); // experimental clipping limiter + } else { + m_u0 = sqrt(u02); + } + //m_u0 = (u02 * m_magsq > m_clampMax) ? sqrt(m_clampMax / m_magsq) : sqrt(u02); } } else