diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index dd18cf468..14729bf50 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -49,6 +49,7 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : m_inputFrequencyOffset(0), m_running(false), m_squelchOpen(false), + m_squelchDelayLine(12000), m_magsqSum(0.0f), m_magsqPeak(0.0f), m_magsqCount(0), @@ -231,6 +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_settingsMutex.unlock(); m_audioSampleRate = sampleRate; diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index cc8fcff88..2e730d732 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -29,6 +29,8 @@ #include "dsp/bandpass.h" #include "audio/audiofifo.h" #include "util/message.h" +#include "util/doublebufferfifo.h" + #include "amdemodsettings.h" class DeviceSourceAPI; @@ -155,6 +157,7 @@ private: Real m_squelchLevel; uint32_t m_squelchCount; bool m_squelchOpen; + DoubleBufferFIFO m_squelchDelayLine; double m_magsq; double m_magsqSum; double m_magsqPeak; @@ -194,26 +197,43 @@ private: m_magsqCount++; +// if (m_magsq >= m_squelchLevel) +// { +// if (m_squelchCount <= m_audioSampleRate / 10) +// { +// m_squelchCount++; +// } +// } +// else +// { +// if (m_squelchCount > 1) +// { +// m_squelchCount -= 2; +// } +// } + if (m_magsq >= m_squelchLevel) { - if (m_squelchCount <= m_audioSampleRate / 10) - { + if (m_squelchCount < m_audioSampleRate / 10) { m_squelchCount++; } + + m_squelchDelayLine.write(magsq); } else { - if (m_squelchCount > 1) - { - m_squelchCount -= 2; + if (m_squelchCount > 0) { + m_squelchCount--; } + + m_squelchDelayLine.write(0); } qint16 sample; if ((m_squelchCount >= m_audioSampleRate / 20) && !m_settings.m_audioMute) { - Real demod = sqrt(magsq); + Real demod = sqrt(m_squelchDelayLine.readBack(m_audioSampleRate / 20)); m_volumeAGC.feed(demod); demod = (demod - m_volumeAGC.getValue()) / m_volumeAGC.getValue(); diff --git a/plugins/channelrx/demodam/amdemodplugin.cpp b/plugins/channelrx/demodam/amdemodplugin.cpp index 76149cd3c..4942287c9 100644 --- a/plugins/channelrx/demodam/amdemodplugin.cpp +++ b/plugins/channelrx/demodam/amdemodplugin.cpp @@ -9,7 +9,7 @@ const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = { QString("AM Demodulator"), - QString("3.14.2"), + QString("3.14.4"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true,