From f2b2fa14258fb8be5acaad10579ad0fe4a0b7925 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 13 Jul 2020 22:00:15 +0200 Subject: [PATCH] Channel Analyzer: fixed sink apply channel settings. Fixes #569 and #570 --- .../chanalyzer/chanalyzerbaseband.cpp | 21 +++++++--- .../channelrx/chanalyzer/chanalyzerbaseband.h | 1 + .../channelrx/chanalyzer/chanalyzersink.cpp | 41 ++++++------------- plugins/channelrx/chanalyzer/chanalyzersink.h | 3 +- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp index 4afcc5760..464246e8d 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp @@ -137,9 +137,9 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd) qDebug() << "ChannelAnalyzerBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate(); m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(notif.getSampleRate())); m_channelizer->setBasebandSampleRate(notif.getSampleRate()); - unsigned int desiredSampleRate = notif.getSampleRate() / (1<setChannelization(desiredSampleRate, m_settings.m_inputFrequencyOffset); - m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset()); return true; } @@ -152,17 +152,25 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd) void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force) { if ((settings.m_log2Decim != m_settings.m_log2Decim) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)|| force) + || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) + || (settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) + || (settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force) { - unsigned int desiredSampleRate = m_channelizer->getBasebandSampleRate() / (1<setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset); - m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset()); } m_sink.applySettings(settings, force); m_settings = settings; } +int ChannelAnalyzerBaseband::getSinkSampleRate(ChannelAnalyzerSettings settings) +{ + int normalSinkSampleRate = m_channelizer->getBasebandSampleRate() / (1<getChannelSampleRate(); @@ -172,5 +180,6 @@ int ChannelAnalyzerBaseband::getChannelSampleRate() const void ChannelAnalyzerBaseband::setBasebandSampleRate(int sampleRate) { m_channelizer->setBasebandSampleRate(sampleRate); - m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + int desiredSampleRate = getSinkSampleRate(m_settings); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset()); } \ No newline at end of file diff --git a/plugins/channelrx/chanalyzer/chanalyzerbaseband.h b/plugins/channelrx/chanalyzer/chanalyzerbaseband.h index 709c440f6..2298b6983 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerbaseband.h +++ b/plugins/channelrx/chanalyzer/chanalyzerbaseband.h @@ -85,6 +85,7 @@ private: bool handleMessage(const Message& cmd); void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); + int getSinkSampleRate(ChannelAnalyzerSettings settngs); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/chanalyzer/chanalyzersink.cpp b/plugins/channelrx/chanalyzer/chanalyzersink.cpp index a3abea600..43295a685 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersink.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzersink.cpp @@ -63,7 +63,11 @@ void ChannelAnalyzerSink::feed(const SampleVector::const_iterator& begin, const Complex c(it->real(), it->imag()); c *= m_nco.nextIQ(); - if (m_settings.m_rationalDownSample) + if (m_interpolatorDistance == 1) + { + processOneSample(c, sideband); + } + else { if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci)) { @@ -71,10 +75,6 @@ void ChannelAnalyzerSink::feed(const SampleVector::const_iterator& begin, const m_interpolatorDistanceRemain += m_interpolatorDistance; } } - else - { - processOneSample(c, sideband); - } } if (m_sampleSink) { @@ -130,10 +130,11 @@ void ChannelAnalyzerSink::processOneSample(Complex& c, fftfilt::cmplx *sideband) } } -void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) +void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force) { qDebug() << "ChannelAnalyzerSink::applyChannelSettings:" << " channelSampleRate: " << channelSampleRate + << " sinkSampleRate: " << sinkSampleRate << " channelFrequencyOffset: " << channelFrequencyOffset; if ((m_channelFrequencyOffset != channelFrequencyOffset) || @@ -142,13 +143,13 @@ void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channe m_nco.setFreq(-channelFrequencyOffset, channelSampleRate); } - if ((m_channelSampleRate != channelSampleRate) || force) + if ((m_channelSampleRate != channelSampleRate) + || (m_sinkSampleRate != sinkSampleRate) || force) { m_interpolator.create(16, channelSampleRate, channelSampleRate / 2.2f); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) channelSampleRate / (Real) m_settings.m_rationalDownSamplerRate; + m_interpolatorDistance = (Real) channelSampleRate / (Real) sinkSampleRate; - int sinkSampleRate = m_settings.m_rationalDownSample ? m_settings.m_rationalDownSamplerRate : channelSampleRate; setFilters(sinkSampleRate, m_settings.m_bandwidth, m_settings.m_lowCutoff); m_pll.setSampleRate(sinkSampleRate); m_fll.setSampleRate(sinkSampleRate); @@ -156,6 +157,7 @@ void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channe m_channelSampleRate = channelSampleRate; m_channelFrequencyOffset = channelFrequencyOffset; + m_sinkSampleRate = sinkSampleRate; } void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowCutoff) @@ -202,32 +204,15 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, << " m_pllPskOrder: " << settings.m_pllPskOrder << " m_inputType: " << (int) settings.m_inputType; - if ((settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) || force) - { - m_interpolator.create(16, m_channelSampleRate, m_channelSampleRate / 2.2); - m_interpolatorDistanceRemain = 0.0f; - m_interpolatorDistance = (Real) m_channelSampleRate / (Real) settings.m_rationalDownSamplerRate; - } - - if ((settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force) - { - int sinkSampleRate = settings.m_rationalDownSample ? settings.m_rationalDownSamplerRate : m_channelSampleRate; - - setFilters(sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff); - m_pll.setSampleRate(sinkSampleRate); - m_fll.setSampleRate(sinkSampleRate); - } - if ((settings.m_bandwidth != m_settings.m_bandwidth) || (settings.m_lowCutoff != m_settings.m_lowCutoff)|| force) { - int sinkSampleRate = settings.m_rationalDownSample ? settings.m_rationalDownSamplerRate : m_channelSampleRate; - setFilters(sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff); + setFilters(m_sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff); } if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force) { - float sinkSampleRate = settings.m_rationalDownSample ? (float) settings.m_rationalDownSamplerRate : (float) m_channelSampleRate; + float sinkSampleRate = (float) m_sinkSampleRate; RRCFilter->create_rrc_filter(settings.m_bandwidth / sinkSampleRate, settings.m_rrcRolloff / 100.0); } diff --git a/plugins/channelrx/chanalyzer/chanalyzersink.h b/plugins/channelrx/chanalyzer/chanalyzersink.h index a6d374c1e..8014529a6 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersink.h +++ b/plugins/channelrx/chanalyzer/chanalyzersink.h @@ -40,7 +40,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); - void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); + void applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force = false); void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); double getMagSq() const { return m_magsq; } @@ -57,6 +57,7 @@ public: private: int m_channelSampleRate; int m_channelFrequencyOffset; + int m_sinkSampleRate; ChannelAnalyzerSettings m_settings; bool m_usb;