From be4982c4477538f35f4322f941020bba654f6c99 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 26 Aug 2016 02:02:10 +0200 Subject: [PATCH] DSD demod plugin: fixed magnitude squared precision problem --- plugins/channel/demoddsd/dsddemod.cpp | 4 ++-- plugins/channel/demoddsd/dsddemod.h | 6 +++--- plugins/channel/demoddsd/dsddemodgui.cpp | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp index a7edeb696..2722e390a 100644 --- a/plugins/channel/demoddsd/dsddemod.cpp +++ b/plugins/channel/demoddsd/dsddemod.cpp @@ -64,7 +64,7 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) : m_sampleBuffer = new qint16[1<<17]; // 128 kS m_sampleBufferIndex = 0; - m_movingAverage.resize(16, 0); + m_movingAverage.resize(50, 0); DSPEngine::instance()->addAudioSink(&m_audioFifo); } @@ -119,7 +119,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto { qint16 sample, delayedSample; - m_magsq = ((ci.real()*ci.real() + ci.imag()*ci.imag())) / (Real) (1<<30); + m_magsq = ((ci.real()*ci.real() + ci.imag()*ci.imag())); m_movingAverage.feed(m_magsq); Real demod = 32768.0f * m_phaseDiscri.phaseDiscriminator(ci) * ((float) m_running.m_demodGain / 100.0f); diff --git a/plugins/channel/demoddsd/dsddemod.h b/plugins/channel/demoddsd/dsddemod.h index 3894d8812..21989698d 100644 --- a/plugins/channel/demoddsd/dsddemod.h +++ b/plugins/channel/demoddsd/dsddemod.h @@ -61,7 +61,7 @@ public: m_dsdDemodGUI = dsdDemodGUI; } - Real getMagSq() { return m_movingAverage.average(); } + double getMagSq() { return m_movingAverage.average() / (double) (1<<30); } bool getSquelchOpen() const { return m_squelchOpen; } const DSDDecoder& getDecoder() const { return m_dsdDecoder; } @@ -199,8 +199,8 @@ private: bool m_squelchOpen; Real m_lastArgument; - MovingAverage m_movingAverage; - Real m_magsq; + MovingAverage m_movingAverage; + double m_magsq; Real m_fmExcursion; diff --git a/plugins/channel/demoddsd/dsddemodgui.cpp b/plugins/channel/demoddsd/dsddemodgui.cpp index fddbf9e92..af8d74eae 100644 --- a/plugins/channel/demoddsd/dsddemodgui.cpp +++ b/plugins/channel/demoddsd/dsddemodgui.cpp @@ -492,8 +492,9 @@ void DSDDemodGUI::formatStatusText() void DSDDemodGUI::tick() { Real powDb = CalcDb::dbPower(m_dsdDemod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); + m_channelPowerDbAvg.feed(powDb); ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); + bool squelchOpen = m_dsdDemod->getSquelchOpen(); if (squelchOpen != m_squelchOpen)