MIMO support (4)

This commit is contained in:
f4exb 2019-05-16 00:43:15 +02:00
parent 6776afd277
commit 60db6f76a6
3 changed files with 38 additions and 33 deletions

View File

@ -36,6 +36,7 @@ set(sdrbase_SOURCES
dsp/dspengine.cpp dsp/dspengine.cpp
dsp/dspdevicesourceengine.cpp dsp/dspdevicesourceengine.cpp
dsp/dspdevicesinkengine.cpp dsp/dspdevicesinkengine.cpp
dsp/dspdevicemimoengine.cpp
dsp/fftcorr.cpp dsp/fftcorr.cpp
dsp/fftengine.cpp dsp/fftengine.cpp
dsp/fftfilt.cpp dsp/fftfilt.cpp
@ -65,6 +66,7 @@ set(sdrbase_SOURCES
dsp/wfir.cpp dsp/wfir.cpp
dsp/devicesamplesource.cpp dsp/devicesamplesource.cpp
dsp/devicesamplesink.cpp dsp/devicesamplesink.cpp
dsp/devicesamplemimo.cpp
device/deviceapi.cpp device/deviceapi.cpp
device/deviceenumerator.cpp device/deviceenumerator.cpp
@ -135,6 +137,7 @@ set(sdrbase_HEADERS
dsp/dspengine.h dsp/dspengine.h
dsp/dspdevicesourceengine.h dsp/dspdevicesourceengine.h
dsp/dspdevicesinkengine.h dsp/dspdevicesinkengine.h
dsp/dspdevicemimoengine.h
dsp/dsptypes.h dsp/dsptypes.h
dsp/fftcorr.h dsp/fftcorr.h
dsp/fftengine.h dsp/fftengine.h
@ -184,6 +187,7 @@ set(sdrbase_HEADERS
dsp/wfir.h dsp/wfir.h
dsp/devicesamplesource.h dsp/devicesamplesource.h
dsp/devicesamplesink.h dsp/devicesamplesink.h
dsp/devicesamplemimo.h
device/deviceapi.h device/deviceapi.h
device/deviceenumerator.h device/deviceenumerator.h

View File

@ -210,6 +210,7 @@ QString DSPDeviceMIMOEngine::deviceDescription()
*/ */
void DSPDeviceMIMOEngine::work(int nbWriteSamples) void DSPDeviceMIMOEngine::work(int nbWriteSamples)
{ {
(void) nbWriteSamples;
// Sources // Sources
for (unsigned int isource = 0; isource < m_deviceSampleMIMO->getNbSourceFifos(); isource++) for (unsigned int isource = 0; isource < m_deviceSampleMIMO->getNbSourceFifos(); isource++)
{ {
@ -547,7 +548,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const AddBasebandSampleSink *msg = (AddBasebandSampleSink *) message; const AddBasebandSampleSink *msg = (AddBasebandSampleSink *) message;
BasebandSampleSink* sink = msg->getSampleSink(); BasebandSampleSink* sink = msg->getSampleSink();
int isource = msg->getIndex(); unsigned int isource = msg->getIndex();
if ((isource < m_basebandSampleSinks.size()) && (isource < m_sourceStreamSampleRates.size()) && (isource < m_sourceCenterFrequencies.size())) if ((isource < m_basebandSampleSinks.size()) && (isource < m_sourceStreamSampleRates.size()) && (isource < m_sourceCenterFrequencies.size()))
{ {
@ -565,7 +566,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const RemoveBasebandSampleSink *msg = (RemoveBasebandSampleSink *) message; const RemoveBasebandSampleSink *msg = (RemoveBasebandSampleSink *) message;
BasebandSampleSink* sink = ((DSPRemoveBasebandSampleSink*) message)->getSampleSink(); BasebandSampleSink* sink = ((DSPRemoveBasebandSampleSink*) message)->getSampleSink();
int isource = msg->getIndex(); unsigned int isource = msg->getIndex();
if (isource < m_basebandSampleSinks.size()) if (isource < m_basebandSampleSinks.size())
{ {
@ -580,7 +581,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const AddThreadedBasebandSampleSink *msg = (AddThreadedBasebandSampleSink *) message; const AddThreadedBasebandSampleSink *msg = (AddThreadedBasebandSampleSink *) message;
ThreadedBasebandSampleSink *threadedSink = msg->getThreadedSampleSink(); ThreadedBasebandSampleSink *threadedSink = msg->getThreadedSampleSink();
int isource = msg->getIndex(); unsigned int isource = msg->getIndex();
if ((isource < m_threadedBasebandSampleSinks.size()) && (isource < m_sourceStreamSampleRates.size()) && (isource < m_sourceCenterFrequencies.size())) if ((isource < m_threadedBasebandSampleSinks.size()) && (isource < m_sourceStreamSampleRates.size()) && (isource < m_sourceCenterFrequencies.size()))
{ {
@ -598,7 +599,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const RemoveThreadedBasebandSampleSink *msg = (RemoveThreadedBasebandSampleSink *) message; const RemoveThreadedBasebandSampleSink *msg = (RemoveThreadedBasebandSampleSink *) message;
ThreadedBasebandSampleSink* threadedSink = msg->getThreadedSampleSink(); ThreadedBasebandSampleSink* threadedSink = msg->getThreadedSampleSink();
int isource = msg->getIndex(); unsigned int isource = msg->getIndex();
if (isource < m_threadedBasebandSampleSinks.size()) if (isource < m_threadedBasebandSampleSinks.size())
{ {
@ -610,7 +611,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const AddThreadedBasebandSampleSource *msg = (AddThreadedBasebandSampleSource *) message; const AddThreadedBasebandSampleSource *msg = (AddThreadedBasebandSampleSource *) message;
ThreadedBasebandSampleSource *threadedSource = msg->getThreadedSampleSource(); ThreadedBasebandSampleSource *threadedSource = msg->getThreadedSampleSource();
int isink = msg->getIndex(); unsigned int isink = msg->getIndex();
if ((isink < m_threadedBasebandSampleSources.size()) && (isink < m_sinkStreamSampleRates.size()) && (isink < m_sinkCenterFrequencies.size())) if ((isink < m_threadedBasebandSampleSources.size()) && (isink < m_sinkStreamSampleRates.size()) && (isink < m_sinkCenterFrequencies.size()))
{ {
@ -628,7 +629,7 @@ void DSPDeviceMIMOEngine::handleSynchronousMessages()
{ {
const RemoveThreadedBasebandSampleSource *msg = (RemoveThreadedBasebandSampleSource *) message; const RemoveThreadedBasebandSampleSource *msg = (RemoveThreadedBasebandSampleSource *) message;
ThreadedBasebandSampleSource* threadedSource = msg->getThreadedSampleSource(); ThreadedBasebandSampleSource* threadedSource = msg->getThreadedSampleSource();
int isink = msg->getIndex(); unsigned int isink = msg->getIndex();
if (isink < m_threadedBasebandSampleSources.size()) if (isink < m_threadedBasebandSampleSources.size())
{ {
@ -651,7 +652,7 @@ void DSPDeviceMIMOEngine::handleInputMessages()
if (ConfigureCorrection::match(*message)) if (ConfigureCorrection::match(*message))
{ {
ConfigureCorrection* conf = (ConfigureCorrection*) message; ConfigureCorrection* conf = (ConfigureCorrection*) message;
int isource = conf->getIndex(); unsigned int isource = conf->getIndex();
if (isource < m_sourcesCorrections.size()) if (isource < m_sourcesCorrections.size())
{ {
@ -691,7 +692,7 @@ void DSPDeviceMIMOEngine::handleInputMessages()
// update DSP values // update DSP values
bool sourceOrSink = notif->getSourceOrSink(); bool sourceOrSink = notif->getSourceOrSink();
int istream = notif->getIndex(); unsigned int istream = notif->getIndex();
int sampleRate = notif->getSampleRate(); int sampleRate = notif->getSampleRate();
qint64 centerFrequency = notif->getCenterFrequency(); qint64 centerFrequency = notif->getCenterFrequency();

View File

@ -47,92 +47,92 @@ public:
class AddThreadedBasebandSampleSource : public Message { class AddThreadedBasebandSampleSource : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
AddThreadedBasebandSampleSource(ThreadedBasebandSampleSource* threadedSampleSource, int index) : AddThreadedBasebandSampleSource(ThreadedBasebandSampleSource* threadedSampleSource, unsigned int index) :
Message(), Message(),
m_threadedSampleSource(threadedSampleSource), m_threadedSampleSource(threadedSampleSource),
m_index(index) m_index(index)
{ } { }
ThreadedBasebandSampleSource* getThreadedSampleSource() const { return m_threadedSampleSource; } ThreadedBasebandSampleSource* getThreadedSampleSource() const { return m_threadedSampleSource; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
ThreadedBasebandSampleSource* m_threadedSampleSource; ThreadedBasebandSampleSource* m_threadedSampleSource;
int m_index; unsigned int m_index;
}; };
class RemoveThreadedBasebandSampleSource : public Message { class RemoveThreadedBasebandSampleSource : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
RemoveThreadedBasebandSampleSource(ThreadedBasebandSampleSource* threadedSampleSource, int index) : RemoveThreadedBasebandSampleSource(ThreadedBasebandSampleSource* threadedSampleSource, unsigned int index) :
Message(), Message(),
m_threadedSampleSource(threadedSampleSource), m_threadedSampleSource(threadedSampleSource),
m_index(index) m_index(index)
{ } { }
ThreadedBasebandSampleSource* getThreadedSampleSource() const { return m_threadedSampleSource; } ThreadedBasebandSampleSource* getThreadedSampleSource() const { return m_threadedSampleSource; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
ThreadedBasebandSampleSource* m_threadedSampleSource; ThreadedBasebandSampleSource* m_threadedSampleSource;
int m_index; unsigned int m_index;
}; };
class AddThreadedBasebandSampleSink : public Message { class AddThreadedBasebandSampleSink : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
AddThreadedBasebandSampleSink(ThreadedBasebandSampleSink* threadedSampleSink, int index) : AddThreadedBasebandSampleSink(ThreadedBasebandSampleSink* threadedSampleSink, unsigned int index) :
Message(), Message(),
m_threadedSampleSink(threadedSampleSink), m_threadedSampleSink(threadedSampleSink),
m_index(index) m_index(index)
{ } { }
ThreadedBasebandSampleSink* getThreadedSampleSink() const { return m_threadedSampleSink; } ThreadedBasebandSampleSink* getThreadedSampleSink() const { return m_threadedSampleSink; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
ThreadedBasebandSampleSink* m_threadedSampleSink; ThreadedBasebandSampleSink* m_threadedSampleSink;
int m_index; unsigned int m_index;
}; };
class RemoveThreadedBasebandSampleSink : public Message { class RemoveThreadedBasebandSampleSink : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
RemoveThreadedBasebandSampleSink(ThreadedBasebandSampleSink* threadedSampleSink, int index) : RemoveThreadedBasebandSampleSink(ThreadedBasebandSampleSink* threadedSampleSink, unsigned int index) :
Message(), Message(),
m_threadedSampleSink(threadedSampleSink), m_threadedSampleSink(threadedSampleSink),
m_index(index) m_index(index)
{ } { }
ThreadedBasebandSampleSink* getThreadedSampleSink() const { return m_threadedSampleSink; } ThreadedBasebandSampleSink* getThreadedSampleSink() const { return m_threadedSampleSink; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
ThreadedBasebandSampleSink* m_threadedSampleSink; ThreadedBasebandSampleSink* m_threadedSampleSink;
int m_index; unsigned int m_index;
}; };
class AddBasebandSampleSink : public Message { class AddBasebandSampleSink : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
AddBasebandSampleSink(BasebandSampleSink* sampleSink, int index) : AddBasebandSampleSink(BasebandSampleSink* sampleSink, unsigned int index) :
Message(), Message(),
m_sampleSink(sampleSink), m_sampleSink(sampleSink),
m_index(index) m_index(index)
{ } { }
BasebandSampleSink* getSampleSink() const { return m_sampleSink; } BasebandSampleSink* getSampleSink() const { return m_sampleSink; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
BasebandSampleSink* m_sampleSink; BasebandSampleSink* m_sampleSink;
int m_index; unsigned int m_index;
}; };
class RemoveBasebandSampleSink : public Message { class RemoveBasebandSampleSink : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
RemoveBasebandSampleSink(BasebandSampleSink* sampleSink, int index) : RemoveBasebandSampleSink(BasebandSampleSink* sampleSink, unsigned int index) :
Message(), Message(),
m_sampleSink(sampleSink), m_sampleSink(sampleSink),
m_index(index) m_index(index)
{ } { }
BasebandSampleSink* getSampleSink() const { return m_sampleSink; } BasebandSampleSink* getSampleSink() const { return m_sampleSink; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
BasebandSampleSink* m_sampleSink; BasebandSampleSink* m_sampleSink;
int m_index; unsigned int m_index;
}; };
class AddSpectrumSink : public Message { class AddSpectrumSink : public Message {
@ -174,7 +174,7 @@ public:
class ConfigureCorrection : public Message { class ConfigureCorrection : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
ConfigureCorrection(bool dcOffsetCorrection, bool iqImbalanceCorrection, int index) : ConfigureCorrection(bool dcOffsetCorrection, bool iqImbalanceCorrection, unsigned int index) :
Message(), Message(),
m_dcOffsetCorrection(dcOffsetCorrection), m_dcOffsetCorrection(dcOffsetCorrection),
m_iqImbalanceCorrection(iqImbalanceCorrection), m_iqImbalanceCorrection(iqImbalanceCorrection),
@ -182,17 +182,17 @@ public:
{ } { }
bool getDCOffsetCorrection() const { return m_dcOffsetCorrection; } bool getDCOffsetCorrection() const { return m_dcOffsetCorrection; }
bool getIQImbalanceCorrection() const { return m_iqImbalanceCorrection; } bool getIQImbalanceCorrection() const { return m_iqImbalanceCorrection; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
bool m_dcOffsetCorrection; bool m_dcOffsetCorrection;
bool m_iqImbalanceCorrection; bool m_iqImbalanceCorrection;
int m_index; unsigned int m_index;
}; };
class SignalNotification : public Message { class SignalNotification : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
SignalNotification(int samplerate, qint64 centerFrequency, bool sourceOrSink, int index) : SignalNotification(int samplerate, qint64 centerFrequency, bool sourceOrSink, unsigned int index) :
Message(), Message(),
m_sampleRate(samplerate), m_sampleRate(samplerate),
m_centerFrequency(centerFrequency), m_centerFrequency(centerFrequency),
@ -202,12 +202,12 @@ public:
int getSampleRate() const { return m_sampleRate; } int getSampleRate() const { return m_sampleRate; }
qint64 getCenterFrequency() const { return m_centerFrequency; } qint64 getCenterFrequency() const { return m_centerFrequency; }
bool getSourceOrSink() const { return m_sourceOrSink; } bool getSourceOrSink() const { return m_sourceOrSink; }
int getIndex() const { return m_index; } unsigned int getIndex() const { return m_index; }
private: private:
int m_sampleRate; int m_sampleRate;
qint64 m_centerFrequency; qint64 m_centerFrequency;
bool m_sourceOrSink; bool m_sourceOrSink;
int m_index; unsigned int m_index;
}; };
enum State { enum State {
@ -324,7 +324,7 @@ private slots:
void handleData(); //!< Handle data when samples have to be processed void handleData(); //!< Handle data when samples have to be processed
void handleSynchronousMessages(); //!< Handle synchronous messages with the thread void handleSynchronousMessages(); //!< Handle synchronous messages with the thread
void handleInputMessages(); //!< Handle input message queue void handleInputMessages(); //!< Handle input message queue
void handleForwardToSpectrumSink(int nbSamples); //TODO: void handleForwardToSpectrumSink(int nbSamples);
}; };
#endif // SDRBASE_DSP_DSPDEVICEMIMOENGINE_H_ #endif // SDRBASE_DSP_DSPDEVICEMIMOENGINE_H_