MIMO: base classes update

This commit is contained in:
f4exb 2019-10-24 18:29:45 +02:00
parent 054298f3e1
commit ec6645b6bb
7 changed files with 27 additions and 16 deletions

View File

@ -308,7 +308,7 @@ void DSPDeviceMIMOEngine::workSampleSourceFifos()
return; return;
} }
std::vector<SampleVector::const_iterator> vbegin; std::vector<SampleVector::iterator> vbegin;
vbegin.resize(sampleFifo->getNbStreams()); vbegin.resize(sampleFifo->getNbStreams());
unsigned int amount = sampleFifo->remainderSync(); unsigned int amount = sampleFifo->remainderSync();
@ -362,7 +362,7 @@ void DSPDeviceMIMOEngine::workSampleSourceFifo(unsigned int streamIndex)
return; return;
} }
SampleVector::const_iterator begin; SampleVector::iterator begin;
unsigned int amount = sampleFifo->remainderAsync(streamIndex); unsigned int amount = sampleFifo->remainderAsync(streamIndex);
while ((amount > 0) && (m_inputMessageQueue.size() == 0)) while ((amount > 0) && (m_inputMessageQueue.size() == 0))
@ -413,7 +413,7 @@ void DSPDeviceMIMOEngine::workSamplesSink(const SampleVector::const_iterator& vb
} }
} }
void DSPDeviceMIMOEngine::workSamplesSource(SampleVector::const_iterator& begin, unsigned int nbSamples, unsigned int streamIndex) void DSPDeviceMIMOEngine::workSamplesSource(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int streamIndex)
{ {
if (m_threadedBasebandSampleSources[streamIndex].size() == 0) if (m_threadedBasebandSampleSources[streamIndex].size() == 0)
{ {

View File

@ -382,7 +382,7 @@ private:
void workSamplesSink(const SampleVector::const_iterator& vbegin, const SampleVector::const_iterator& vend, unsigned int streamIndex); void workSamplesSink(const SampleVector::const_iterator& vbegin, const SampleVector::const_iterator& vend, unsigned int streamIndex);
void workSampleSourceFifos(); //!< transfer samples of all source streams (sync mode) void workSampleSourceFifos(); //!< transfer samples of all source streams (sync mode)
void workSampleSourceFifo(unsigned int streamIndex); //!< transfer samples of one source stream (async mode) void workSampleSourceFifo(unsigned int streamIndex); //!< transfer samples of one source stream (async mode)
void workSamplesSource(SampleVector::const_iterator& begin, unsigned int nbSamples, unsigned int streamIndex); void workSamplesSource(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int streamIndex);
State gotoIdle(int subsystemIndex); //!< Go to the idle state State gotoIdle(int subsystemIndex); //!< Go to the idle state
State gotoInit(int subsystemIndex); //!< Go to the acquisition init state from idle State gotoInit(int subsystemIndex); //!< Go to the acquisition init state from idle

View File

@ -38,7 +38,7 @@ public:
virtual void startSources() = 0; virtual void startSources() = 0;
virtual void stopSources() = 0; virtual void stopSources() = 0;
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) = 0; virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) = 0;
virtual void pull(const SampleVector::const_iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) = 0; virtual void pull(const SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) = 0;
virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication

View File

@ -100,7 +100,7 @@ void SampleMOFifo::readSync(
emit dataSyncRead(); emit dataSyncRead();
} }
void SampleMOFifo::writeSync(const std::vector<SampleVector::const_iterator>& vbegin, unsigned int amount) void SampleMOFifo::writeSync(const std::vector<SampleVector::iterator>& vbegin, unsigned int amount)
{ {
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
unsigned int spaceLeft = m_size - m_writeHead; unsigned int spaceLeft = m_size - m_writeHead;
@ -198,7 +198,7 @@ void SampleMOFifo::readAsync(
emit dataAsyncRead(stream); emit dataAsyncRead(stream);
} }
void SampleMOFifo::writeAsync(const SampleVector::const_iterator& begin, unsigned int amount, unsigned int stream) void SampleMOFifo::writeAsync(const SampleVector::iterator& begin, unsigned int amount, unsigned int stream)
{ {
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
unsigned int spaceLeft = m_size - m_vWriteHead[stream]; unsigned int spaceLeft = m_size - m_vWriteHead[stream];

View File

@ -38,7 +38,7 @@ public:
unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to read unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to read
unsigned int& ipart2Begin, unsigned int& ipart2End // second part offsets unsigned int& ipart2Begin, unsigned int& ipart2End // second part offsets
); );
void writeSync(const std::vector<SampleVector::const_iterator>& vbegin, unsigned int amount); //!< copy write void writeSync(const std::vector<SampleVector::iterator>& vbegin, unsigned int amount); //!< copy write
void writeSync( //!< in place write void writeSync( //!< in place write
unsigned int amount, unsigned int amount,
unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to write unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to write
@ -52,7 +52,7 @@ public:
unsigned int& ipart2Begin, unsigned int& ipart2End, unsigned int& ipart2Begin, unsigned int& ipart2End,
unsigned int stream unsigned int stream
); );
void writeAsync(const SampleVector::const_iterator& begin, unsigned int amount, unsigned int stream); //!< copy write void writeAsync(const SampleVector::iterator& begin, unsigned int amount, unsigned int stream); //!< copy write
void writeAsync( //!< in place write void writeAsync( //!< in place write
unsigned int amount, unsigned int amount,
unsigned int& ipart1Begin, unsigned int& ipart1End, unsigned int& ipart1Begin, unsigned int& ipart1End,

View File

@ -138,18 +138,28 @@ void UpSampleChannelizer::applyConfiguration()
<< ", fc=" << m_currentCenterFrequency; << ", fc=" << m_currentCenterFrequency;
} }
void UpSampleChannelizer::applySetting(unsigned int log2Interp, unsigned int filterChainHash) void UpSampleChannelizer::applyConfiguration(int requestedSampleRate, qint64 requestedCenterFrequency)
{
m_requestedInputSampleRate = requestedSampleRate;
m_requestedCenterFrequency = requestedCenterFrequency;
applyConfiguration();
}
void UpSampleChannelizer::setOutputSampleRate(int outputSampleRate)
{
m_outputSampleRate = outputSampleRate;
applyConfiguration();
}
void UpSampleChannelizer::setInterpolation(unsigned int log2Interp, unsigned int filterChainHash)
{ {
m_filterChainSetMode = true; m_filterChainSetMode = true;
std::vector<unsigned int> stageIndexes; std::vector<unsigned int> stageIndexes;
m_currentCenterFrequency = m_outputSampleRate * HBFilterChainConverter::convertToIndexes(log2Interp, filterChainHash, stageIndexes); m_currentCenterFrequency = m_outputSampleRate * HBFilterChainConverter::convertToIndexes(log2Interp, filterChainHash, stageIndexes);
m_requestedCenterFrequency = m_currentCenterFrequency; m_requestedCenterFrequency = m_currentCenterFrequency;
m_mutex.lock();
freeFilterChain(); freeFilterChain();
m_currentCenterFrequency = m_outputSampleRate * setFilterChain(stageIndexes); m_currentCenterFrequency = m_outputSampleRate * setFilterChain(stageIndexes);
m_mutex.unlock();
m_currentInputSampleRate = m_outputSampleRate / (1 << m_filterStages.size()); m_currentInputSampleRate = m_outputSampleRate / (1 << m_filterStages.size());
m_requestedInputSampleRate = m_currentInputSampleRate; m_requestedInputSampleRate = m_currentInputSampleRate;

View File

@ -20,7 +20,6 @@
#define SDRBASE_DSP_UPSAMPLECHANNELIZER_H_ #define SDRBASE_DSP_UPSAMPLECHANNELIZER_H_
#include <QObject> #include <QObject>
#include <QMutex>
#include <algorithm> #include <algorithm>
#include "export.h" #include "export.h"
@ -42,6 +41,10 @@ public:
virtual void pull(SampleVector::iterator begin, unsigned int nbSamples); virtual void pull(SampleVector::iterator begin, unsigned int nbSamples);
virtual void pullOne(Sample& sample); virtual void pullOne(Sample& sample);
void setInterpolation(unsigned int log2Interp, unsigned int filterChainHash); //!< Define channelizer with interpolation factor and filter chain definition
void applyConfiguration(int requestedSampleRate, qint64 requestedCenterFrequency); //!< Define channelizer with requested sample rate and center frequency (shift in the baseband)
void setOutputSampleRate(int outputSampleRate);
protected: protected:
struct FilterStage { struct FilterStage {
enum Mode { enum Mode {
@ -79,10 +82,8 @@ protected:
int m_currentCenterFrequency; int m_currentCenterFrequency;
SampleVector m_sampleBuffer; SampleVector m_sampleBuffer;
Sample m_sampleIn; Sample m_sampleIn;
QMutex m_mutex;
void applyConfiguration(); void applyConfiguration();
void applySetting(unsigned int log2Interp, unsigned int filterChainHash);
bool signalContainsChannel(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd) const; bool signalContainsChannel(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd) const;
Real createFilterChain(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd); Real createFilterChain(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd);
double setFilterChain(const std::vector<unsigned int>& stageIndexes); //!< returns offset in ratio of sample rate double setFilterChain(const std::vector<unsigned int>& stageIndexes); //!< returns offset in ratio of sample rate