From f2db9076772c0637356578ca5127aefe6e9eee38 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 1 Dec 2023 06:38:54 +0100 Subject: [PATCH 1/2] Scope: fixed mag sq derivative scale display --- sdrgui/gui/glscope.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdrgui/gui/glscope.cpp b/sdrgui/gui/glscope.cpp index d036f9cf5..47ba26f26 100644 --- a/sdrgui/gui/glscope.cpp +++ b/sdrgui/gui/glscope.cpp @@ -1893,7 +1893,6 @@ void GLScope::setYScale(ScaleEngine &scale, uint32_t highlightedTraceIndex) break; case Projector::ProjectionMagLin: case Projector::ProjectionMagSq: - case Projector::ProjectionDMagSq: if (amp_range < 1e-9) { scale.setRange(Unit::None, amp_ofs * 1e12, amp_range * 1e12 + amp_ofs * 1e12); } else if (amp_range < 1e-6) { @@ -1920,6 +1919,7 @@ void GLScope::setYScale(ScaleEngine &scale, uint32_t highlightedTraceIndex) // break; case Projector::ProjectionReal: // Linear generic case Projector::ProjectionImag: + case Projector::ProjectionDMagSq: default: if (amp_range < 1e-9) { scale.setRange(Unit::None, -amp_range * 5e11 + amp_ofs * 1e12, amp_range * 5e11 + amp_ofs * 1e12); From 2f5cbd10928ca3a0cc94f3d26808df41f7206093 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 1 Dec 2023 17:24:28 +0100 Subject: [PATCH 2/2] SSB demod: further optimize AGC steep transitions mitigation --- plugins/channelrx/demodssb/ssbdemodsink.cpp | 9 +++++---- sdrbase/dsp/agc.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index ffb462960..56d04cbd1 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -177,11 +177,12 @@ void SSBDemodSink::processOneSample(Complex &ci) m_audioActive = delayedSample.real() != 0.0; m_magsqCur = std::norm(sideband[i]*agcVal); - // Prevent overload if squared magnitude variation is 90% full scale (0.9*.0.9 = 0.81) + // Prevent overload based on squared magnitude variation // Only if AGC is active - if (m_agcActive && (m_magsqCur - m_magsqPrev > m_agcTarget*m_agcTarget*8.1)) + if (m_agcActive && (std::abs(m_magsqCur - m_magsqPrev) > m_agcTarget*m_agcTarget*5.0)) { m_agc.reset(m_agcTarget*100.0); // Quench AGC at -20dB the target + m_agc.resetStepCounters(); m_squelchDelayLine.write(sideband[i]); } else @@ -198,7 +199,8 @@ void SSBDemodSink::processOneSample(Complex &ci) } else { - fftfilt::cmplx z = m_agcActive ? delayedSample * m_agc.getStepValue() : delayedSample; + // fftfilt::cmplx z = m_agcActive ? delayedSample * m_agc.getStepValue() : delayedSample; + fftfilt::cmplx& z = delayedSample; if (m_audioBinaual) { @@ -503,4 +505,3 @@ void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) m_agcActive = settings.m_agc; m_settings = settings; } - diff --git a/sdrbase/dsp/agc.h b/sdrbase/dsp/agc.h index 38b544a3e..ff721a6a6 100644 --- a/sdrbase/dsp/agc.h +++ b/sdrbase/dsp/agc.h @@ -64,6 +64,7 @@ public: int getStepDownDelay() const { return m_stepDownDelay; } float getStepValue() const; void setHardLimiting(bool hardLimiting) { m_hardLimiting = hardLimiting; } + void resetStepCounters() { m_stepUpCounter = 0; m_stepDownCounter = 0; } private: bool m_squared; //!< use squared magnitude (power) to compute AGC value