From c71f1fdc3a4df13314b8d8b004e00123c328f304 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 21 May 2018 14:43:11 +0200 Subject: [PATCH] SSB demod: experimental clipping limiter --- sdrbase/dsp/agc.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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