From f57eecee86ab8474c8be48038e940c5dffb81066 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 13 May 2017 12:10:03 +0200 Subject: [PATCH] NFM demod: af squeelch optimization --- plugins/channelrx/demodnfm/nfmdemod.cpp | 37 +++++++++++++--------- plugins/channelrx/demodnfm/nfmdemodgui.cpp | 4 +-- sdrbase/dsp/afsquelch.cpp | 6 ++++ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index e2713c884..61bbb7f0a 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -15,7 +15,7 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include "../../channelrx/demodnfm/nfmdemod.h" +#include "nfmdemod.h" #include #include @@ -25,9 +25,9 @@ #include "audio/audiooutput.h" #include "dsp/pidcontroller.h" #include "dsp/dspengine.h" -#include "../../channelrx/demodnfm/nfmdemodgui.h" +#include "nfmdemodgui.h" -static const Real afSqTones[2] = {1200.0, 6400.0}; // {1200.0, 8000.0}; +static const Real afSqTones[2] = {1200.0, 8000.0}; // {1200.0, 8000.0}; MESSAGE_CLASS_DEFINITION(NFMDemod::MsgConfigureNFMDemod, Message) @@ -75,7 +75,7 @@ NFMDemod::NFMDemod() : m_movingAverage.resize(32, 0); m_ctcssDetector.setCoefficients(3000, 6000.0); // 0.5s / 2 Hz resolution - m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 4000 Hz span, 250us, 100ms attack + m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 0.5ms test period, 300ms average span, 48kS/s SR, 100ms attack, no decay DSPEngine::instance()->addAudioSink(&m_audioFifo); } @@ -184,8 +184,23 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if (m_running.m_deltaSquelch) { if (m_afSquelch.analyze(demod)) { - m_squelchCount = m_afSquelch.evaluate() ? m_squelchGate + 480 : 0; + m_afSquelchOpen = m_afSquelch.evaluate() ? m_squelchGate + 480 : 0; } + + if (m_afSquelchOpen) + { + if (m_squelchCount < m_squelchGate + 480) + { + m_squelchCount++; + } + } + else + { + if (m_squelchCount > 0) + { + m_squelchCount--; + } + } } else { @@ -270,16 +285,8 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto else { demod = m_bandpass.filter(demod); - - if (m_running.m_deltaSquelch) - { - sample = demod * m_running.m_volume; - } - else - { - Real squelchFactor = smootherstep((Real) (m_squelchCount - m_squelchGate) / 480.0f); - sample = demod * m_running.m_volume * squelchFactor; - } + Real squelchFactor = smootherstep((Real) (m_squelchCount - m_squelchGate) / 480.0f); + sample = demod * m_running.m_volume * squelchFactor; } } else diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index 15fe66b3a..56f3dc0db 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -208,6 +208,7 @@ void NFMDemodGUI::on_volume_valueChanged(int value) void NFMDemodGUI::on_squelchGate_valueChanged(int value) { + ui->squelchGateText->setText(QString("%1").arg(ui->squelchGate->value() * 10.0f, 0, 'f', 0)); applySettings(); } @@ -369,14 +370,13 @@ void NFMDemodGUI::applySettings() ui->deltaFrequency->setValue(abs(m_channelMarker.getCenterFrequency())); ui->deltaMinus->setChecked(m_channelMarker.getCenterFrequency() < 0); - ui->squelchGateText->setText(QString("%1").arg(ui->squelchGate->value() * 10.0f, 0, 'f', 0)); m_nfmDemod->configure(m_nfmDemod->getInputMessageQueue(), m_rfBW[ui->rfBW->currentIndex()], ui->afBW->value() * 1000.0f, m_fmDev[ui->rfBW->currentIndex()], ui->volume->value() / 10.0f, - ui->squelchGate->value(), // in 10ths of ms + ui->squelchGate->value(), // in 10ths of ms 1 -> 50 ui->deltaSquelch->isChecked(), ui->squelch->value(), // -1000 -> 0 ui->ctcssOn->isChecked(), diff --git a/sdrbase/dsp/afsquelch.cpp b/sdrbase/dsp/afsquelch.cpp index e5b7836f2..db9ff9846 100644 --- a/sdrbase/dsp/afsquelch.cpp +++ b/sdrbase/dsp/afsquelch.cpp @@ -91,6 +91,12 @@ void AFSquelch::setCoefficients(int N, unsigned int nbAvg, int _samplerate, int m_samplesAttack = _samplesAttack; m_samplesDecay = _samplesDecay; m_movingAverages.resize(m_nTones, MovingAverage(m_nbAvg, 1.0)); + m_samplesProcessed = 0; + m_maxPowerIndex = 0; + m_attackCount = 0; + m_decayCount = 0; + m_isOpen = false; + m_threshold = 0.0; // for each of the frequencies (tones) of interest calculate // k and the associated filter coefficient as per the Goertzel