From 7663a9bc1dae8289934b534365bb2b2bfc8b6ac9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 4 Oct 2015 10:50:26 +0200 Subject: [PATCH] SSB demod: added display of channel power in dB. Changed minus radio button for a iconified toggle button --- plugins/channel/ssb/ssbdemod.cpp | 12 +- plugins/channel/ssb/ssbdemod.h | 3 + plugins/channel/ssb/ssbdemodgui.cpp | 14 +- plugins/channel/ssb/ssbdemodgui.h | 5 +- plugins/channel/ssb/ssbdemodgui.ui | 515 +++++++++++++++------------- 5 files changed, 311 insertions(+), 238 deletions(-) diff --git a/plugins/channel/ssb/ssbdemod.cpp b/plugins/channel/ssb/ssbdemod.cpp index 224de0a43..48ae8e7c4 100644 --- a/plugins/channel/ssb/ssbdemod.cpp +++ b/plugins/channel/ssb/ssbdemod.cpp @@ -85,7 +85,8 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto for(SampleVector::const_iterator it = begin; it < end; ++it) { - Complex c(it->real() / 32768.0, it->imag() / 32768.0); + //Complex c(it->real() / 32768.0, it->imag() / 32768.0); + Complex c(it->real(), it->imag()); c *= m_nco.nextIQ(); if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &ci)) @@ -100,7 +101,8 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto for (int i = 0; i < n_out; i++) { - Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7 * 32768.0; + //Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7 * 32768.0; + Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7; // Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display // smart decimation with bit gain using float arithmetic (23 bits significand) @@ -109,7 +111,11 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if (!(m_undersampleCount++ & decim_mask)) { - avg = (sum.real() + sum.imag()) * 0.7 * 32768.0 / decim; + Real avgr = sum.real() / decim; + Real avgi = sum.imag() / decim; + m_magsq = (avgr * avgr + avgi * avgi) / (1<<30); + //avg = (sum.real() + sum.imag()) * 0.7 * 32768.0 / decim; + avg = (avgr + avgi) * 0.7; m_sampleBuffer.push_back(Sample(avg, 0.0)); sum.real() = 0.0; sum.imag() = 0.0; diff --git a/plugins/channel/ssb/ssbdemod.h b/plugins/channel/ssb/ssbdemod.h index a8e2ceb64..28c6518e8 100644 --- a/plugins/channel/ssb/ssbdemod.h +++ b/plugins/channel/ssb/ssbdemod.h @@ -41,6 +41,8 @@ public: virtual void stop(); virtual bool handleMessage(const Message& cmd); + Real getMagSq() const { return m_magsq; } + private: class MsgConfigureSSBDemod : public Message { MESSAGE_CLASS_DECLARATION @@ -85,6 +87,7 @@ private: int m_sampleRate; int m_frequency; bool m_usb; + Real m_magsq; NCO m_nco; Interpolator m_interpolator; diff --git a/plugins/channel/ssb/ssbdemodgui.cpp b/plugins/channel/ssb/ssbdemodgui.cpp index 8c7127fc3..0264f8499 100644 --- a/plugins/channel/ssb/ssbdemodgui.cpp +++ b/plugins/channel/ssb/ssbdemodgui.cpp @@ -11,6 +11,7 @@ #include "gui/glspectrum.h" #include "plugin/pluginapi.h" #include "util/simpleserializer.h" +#include "util/db.h" #include "gui/basicchannelsettingswidget.h" #include "dsp/dspengine.h" #include "mainwindow.h" @@ -131,7 +132,7 @@ void SSBDemodGUI::viewChanged() applySettings(); } -void SSBDemodGUI::on_deltaMinus_clicked(bool minus) +void SSBDemodGUI::on_deltaMinus_toggled(bool minus) { int deltaFrequency = m_channelMarker.getCenterFrequency(); bool minusDelta = (deltaFrequency < 0); @@ -255,7 +256,8 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : m_basicSettingsShown(false), m_doApplySettings(true), m_rate(6000), - m_spanLog2(3) + m_spanLog2(3), + m_channelPowerDbAvg(20,0) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); @@ -277,6 +279,8 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : ui->glSpectrum->setSsbSpectrum(true); ui->glSpectrum->connectTimer(m_pluginAPI->getMainWindow()->getMasterTimer()); + connect(&m_pluginAPI->getMainWindow()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); + //m_channelMarker = new ChannelMarker(this); m_channelMarker.setColor(Qt::green); m_channelMarker.setBandwidth(m_rate); @@ -388,3 +392,9 @@ void SSBDemodGUI::enterEvent(QEvent*) blockApplySettings(false); } +void SSBDemodGUI::tick() +{ + Real powDb = CalcDb::dbPower(m_ssbDemod->getMagSq()); + m_channelPowerDbAvg.feed(powDb); + ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); +} diff --git a/plugins/channel/ssb/ssbdemodgui.h b/plugins/channel/ssb/ssbdemodgui.h index 03373a6ae..a56eaf875 100644 --- a/plugins/channel/ssb/ssbdemodgui.h +++ b/plugins/channel/ssb/ssbdemodgui.h @@ -4,6 +4,7 @@ #include "gui/rollupwidget.h" #include "plugin/plugingui.h" #include "dsp/channelmarker.h" +#include "dsp/movingaverage.h" class PluginAPI; @@ -38,13 +39,14 @@ public: private slots: void viewChanged(); void on_deltaFrequency_changed(quint64 value); - void on_deltaMinus_clicked(bool minus); + void on_deltaMinus_toggled(bool minus); void on_BW_valueChanged(int value); void on_lowCut_valueChanged(int value); void on_volume_valueChanged(int value); void on_spanLog2_valueChanged(int value); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDoubleClicked(); + void tick(); private: Ui::SSBDemodGUI* ui; @@ -54,6 +56,7 @@ private: bool m_doApplySettings; int m_rate; int m_spanLog2; + MovingAverage m_channelPowerDbAvg; ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; diff --git a/plugins/channel/ssb/ssbdemodgui.ui b/plugins/channel/ssb/ssbdemodgui.ui index d58ca69c5..8bd343e19 100644 --- a/plugins/channel/ssb/ssbdemodgui.ui +++ b/plugins/channel/ssb/ssbdemodgui.ui @@ -7,7 +7,7 @@ 0 0 302 - 510 + 537 @@ -22,16 +22,19 @@ - 35 + 5 35 - 242 - 96 + 281 + 349 Settings - + + + 3 + 2 @@ -44,229 +47,272 @@ 2 - - 3 - - - - - -60 - - - 60 - - - 1 - - - 30 - - - Qt::Horizontal - - + + + + + + ... + + + + :/plus.png + :/minus.png + + + + true + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Monospace + 12 + + + + SizeVerCursor + + + Qt::StrongFocus + + + Demod shift frequency from center in Hz + + + + + + + Hz + + + + + + + Channel power + + + Qt::RightToLeft + + + 0.0 + + + + + + + dB + + + + - - - - - 50 - 0 - - - - 2.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + + + + + Span + + + + + + + 1 + + + 5 + + + 1 + + + 3 + + + 3 + + + Qt::Horizontal + + + true + + + true + + + + + + + 6.0k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + - - - - - 50 - 0 - - - - 3.0k - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + + + + + BW + + + + + + + -60 + + + 60 + + + 1 + + + 30 + + + Qt::Horizontal + + + + + + + + 50 + 0 + + + + 3.0k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + - - - - 100 - - - 20 - - - Qt::Horizontal - - + + + + + + Low cut + + + + + + + + 50 + 0 + + + + 0.3k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -60 + + + 60 + + + 1 + + + 3 + + + Qt::Horizontal + + + + - - - - - 0 - 0 - - - - - 32 - 16 - - - - - Monospace - 12 - - - - SizeVerCursor - - - Qt::StrongFocus - - - Demod shift frequency from center in Hz - - - - - - - Hz - - - - - - - Volume - - - - - - - Bandwidth - - - - - - - Span - - - - - - - Low cutoff - - - - - - - Qt::RightToLeft - - - Minus - - - - - - - -60 - - - 60 - - - 1 - - - 3 - - - Qt::Horizontal - - - - - - - - 50 - 0 - - - - 0.3k - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 6.0k - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 1 - - - 5 - - - 1 - - - 3 - - - 3 - - - Qt::Horizontal - - - true - - - true - - + + + + + + Vol + + + + + + + 100 + + + 20 + + + Qt::Horizontal + + + + + + + + 50 + 0 + + + + 2.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + - 40 - 140 + 30 + 390 218 284 @@ -307,24 +353,15 @@ - + + glSpectrum + glSpectrum + - - GLSpectrum - QWidget -
gui/glspectrum.h
- 1 -
- - GLSpectrumGUI - QWidget -
gui/glspectrumgui.h
- 1 -
RollupWidget QWidget @@ -337,7 +374,21 @@
gui/valuedial.h
1
+ + GLSpectrum + QWidget +
gui/glspectrum.h
+ 1 +
+ + GLSpectrumGUI + QWidget +
gui/glspectrumgui.h
+ 1 +
- + + +