From fd8e7715435d5f4ea6e19a4d98d64664c434f0b5 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 14 Dec 2015 03:01:44 +0100 Subject: [PATCH] BFM demod: RDS GUI part #2: quality metrics report --- plugins/channel/bfm/bfmdemod.h | 6 + plugins/channel/bfm/bfmdemodgui.cpp | 10 +- plugins/channel/bfm/bfmdemodgui.ui | 284 +++++++++++++++++++++++++++- plugins/channel/bfm/rdsdecoder.cpp | 7 +- plugins/channel/bfm/rdsdecoder.h | 2 + plugins/channel/bfm/rdsdemod.cpp | 10 +- plugins/channel/bfm/rdsdemod.h | 6 + 7 files changed, 315 insertions(+), 10 deletions(-) diff --git a/plugins/channel/bfm/bfmdemod.h b/plugins/channel/bfm/bfmdemod.h index 89555637d..1ca9b260e 100644 --- a/plugins/channel/bfm/bfmdemod.h +++ b/plugins/channel/bfm/bfmdemod.h @@ -58,9 +58,15 @@ public: virtual bool handleMessage(const Message& cmd); Real getMagSq() const { return m_movingAverage.average(); } + bool getPilotLock() const { return m_pilotPLL.locked(); } Real getPilotLevel() const { return m_pilotPLL.get_pilot_level(); } + Real getDecoderQua() const { return m_rdsDecoder.m_qua; } + Real getDemodAcc() const { return m_rdsDemod.m_report.acc; } + Real getDemodQua() const { return m_rdsDemod.m_report.qua; } + Real getDemodFclk() const { return m_rdsDemod.m_report.fclk; } + private: class MsgConfigureBFMDemod : public Message { MESSAGE_CLASS_DECLARATION diff --git a/plugins/channel/bfm/bfmdemodgui.cpp b/plugins/channel/bfm/bfmdemodgui.cpp index 5fe4d5dd8..65c707658 100644 --- a/plugins/channel/bfm/bfmdemodgui.cpp +++ b/plugins/channel/bfm/bfmdemodgui.cpp @@ -413,6 +413,13 @@ void BFMDemodGUI::channelSampleRateChanged() void BFMDemodGUI::rdsUpdate() { + // Quality metrics + ui->demodQText->setText(QString::number(m_bfmDemod->getDemodQua(), 'f', 0)); + ui->decoderQText->setText(QString("%1").arg(m_bfmDemod->getDecoderQua())); + Real accDb = CalcDb::dbPower(std::fabs(m_bfmDemod->getDemodAcc())); + ui->accumText->setText(QString::number(accDb, 'f', 1)); + ui->fclkText->setText(QString::number(m_bfmDemod->getDemodFclk(), 'f', 2)); + // PI group if (m_rdsParser.m_pi_updated) { @@ -461,8 +468,7 @@ void BFMDemodGUI::rdsUpdate() { if (*it > 76.0) { - if (!isFirst) - { + if (!isFirst) { os << ", "; } diff --git a/plugins/channel/bfm/bfmdemodgui.ui b/plugins/channel/bfm/bfmdemodgui.ui index 514d76153..7e56ebb1f 100644 --- a/plugins/channel/bfm/bfmdemodgui.ui +++ b/plugins/channel/bfm/bfmdemodgui.ui @@ -6,7 +6,7 @@ 0 0 - 446 + 514 729 @@ -436,10 +436,16 @@ 10 150 - 421 - 91 + 500 + 141 + + + 500 + 0 + + RDS data @@ -447,6 +453,278 @@ 3 + + + + + + + 40 + 0 + + + + + 40 + 16777215 + + + + Dem Q + + + + + + + + 20 + 0 + + + + + 20 + 16777215 + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 10 + 0 + + + + + 10 + 16777215 + + + + % + + + + + + + Qt::Vertical + + + + + + + + 40 + 0 + + + + + 40 + 16777215 + + + + Dec Q + + + + + + + + 20 + 0 + + + + + 20 + 16777215 + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 10 + 0 + + + + + 10 + 16777215 + + + + % + + + + + + + Qt::Vertical + + + + + + + + 40 + 0 + + + + + 40 + 16777215 + + + + Acc + + + + + + + + 40 + 0 + + + + + 40 + 16777215 + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 15 + 0 + + + + + 15 + 16777215 + + + + dB + + + + + + + Qt::Vertical + + + + + + + + 30 + 0 + + + + + 30 + 16777215 + + + + Fclk + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + 1187.50 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 15 + 0 + + + + + 15 + 16777215 + + + + Hz + + + + + + + + + Qt::Horizontal + + + diff --git a/plugins/channel/bfm/rdsdecoder.cpp b/plugins/channel/bfm/rdsdecoder.cpp index fb4f6b38a..7e7f7922b 100644 --- a/plugins/channel/bfm/rdsdecoder.cpp +++ b/plugins/channel/bfm/rdsdecoder.cpp @@ -184,18 +184,21 @@ bool RDSDecoder::frameSync(bool bit) { if (m_wrongBlocksCounter > 35) { + /* qDebug() << "RDSDecoder::frameSync: Lost Sync (Got " << m_wrongBlocksCounter << " bad blocks on " << m_blocksCounter - << " total)"; + << " total)";*/ enter_no_sync(); } else { + /* qDebug() << "RDSDecoder::frameSync: Still Sync-ed (Got " << m_wrongBlocksCounter << " bad blocks on " << m_blocksCounter - << " total)"; + << " total)";*/ } + m_qua = 2.0 * (50 - m_wrongBlocksCounter); m_blocksCounter = 0; m_wrongBlocksCounter = 0; } diff --git a/plugins/channel/bfm/rdsdecoder.h b/plugins/channel/bfm/rdsdecoder.h index bdf000d07..6b70d6635 100644 --- a/plugins/channel/bfm/rdsdecoder.h +++ b/plugins/channel/bfm/rdsdecoder.h @@ -27,6 +27,8 @@ public: bool frameSync(bool bit); unsigned int *getGroup() { return m_group; } + float m_qua; + protected: unsigned int calc_syndrome(unsigned long message, unsigned char mlen); void enter_sync(unsigned int sync_block_number); diff --git a/plugins/channel/bfm/rdsdemod.cpp b/plugins/channel/bfm/rdsdemod.cpp index fdd430bea..f45d324d7 100644 --- a/plugins/channel/bfm/rdsdemod.cpp +++ b/plugins/channel/bfm/rdsdemod.cpp @@ -143,14 +143,18 @@ bool RDSDemod::biphase(Real acc, bool& bit, Real d_cphi) m_parms.reading_frame = 1 - m_parms.reading_frame; } - Real qua = (1.0 * abs(m_parms.tot_errs[0] - m_parms.tot_errs[1]) / (m_parms.tot_errs[0] + m_parms.tot_errs[1])) * 100; + m_report.qua = (1.0 * abs(m_parms.tot_errs[0] - m_parms.tot_errs[1]) / (m_parms.tot_errs[0] + m_parms.tot_errs[1])) * 100; + m_report.acc = acc; + m_report.fclk = (d_cphi / (2 * M_PI)) * m_srate; + + /* qDebug("RDSDemod::biphase: frame: %d acc: %+6.3f errs: %3d %3d qual: %3.0f%% clk: %7.2f", m_parms.reading_frame, acc, m_parms.tot_errs[0], m_parms.tot_errs[1], - qua, - (d_cphi / (2 * M_PI)) * m_srate); + m_report.qua, + m_report.fclk);*/ m_parms.tot_errs[0] = 0; m_parms.tot_errs[1] = 0; diff --git a/plugins/channel/bfm/rdsdemod.h b/plugins/channel/bfm/rdsdemod.h index 203528e80..c10c7527a 100644 --- a/plugins/channel/bfm/rdsdemod.h +++ b/plugins/channel/bfm/rdsdemod.h @@ -34,6 +34,12 @@ public: void setSampleRate(int srate); bool process(Real rdsSample, bool &bit); + struct{ + Real acc; + Real qua; + Real fclk; + } m_report; + protected: bool biphase(Real acc, bool &bit, Real d_cphi); Real filter_lp_2400_iq(Real in, int iqIndex);