From 82047f69ce250abf7e8051cd21300c0a443387ae Mon Sep 17 00:00:00 2001 From: Hexameron Date: Mon, 19 May 2014 15:22:44 +0100 Subject: [PATCH] Consistant Waterfall speed. Saves cpu at high bandwidths. --- include/dsp/samplesource/samplesource.h | 1 + plugins/samplesource/rtlsdr/rtlsdrinput.cpp | 6 ++ plugins/samplesource/rtlsdr/rtlsdrinput.h | 1 + sdrbase/dsp/dspengine.cpp | 70 +++------------------ 4 files changed, 15 insertions(+), 63 deletions(-) diff --git a/include/dsp/samplesource/samplesource.h b/include/dsp/samplesource/samplesource.h index 1e50c993a..9edf524e1 100644 --- a/include/dsp/samplesource/samplesource.h +++ b/include/dsp/samplesource/samplesource.h @@ -45,6 +45,7 @@ public: virtual const QString& getDeviceDescription() const = 0; virtual int getSampleRate() const = 0; + virtual int wfdecimation() const = 0; virtual quint64 getCenterFrequency() const = 0; virtual bool handleMessage(Message* message) = 0; diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index f114f4925..05e0218b2 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -185,6 +185,12 @@ int RTLSDRInput::getSampleRate() const return 1536000 / (1 << m_settings.m_decimation); } +int RTLSDRInput::wfdecimation() const +{ + // decimate waterfall more when downsampling less + return (1 << (4 - m_settings.m_decimation) ) -1; +} + quint64 RTLSDRInput::getCenterFrequency() const { return m_generalSettings.m_centerFrequency; diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.h b/plugins/samplesource/rtlsdr/rtlsdrinput.h index d171af1ad..bad62c221 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.h +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.h @@ -87,6 +87,7 @@ public: const QString& getDeviceDescription() const; int getSampleRate() const; + int wfdecimation() const; quint64 getCenterFrequency() const; bool handleMessage(Message* message); diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index 369403f39..3e805ec38 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -196,6 +196,7 @@ void DSPEngine::imbalance(SampleVector::iterator begin, SampleVector::iterator e it->m_imag = (it->m_imag * m_imbalance) >> 16; } +int drop_frame = 0; void DSPEngine::work() { SampleFifo* sampleFifo = m_sampleSource->getSampleFifo(); @@ -210,6 +211,12 @@ void DSPEngine::work() size_t count = sampleFifo->readBegin(sampleFifo->fill(), &part1begin, &part1end, &part2begin, &part2end); + if (m_sampleSource->wfdecimation() & drop_frame++) { + sampleFifo->readCommit(count); + samplesDone += count; + continue; + } + // first part of FIFO data if(part1begin != part1end) { // correct stuff @@ -239,69 +246,6 @@ void DSPEngine::work() sampleFifo->readCommit(count); samplesDone += count; } - -#if 0 - size_t wus; - size_t maxWorkUnitSize = 0; - size_t samplesDone = 0; - - wus = m_spectrum.workUnitSize(); - if(wus > maxWorkUnitSize) - maxWorkUnitSize = wus; - for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) { - wus = (*it)->workUnitSize(); - if(wus > maxWorkUnitSize) - maxWorkUnitSize = wus; - } - - while((m_sampleFifo.fill() > maxWorkUnitSize) && (m_commandQueue.countPending() == 0) && (samplesDone < m_sampleRate)) { - SampleVector::iterator part1begin; - SampleVector::iterator part1end; - SampleVector::iterator part2begin; - SampleVector::iterator part2end; - - size_t count = m_sampleFifo.readBegin(m_sampleFifo.fill(), &part1begin, &part1end, &part2begin, &part2end); - - // first part of FIFO data - if(part1begin != part1end) { - // correct stuff - if(m_settings.dcOffsetCorrection()) - dcOffset(part1begin, part1end); - if(m_settings.iqImbalanceCorrection()) - imbalance(part1begin, part1end); - // feed data to handlers - m_spectrum.feed(part1begin, part1end); - for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) - (*it)->feed(part1begin, part1end); - } - // second part of FIFO data (used when block wraps around) - if(part2begin != part2end) { - // correct stuff - if(m_settings.dcOffsetCorrection()) - dcOffset(part2begin, part2end); - if(m_settings.iqImbalanceCorrection()) - imbalance(part2begin, part2end); - // feed data to handlers - m_spectrum.feed(part2begin, part2end); - for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) - (*it)->feed(part1begin, part1end); - } - - // adjust FIFO pointers - m_sampleFifo.readCommit(count); - samplesDone += count; - } - - // check if the center frequency has changed (has to be responsive) - if(m_settings.isModifiedCenterFreq()) - m_sampleSource->setCenterFrequency(m_settings.centerFreq()); - // check if decimation has changed (needed to be done here, because to high a sample rate can clog the switch) - if(m_settings.isModifiedDecimation()) { - m_sampleSource->setDecimation(m_settings.decimation()); - m_sampleRate = 4000000 / (1 << m_settings.decimation()); - qDebug("New rate: %d", m_sampleRate); - } -#endif } DSPEngine::State DSPEngine::gotoIdle()