From f5bbbb7cab64e5437460cbdf9c4d5f10e8b11dfd Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 30 Oct 2016 22:01:20 +0100 Subject: [PATCH] Tx ph.2: UpChannelizer: allow any sample rate --- plugins/samplesink/filesink/filesinkgui.cpp | 4 +- plugins/samplesink/filesink/filesinkgui.h | 2 +- sdrbase/dsp/upchannelizer.cpp | 48 +++++++++++++++------ sdrbase/dsp/upchannelizer.h | 1 + 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/plugins/samplesink/filesink/filesinkgui.cpp b/plugins/samplesink/filesink/filesinkgui.cpp index 8e316a226..6c6c10f93 100644 --- a/plugins/samplesink/filesink/filesinkgui.cpp +++ b/plugins/samplesink/filesink/filesinkgui.cpp @@ -327,8 +327,8 @@ void FileSinkGui::tick() } } -unsigned int FileSinkSampleRates::m_rates[] = {32, 48, 64, 72, 128}; -unsigned int FileSinkSampleRates::m_nb_rates = 5; +unsigned int FileSinkSampleRates::m_rates[] = {32, 48, 64, 72, 128, 192, 256, 300, 512, 1000}; +unsigned int FileSinkSampleRates::m_nb_rates = 10; unsigned int FileSinkSampleRates::getRate(unsigned int rate_index) { diff --git a/plugins/samplesink/filesink/filesinkgui.h b/plugins/samplesink/filesink/filesinkgui.h index 575b1761b..4fea9ccc5 100644 --- a/plugins/samplesink/filesink/filesinkgui.h +++ b/plugins/samplesink/filesink/filesinkgui.h @@ -93,7 +93,7 @@ public: static unsigned int getRateIndex(unsigned int rate); static unsigned int getNbRates(); private: - static unsigned int m_rates[5]; + static unsigned int m_rates[10]; static unsigned int m_nb_rates; }; diff --git a/sdrbase/dsp/upchannelizer.cpp b/sdrbase/dsp/upchannelizer.cpp index 1f3805132..9576d80a2 100644 --- a/sdrbase/dsp/upchannelizer.cpp +++ b/sdrbase/dsp/upchannelizer.cpp @@ -64,20 +64,39 @@ void UpChannelizer::pull(Sample& sample) m_mutex.lock(); FilterStages::iterator stage = m_filterStages.begin(); + std::vector::iterator stageSample = m_stageSamples.begin(); - // m_sampleIn + for (; stage != m_filterStages.end(); ++stage, ++stageSample) + { + if(stage == m_filterStages.end() - 1) + { + if ((*stage)->work(&m_sampleIn, &(*stageSample))) + { + m_sampleSource->pull(m_sampleIn); // get new input sample + } + } + else + { + if (!(*stage)->work(&(*(stageSample+1)), &(*stageSample))) + { + break; + } + } + } - for (; stage != m_filterStages.end(); ++stage) - { - // let's make it work for one stage only (96 kS/s < SR < 192 kS/s) - if(stage == m_filterStages.end() - 1) - { - if ((*stage)->work(&m_sampleIn, &sample)) - { - m_sampleSource->pull(m_sampleIn); // get new input sample - } - } - } + sample = *m_stageSamples.begin(); + +// for (; stage != m_filterStages.end(); ++stage) +// { +// // let's make it work for one stage only (96 kS/s < SR < 192 kS/s) +// if(stage == m_filterStages.end() - 1) +// { +// if ((*stage)->work(&m_sampleIn, &sample)) +// { +// m_sampleSource->pull(m_sampleIn); // get new input sample +// } +// } +// } m_mutex.unlock(); } @@ -221,6 +240,7 @@ Real UpChannelizer::createFilterChain(Real sigStart, Real sigEnd, Real chanStart Real sigBw = sigEnd - sigStart; Real safetyMargin = sigBw / 20; Real rot = sigBw / 4; + Sample s; safetyMargin = 0; @@ -238,6 +258,7 @@ Real UpChannelizer::createFilterChain(Real sigStart, Real sigEnd, Real chanStart << " [" << m_filterStages.size() << "]" << " sig: [" << sigStart << ":" << sigStart + sigBw / 2.0 << "]"; m_filterStages.push_back(new FilterStage(FilterStage::ModeLowerHalf)); + m_stageSamples.push_back(s); return createFilterChain(sigStart, sigStart + sigBw / 2.0, chanStart, chanEnd); } @@ -248,6 +269,7 @@ Real UpChannelizer::createFilterChain(Real sigStart, Real sigEnd, Real chanStart << " [" << m_filterStages.size() << "]" << " sig: [" << sigEnd - sigBw / 2.0f << ":" << sigEnd << "]"; m_filterStages.push_back(new FilterStage(FilterStage::ModeUpperHalf)); + m_stageSamples.push_back(s); return createFilterChain(sigEnd - sigBw / 2.0f, sigEnd, chanStart, chanEnd); } @@ -259,6 +281,7 @@ Real UpChannelizer::createFilterChain(Real sigStart, Real sigEnd, Real chanStart << " [" << m_filterStages.size() << "]" << " sig: [" << sigStart + rot << ":" << sigEnd - rot << "]"; m_filterStages.push_back(new FilterStage(FilterStage::ModeCenter)); + m_stageSamples.push_back(s); // Was: return createFilterChain(sigStart + rot, sigStart + sigBw / 2.0f + rot, chanStart, chanEnd); return createFilterChain(sigStart + rot, sigEnd - rot, chanStart, chanEnd); } @@ -278,6 +301,7 @@ void UpChannelizer::freeFilterChain() for(FilterStages::iterator it = m_filterStages.begin(); it != m_filterStages.end(); ++it) delete *it; m_filterStages.clear(); + m_stageSamples.clear(); } diff --git a/sdrbase/dsp/upchannelizer.h b/sdrbase/dsp/upchannelizer.h index b94b38367..d609a29a6 100644 --- a/sdrbase/dsp/upchannelizer.h +++ b/sdrbase/dsp/upchannelizer.h @@ -83,6 +83,7 @@ protected: }; typedef std::vector FilterStages; FilterStages m_filterStages; + std::vector m_stageSamples; BasebandSampleSource* m_sampleSource; //!< Modulator int m_outputSampleRate; int m_requestedInputSampleRate;