diff --git a/debian/changelog b/debian/changelog index 56aed61cb..dc80e9307 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,9 @@ sdrangel (3.14.5-1) unstable; urgency=medium * Added a benchmark program testing decimators * Optimization of decimators using even/odd technique * SSB mod: fixed channel unregistration + * AM demod: fixed delayed squelch - -- Edouard Griffiths, F4EXB Fri, 04 May 2018 20:14:18 +0200 + -- Edouard Griffiths, F4EXB Sun, 06 May 2018 20:14:18 +0200 sdrangel (3.14.4-1) unstable; urgency=medium diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 14729bf50..fafa7fb69 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -49,7 +49,7 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : m_inputFrequencyOffset(0), m_running(false), m_squelchOpen(false), - m_squelchDelayLine(12000), + m_squelchDelayLine(9600), m_magsqSum(0.0f), m_magsqPeak(0.0f), m_magsqCount(0), @@ -232,7 +232,7 @@ void AMDemod::applyAudioSampleRate(int sampleRate) m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate; m_bandpass.create(301, sampleRate, 300.0, m_settings.m_rfBandwidth / 2.0f); m_audioFifo.setSize(sampleRate); - m_squelchDelayLine.resize(sampleRate/4); + m_squelchDelayLine.resize(sampleRate/5); m_settingsMutex.unlock(); m_audioSampleRate = sampleRate; diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index 2e730d732..9c32eb8ff 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -30,7 +30,6 @@ #include "audio/audiofifo.h" #include "util/message.h" #include "util/doublebufferfifo.h" - #include "amdemodsettings.h" class DeviceSourceAPI; @@ -183,8 +182,8 @@ private: void processOneSample(Complex &ci) { - Real re = ci.real() / SDR_RX_SCALED; - Real im = ci.imag() / SDR_RX_SCALED; + Real re = ci.real() / SDR_RX_SCALEF; + Real im = ci.imag() / SDR_RX_SCALEF; Real magsq = re*re + im*im; m_movingAverage(magsq); m_magsq = m_movingAverage.asDouble(); @@ -197,43 +196,28 @@ private: m_magsqCount++; -// if (m_magsq >= m_squelchLevel) -// { -// if (m_squelchCount <= m_audioSampleRate / 10) -// { -// m_squelchCount++; -// } -// } -// else -// { -// if (m_squelchCount > 1) -// { -// m_squelchCount -= 2; -// } -// } + m_squelchDelayLine.write(magsq); - if (m_magsq >= m_squelchLevel) - { - if (m_squelchCount < m_audioSampleRate / 10) { - m_squelchCount++; - } - - m_squelchDelayLine.write(magsq); - } - else + if (m_magsq < m_squelchLevel) { if (m_squelchCount > 0) { m_squelchCount--; } - - m_squelchDelayLine.write(0); + } + else + { + if (m_squelchCount < m_audioSampleRate / 10) { + m_squelchCount++; + } } qint16 sample; - if ((m_squelchCount >= m_audioSampleRate / 20) && !m_settings.m_audioMute) + m_squelchOpen = (m_squelchCount >= m_audioSampleRate / 20); + + if (m_squelchOpen && !m_settings.m_audioMute) { - Real demod = sqrt(m_squelchDelayLine.readBack(m_audioSampleRate / 20)); + Real demod = sqrt(m_squelchDelayLine.readBack(m_audioSampleRate/20)); m_volumeAGC.feed(demod); demod = (demod - m_volumeAGC.getValue()) / m_volumeAGC.getValue(); @@ -245,12 +229,10 @@ private: Real attack = (m_squelchCount - 0.05f * m_audioSampleRate) / (0.05f * m_audioSampleRate); sample = demod * attack * (m_audioSampleRate/24) * m_settings.m_volume; - m_squelchOpen = true; } else { sample = 0; - m_squelchOpen = false; } m_audioBuffer[m_audioBufferFill].l = sample;