From 375f327004587d5c64834e92c7b1fd2d22b4b50c Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 12 May 2017 19:21:52 +0200 Subject: [PATCH] AM Demod: added optional bandpass boxcar filter --- doc/img/AMDemod_plugin.png | Bin 17064 -> 19452 bytes plugins/channelrx/demodam/amdemod.cpp | 15 ++++++---- plugins/channelrx/demodam/amdemod.h | 35 ++++++++++++++--------- plugins/channelrx/demodam/amdemodgui.cpp | 13 ++++++++- plugins/channelrx/demodam/amdemodgui.h | 1 + plugins/channelrx/demodam/amdemodgui.ui | 31 +++++++++++++++++++- plugins/channelrx/demodam/readme.md | 10 +++++-- 7 files changed, 81 insertions(+), 24 deletions(-) diff --git a/doc/img/AMDemod_plugin.png b/doc/img/AMDemod_plugin.png index d54b27b8b22cfc552357a689c922e412c8a8239b..3411640e01ff5fdbdf4eaa43b229e070d102603a 100644 GIT binary patch literal 19452 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 literal 17064 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 X@p*!7a}fN11dOremoveAudioSink(&m_audioFifo); } -void AMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real volume, Real squelch, bool audioMute) +void AMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real volume, Real squelch, bool audioMute, bool bandpassEnable) { - Message* cmd = MsgConfigureAMDemod::create(rfBandwidth, volume, squelch, audioMute); + Message* cmd = MsgConfigureAMDemod::create(rfBandwidth, volume, squelch, audioMute, bandpassEnable); messageQueue->push(cmd); } @@ -157,6 +157,7 @@ bool AMDemod::handleMessage(const Message& cmd) m_config.m_volume = cfg.getVolume(); m_config.m_squelch = cfg.getSquelch(); m_config.m_audioMute = cfg.getAudioMute(); + m_config.m_bandpassEnable = cfg.getBandpassEnable(); apply(); @@ -164,7 +165,8 @@ bool AMDemod::handleMessage(const Message& cmd) << " m_rfBandwidth: " << m_config.m_rfBandwidth << " m_volume: " << m_config.m_volume << " m_squelch: " << m_config.m_squelch - << " m_audioMute: " << m_config.m_audioMute; + << " m_audioMute: " << m_config.m_audioMute + << " m_bandpassEnable: " << m_config.m_bandpassEnable; return true; } @@ -185,12 +187,14 @@ void AMDemod::apply() if((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || (m_config.m_rfBandwidth != m_running.m_rfBandwidth) || - (m_config.m_audioSampleRate != m_running.m_audioSampleRate)) + (m_config.m_audioSampleRate != m_running.m_audioSampleRate) || + (m_config.m_bandpassEnable != m_running.m_bandpassEnable)) { m_settingsMutex.lock(); - m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.2); + m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.2f); m_interpolatorDistanceRemain = 0; m_interpolatorDistance = (Real) m_config.m_inputSampleRate / (Real) m_config.m_audioSampleRate; + m_bandpass.create(301, m_config.m_audioSampleRate, 300.0, m_config.m_rfBandwidth / 2.0f); m_settingsMutex.unlock(); } @@ -207,4 +211,5 @@ void AMDemod::apply() m_running.m_volume = m_config.m_volume; m_running.m_audioSampleRate = m_config.m_audioSampleRate; m_running.m_audioMute = m_config.m_audioMute; + m_running.m_bandpassEnable = m_config.m_bandpassEnable; } diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index ca7b11697..3610feda8 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -24,6 +24,7 @@ #include "dsp/interpolator.h" #include "dsp/movingaverage.h" #include "dsp/agc.h" +#include "dsp/bandpass.h" #include "audio/audiofifo.h" #include "util/message.h" @@ -33,7 +34,7 @@ public: AMDemod(); ~AMDemod(); - void configure(MessageQueue* messageQueue, Real rfBandwidth, Real volume, Real squelch, bool audioMute); + void configure(MessageQueue* messageQueue, Real rfBandwidth, Real volume, Real squelch, bool audioMute, bool bandpassEnable); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); @@ -62,10 +63,11 @@ private: Real getVolume() const { return m_volume; } Real getSquelch() const { return m_squelch; } bool getAudioMute() const { return m_audioMute; } + bool getBandpassEnable() const { return m_bandpassEnable; } - static MsgConfigureAMDemod* create(Real rfBandwidth, Real volume, Real squelch, bool audioMute) + static MsgConfigureAMDemod* create(Real rfBandwidth, Real volume, Real squelch, bool audioMute, bool bandpassEnable) { - return new MsgConfigureAMDemod(rfBandwidth, volume, squelch, audioMute); + return new MsgConfigureAMDemod(rfBandwidth, volume, squelch, audioMute, bandpassEnable); } private: @@ -73,13 +75,15 @@ private: Real m_volume; Real m_squelch; bool m_audioMute; + bool m_bandpassEnable; - MsgConfigureAMDemod(Real rfBandwidth, Real volume, Real squelch, bool audioMute) : + MsgConfigureAMDemod(Real rfBandwidth, Real volume, Real squelch, bool audioMute, bool bandpassEnable) : Message(), m_rfBandwidth(rfBandwidth), m_volume(volume), m_squelch(squelch), - m_audioMute(audioMute) + m_audioMute(audioMute), + m_bandpassEnable(bandpassEnable) { } }; @@ -102,6 +106,7 @@ private: Real m_volume; quint32 m_audioSampleRate; bool m_audioMute; + bool m_bandpassEnable; Config() : m_inputSampleRate(-1), @@ -110,7 +115,8 @@ private: m_squelch(0), m_volume(0), m_audioSampleRate(0), - m_audioMute(false) + m_audioMute(false), + m_bandpassEnable(false) { } }; @@ -132,6 +138,7 @@ private: MovingAverage m_movingAverage; SimpleAGC m_volumeAGC; + Bandpass m_bandpass; AudioVector m_audioBuffer; uint m_audioBufferFill; @@ -180,18 +187,18 @@ private: if ((m_squelchCount >= m_running.m_audioSampleRate / 20) && !m_running.m_audioMute) { Real demod = sqrt(magsq); - - if (demod > 1) - { - demod = 1; - } - m_volumeAGC.feed(demod); demod /= m_volumeAGC.getValue(); + + if (m_running.m_bandpassEnable) + { + demod = m_bandpass.filter(demod); + demod /= 301.0f; + } + Real attack = m_squelchCount / (0.1f * m_running.m_audioSampleRate); sample = (0.5 - demod) * attack * 2048 * m_running.m_volume; -// demod *= ((0.003 * attack) / m_volumeAGC.getValue()); -// sample = demod * 32700 * 16; + m_squelchOpen = true; } else diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp index d47e58733..f1a72ff01 100644 --- a/plugins/channelrx/demodam/amdemodgui.cpp +++ b/plugins/channelrx/demodam/amdemodgui.cpp @@ -88,6 +88,7 @@ QByteArray AMDemodGUI::serialize() const s.writeS32(4, ui->volume->value()); s.writeS32(5, ui->squelch->value()); s.writeU32(7, m_channelMarker.getColor().rgb()); + s.writeBool(8, ui->bandpassEnable->isChecked()); return s.final(); } @@ -106,6 +107,7 @@ bool AMDemodGUI::deserialize(const QByteArray& data) QByteArray bytetmp; quint32 u32tmp; qint32 tmp; + bool boolTmp; blockApplySettings(true); m_channelMarker.blockSignals(true); @@ -126,6 +128,9 @@ bool AMDemodGUI::deserialize(const QByteArray& data) m_channelMarker.setColor(u32tmp); } + d.readBool(8, &boolTmp, false); + ui->bandpassEnable->setChecked(boolTmp); + blockApplySettings(false); m_channelMarker.blockSignals(false); @@ -169,6 +174,11 @@ void AMDemodGUI::on_deltaFrequency_changed(quint64 value) } } +void AMDemodGUI::on_bandpassEnable_toggled(bool checked) +{ + applySettings(); +} + void AMDemodGUI::on_rfBW_valueChanged(int value) { ui->rfBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1)); @@ -284,7 +294,8 @@ void AMDemodGUI::applySettings() ui->rfBW->value() * 100.0, ui->volume->value() / 10.0, ui->squelch->value(), - ui->audioMute->isChecked()); + ui->audioMute->isChecked(), + ui->bandpassEnable->isChecked()); } } diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h index 1fdba60ef..9d477e81e 100644 --- a/plugins/channelrx/demodam/amdemodgui.h +++ b/plugins/channelrx/demodam/amdemodgui.h @@ -41,6 +41,7 @@ private slots: void viewChanged(); void on_deltaFrequency_changed(quint64 value); void on_deltaMinus_toggled(bool minus); + void on_bandpassEnable_toggled(bool checked); void on_rfBW_valueChanged(int value); void on_volume_valueChanged(int value); void on_squelch_valueChanged(int value); diff --git a/plugins/channelrx/demodam/amdemodgui.ui b/plugins/channelrx/demodam/amdemodgui.ui index b3324f56f..a6c4ec6c1 100644 --- a/plugins/channelrx/demodam/amdemodgui.ui +++ b/plugins/channelrx/demodam/amdemodgui.ui @@ -56,7 +56,16 @@ 3 - + + 2 + + + 2 + + + 2 + + 2 @@ -224,6 +233,21 @@ + + + + Toggle boxcar bandpass filter with 300 Hz low cuttof + + + + :/filter_bandpass.png + :/filter_bandpass.png:/filter_bandpass.png + + + true + + + @@ -381,6 +405,11 @@
gui/levelmeter.h
1 + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
diff --git a/plugins/channelrx/demodam/readme.md b/plugins/channelrx/demodam/readme.md index 8ac81f396..bacc42b48 100644 --- a/plugins/channelrx/demodam/readme.md +++ b/plugins/channelrx/demodam/readme.md @@ -30,14 +30,18 @@ Use this button to toggle audio mute for this channel. The button will light up - bottom bar (blue green): instantaneous peak value - tip vertical bar (bright green): peak hold value -

6: RF bandwidth

+

6:Bandpass boxcar filter toggle

+ +Use this button to enable or disable the bandpass boxcar (sharp) filter with low cutoff at 300 Hz and high cutoff at half the RF bandwidth. This may help readibility of low signals on air traffic communications but degrades audio on comfortable AM broadcast transmissions. + +

7: RF bandwidth

This is the bandwidth in kHz of the channel signal before demodulation. It can be set continuously in 1 kHz steps from 1 to 40 kHz. -

7: Volume

+

8: Volume

This is the volume of the audio signal from 0.0 (mute) to 10.0 (maximum). It can be varied continuously in 0.1 steps using the dial button. -

8: Squelch threshold

+

9: Squelch threshold

This is the squelch threshold in dB. The average total power received in the signal bandwidth before demodulation is compared to this value and the squelch input is open above this value. It can be varied continuously in 0.1 dB steps from 0.0 to -100.0 dB using the dial button.