From 5009f0a7a0820586c1cab3da31b9192a3415a7e1 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 25 Feb 2019 01:47:41 +0100 Subject: [PATCH] FreeDV demodulator: set filters and channelizer depending on mode bandwidth requirements --- plugins/channelrx/demodfreedv/freedvdemod.cpp | 81 ++++++++++++------- plugins/channelrx/demodfreedv/freedvdemod.h | 1 + 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/plugins/channelrx/demodfreedv/freedvdemod.cpp b/plugins/channelrx/demodfreedv/freedvdemod.cpp index 1e7779cf1..23472ff35 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemod.cpp @@ -360,45 +360,60 @@ void FreeDVDemod::applyAudioSampleRate(int sampleRate) { qDebug("FreeDVDemod::applyAudioSampleRate: %d", sampleRate); - MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create( - sampleRate, m_settings.m_inputFrequencyOffset); - m_inputMessageQueue.push(channelConfigMsg); - m_settingsMutex.lock(); - - m_interpolator.create(16, m_inputSampleRate, m_hiCutoff * 1.5f, 2.0f); - m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate; - - SSBFilter->create_filter(m_lowCutoff / (float) sampleRate, m_hiCutoff / (float) sampleRate); - - int agcNbSamples = (sampleRate / 1000) * (1<push(cfg); + MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create( + modemSampleRate, m_settings.m_inputFrequencyOffset); + m_inputMessageQueue.push(channelConfigMsg); + + m_interpolator.create(16, m_inputSampleRate, m_hiCutoff * 1.5f, 2.0f); + m_interpolatorDistanceRemain = 0; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) modemSampleRate; + + SSBFilter->create_filter(m_lowCutoff / (float) modemSampleRate, m_hiCutoff / (float) modemSampleRate); + + int agcNbSamples = (modemSampleRate / 1000) * (1<push(cfg); + } } + + m_settingsMutex.unlock(); } void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) @@ -510,6 +525,10 @@ void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) reverseAPIKeys.append("agc"); } + if ((settings.m_freeDVMode != m_settings.m_freeDVMode) || force) { + applyFreeDVMode(settings.m_freeDVMode); + } + m_spanLog2 = settings.m_spanLog2; m_audioMute = settings.m_audioMute; m_agcActive = settings.m_agc; diff --git a/plugins/channelrx/demodfreedv/freedvdemod.h b/plugins/channelrx/demodfreedv/freedvdemod.h index 25324c51c..594193421 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.h +++ b/plugins/channelrx/demodfreedv/freedvdemod.h @@ -319,6 +319,7 @@ private: void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); void applySettings(const FreeDVDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); + void applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode); void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const FreeDVDemodSettings& settings); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiReverseSendSettings(QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force);