From 5096816143a08b39cef227aea7b9b4788a175cb7 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 17 May 2019 22:06:59 +0200 Subject: [PATCH] NFM demod: added high pass audio filter control --- plugins/channelrx/demodnfm/nfmdemod.cpp | 19 +++++++++++++++---- plugins/channelrx/demodnfm/nfmdemod.h | 3 ++- plugins/channelrx/demodnfm/nfmdemodgui.cpp | 7 +++++++ plugins/channelrx/demodnfm/nfmdemodgui.h | 1 + plugins/channelrx/demodnfm/nfmdemodgui.ui | 14 ++++++++++++++ .../channelrx/demodnfm/nfmdemodsettings.cpp | 3 +++ plugins/channelrx/demodnfm/nfmdemodsettings.h | 1 + 7 files changed, 43 insertions(+), 5 deletions(-) diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index dc5518277..bb9bd5573 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -90,7 +90,7 @@ NFMDemod::NFMDemod(DeviceAPI *devieAPI) : m_ctcssDetector.setCoefficients(m_audioSampleRate/16, m_audioSampleRate/8.0f); // 0.5s / 2 Hz resolution m_afSquelch.setCoefficients(m_audioSampleRate/2000, 600, m_audioSampleRate, 200, 0, afSqTones); // 0.5ms test period, 300ms average span, audio SR, 100ms attack, no decay - m_lowpass.create(301, m_audioSampleRate, 250.0); + m_ctcssLowpass.create(301, m_audioSampleRate, 250.0); applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -247,7 +247,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto { if (m_settings.m_ctcssOn) { - Real ctcss_sample = m_lowpass.filter(demod * m_discriCompensation); + Real ctcss_sample = m_ctcssLowpass.filter(demod * m_discriCompensation); if ((m_sampleCount & 7) == 7) // decimate 48k -> 6k { @@ -287,7 +287,11 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto } else { - sample = m_bandpass.filter(m_squelchDelayLine.readBack(m_squelchGate)) * m_settings.m_volume; + if (m_settings.m_highPass) { + sample = m_bandpass.filter(m_squelchDelayLine.readBack(m_squelchGate)) * m_settings.m_volume; + } else { + sample = m_lowpass.filter(m_squelchDelayLine.readBack(m_squelchGate)) * m_settings.m_volume; + } } } else @@ -436,8 +440,9 @@ void NFMDemod::applyAudioSampleRate(int sampleRate) m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth / 2.2f); m_interpolatorDistanceRemain = 0; m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate; - m_lowpass.create(301, sampleRate, 250.0); + m_ctcssLowpass.create(301, sampleRate, 250.0); m_bandpass.create(301, sampleRate, 300.0, m_settings.m_afBandwidth); + m_lowpass.create(301, sampleRate, m_settings.m_afBandwidth); m_squelchGate = (sampleRate / 100) * m_settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate m_squelchCount = 0; // reset squelch open counter m_ctcssDetector.setCoefficients(sampleRate/16, sampleRate/8.0f); // 0.5s / 2 Hz resolution @@ -499,6 +504,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) << " m_squelch: " << settings.m_squelch << " m_ctcssIndex: " << settings.m_ctcssIndex << " m_ctcssOn: " << settings.m_ctcssOn + << " m_highPass: " << m_settings.m_highPass << " m_audioMute: " << settings.m_audioMute << " m_audioDeviceName: " << settings.m_audioDeviceName << " m_useReverseAPI: " << settings.m_useReverseAPI @@ -550,6 +556,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) reverseAPIKeys.append("afBandwidth"); m_settingsMutex.lock(); m_bandpass.create(301, m_audioSampleRate, 300.0, settings.m_afBandwidth); + m_lowpass.create(301, m_audioSampleRate, settings.m_afBandwidth); m_settingsMutex.unlock(); } @@ -591,6 +598,10 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) setSelectedCtcssIndex(settings.m_ctcssIndex); } + if ((settings.m_highPass != m_settings.m_highPass) || force) { + reverseAPIKeys.append("highPass"); + } + if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { reverseAPIKeys.append("audioDeviceName"); diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index a4510edb1..41978529b 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -220,8 +220,9 @@ private: Interpolator m_interpolator; Real m_interpolatorDistance; Real m_interpolatorDistanceRemain; - Lowpass m_lowpass; + Lowpass m_ctcssLowpass; Bandpass m_bandpass; + Lowpass m_lowpass; CTCSSDetector m_ctcssDetector; int m_ctcssIndex; // 0 for nothing detected int m_ctcssIndexSelected; diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index 606ed6a34..010d9166f 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -201,6 +201,12 @@ void NFMDemodGUI::on_ctcssOn_toggled(bool checked) applySettings(); } +void NFMDemodGUI::on_highPassFilter_toggled(bool checked) +{ + m_settings.m_highPass = checked; + applySettings(); +} + void NFMDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; @@ -398,6 +404,7 @@ void NFMDemodGUI::displaySettings() } ui->ctcssOn->setChecked(m_settings.m_ctcssOn); + ui->highPassFilter->setChecked(m_settings.m_highPass); ui->audioMute->setChecked(m_settings.m_audioMute); ui->ctcss->setCurrentIndex(m_settings.m_ctcssIndex); diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.h b/plugins/channelrx/demodnfm/nfmdemodgui.h index 5dd19ede4..2c8ea09f2 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.h +++ b/plugins/channelrx/demodnfm/nfmdemodgui.h @@ -76,6 +76,7 @@ private slots: void on_squelch_valueChanged(int value); void on_ctcss_currentIndexChanged(int index); void on_ctcssOn_toggled(bool checked); + void on_highPassFilter_toggled(bool checked); void on_audioMute_toggled(bool checked); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.ui b/plugins/channelrx/demodnfm/nfmdemodgui.ui index fc8fe0075..d7cb4820c 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.ui +++ b/plugins/channelrx/demodnfm/nfmdemodgui.ui @@ -574,6 +574,20 @@ + + + + High pass audio filter + + + + + + + :/filter_highpass.png:/filter_highpass.png + + + diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp index be4b187d9..920e20dc1 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp @@ -53,6 +53,7 @@ void NFMDemodSettings::resetToDefaults() m_rgbColor = QColor(255, 0, 0).rgb(); m_title = "NFM Demodulator"; m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; + m_highPass = true; m_useReverseAPI = false; m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; @@ -68,6 +69,7 @@ QByteArray NFMDemodSettings::serialize() const s.writeS32(3, m_afBandwidth/1000.0); s.writeS32(4, m_volume*10.0); s.writeS32(5, static_cast(m_squelch)); + s.writeBool(6, m_highPass); s.writeU32(7, m_rgbColor); s.writeS32(8, m_ctcssIndex); s.writeBool(9, m_ctcssOn); @@ -123,6 +125,7 @@ bool NFMDemodSettings::deserialize(const QByteArray& data) m_volume = tmp / 10.0; d.readS32(5, &tmp, -30); m_squelch = (tmp < -100 ? tmp/10 : tmp) * 1.0; + d.readBool(6, &m_highPass, true); d.readU32(7, &m_rgbColor, QColor(255, 0, 0).rgb()); d.readS32(8, &m_ctcssIndex, 0); d.readBool(9, &m_ctcssOn, false); diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.h b/plugins/channelrx/demodnfm/nfmdemodsettings.h index 35043e0de..bbad59173 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.h +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.h @@ -42,6 +42,7 @@ struct NFMDemodSettings quint32 m_rgbColor; QString m_title; QString m_audioDeviceName; + bool m_highPass; bool m_useReverseAPI; QString m_reverseAPIAddress; uint16_t m_reverseAPIPort;