From bd8c916dd4c512ef94e2bc9373f739c83f24f6c3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 14 Jan 2018 11:58:36 +0100 Subject: [PATCH] TestSource: implemente DC and IQ bias and corrections --- .../samplesource/testsource/testsourcegui.cpp | 40 ++++ .../samplesource/testsource/testsourcegui.h | 5 + .../samplesource/testsource/testsourcegui.ui | 196 +++++++++++++++++- .../testsource/testsourceinput.cpp | 29 +++ .../testsource/testsourcesettings.cpp | 15 ++ .../testsource/testsourcesettings.h | 5 + .../testsource/testsourcethread.cpp | 31 ++- .../testsource/testsourcethread.h | 9 + 8 files changed, 326 insertions(+), 4 deletions(-) diff --git a/plugins/samplesource/testsource/testsourcegui.cpp b/plugins/samplesource/testsource/testsourcegui.cpp index 7ba992312..afe6a20c1 100644 --- a/plugins/samplesource/testsource/testsourcegui.cpp +++ b/plugins/samplesource/testsource/testsourcegui.cpp @@ -141,6 +141,19 @@ void TestSourceGui::on_centerFrequency_changed(quint64 value) sendSettings(); } +void TestSourceGui::on_dcOffset_toggled(bool checked) +{ + m_settings.m_dcBlock = checked; + sendSettings(); +} + +void TestSourceGui::on_iqImbalance_toggled(bool checked) +{ + m_settings.m_iqImbalance = checked; + sendSettings(); +} + + void TestSourceGui::on_frequencyShift_changed(qint64 value) { m_settings.m_frequencyShift = value; @@ -204,6 +217,27 @@ void TestSourceGui::on_amplitudeFine_valueChanged(int value __attribute__((unuse sendSettings(); } +void TestSourceGui::on_dcBias_valueChanged(int value) +{ + ui->dcBiasText->setText(QString(tr("%1 %").arg(value))); + m_settings.m_dcFactor = value / 100.0f; + sendSettings(); +} + +void TestSourceGui::on_iBias_valueChanged(int value) +{ + ui->iBiasText->setText(QString(tr("%1 %").arg(value))); + m_settings.m_iFactor = value / 100.0f; + sendSettings(); +} + +void TestSourceGui::on_qBias_valueChanged(int value) +{ + ui->qBiasText->setText(QString(tr("%1 %").arg(value))); + m_settings.m_qFactor = value / 100.0f; + sendSettings(); +} + void TestSourceGui::on_record_toggled(bool checked) { if (checked) { @@ -309,6 +343,12 @@ void TestSourceGui::displaySettings() updateAmpFineLimit(); ui->amplitudeFine->setValue(amplitudeBits%100); displayAmplitude(); + int dcBiasPercent = roundf(m_settings.m_dcFactor * 100.0f); + ui->dcBiasText->setText(QString(tr("%1 %").arg(dcBiasPercent))); + int iBiasPercent = roundf(m_settings.m_iFactor * 100.0f); + ui->iBiasText->setText(QString(tr("%1 %").arg(iBiasPercent))); + int qBiasPercent = roundf(m_settings.m_qFactor * 100.0f); + ui->qBiasText->setText(QString(tr("%1 %").arg(qBiasPercent))); blockApplySettings(false); } diff --git a/plugins/samplesource/testsource/testsourcegui.h b/plugins/samplesource/testsource/testsourcegui.h index c71625261..b738ca119 100644 --- a/plugins/samplesource/testsource/testsourcegui.h +++ b/plugins/samplesource/testsource/testsourcegui.h @@ -82,6 +82,8 @@ private slots: void handleInputMessages(); void on_startStop_toggled(bool checked); void on_centerFrequency_changed(quint64 value); + void on_dcOffset_toggled(bool checked); + void on_iqImbalance_toggled(bool checked); void on_frequencyShift_changed(qint64 value); void on_decimation_currentIndexChanged(int index); void on_fcPos_currentIndexChanged(int index); @@ -89,6 +91,9 @@ private slots: void on_sampleSize_currentIndexChanged(int index); void on_amplitudeCoarse_valueChanged(int value); void on_amplitudeFine_valueChanged(int value); + void on_dcBias_valueChanged(int value); + void on_iBias_valueChanged(int value); + void on_qBias_valueChanged(int value); void on_record_toggled(bool checked); void updateStatus(); void updateHardware(); diff --git a/plugins/samplesource/testsource/testsourcegui.ui b/plugins/samplesource/testsource/testsourcegui.ui index 222cfa4e0..c8b5f40dc 100644 --- a/plugins/samplesource/testsource/testsourcegui.ui +++ b/plugins/samplesource/testsource/testsourcegui.ui @@ -7,7 +7,7 @@ 0 0 360 - 220 + 300 @@ -19,7 +19,7 @@ 360 - 220 + 300 @@ -185,6 +185,44 @@ + + + + + + Auto + + + + + + + DC + + + + + + + IQ + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -569,6 +607,160 @@ + + + + + + -99 + + + 1 + + + Qt::Horizontal + + + + + + + + 45 + 0 + + + + -100 % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Q bias + + + + + + + + + + + + + + + - + + + + + + + I bias + + + + + + + - + + + + + + + -99 + + + 1 + + + Qt::Horizontal + + + + + + + + 45 + 0 + + + + -100 % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + DC bias + + + + + + + - + + + + + + + -99 + + + 1 + + + Qt::Horizontal + + + + + + + + + + + + + + + + 45 + 0 + + + + -100 % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + diff --git a/plugins/samplesource/testsource/testsourceinput.cpp b/plugins/samplesource/testsource/testsourceinput.cpp index 085e7fd42..d4d66112a 100644 --- a/plugins/samplesource/testsource/testsourceinput.cpp +++ b/plugins/samplesource/testsource/testsourceinput.cpp @@ -222,6 +222,14 @@ bool TestSourceInput::handleMessage(const Message& message) bool TestSourceInput::applySettings(const TestSourceSettings& settings, bool force) { + if ((m_settings.m_dcBlock != settings.m_dcBlock) || (m_settings.m_iqImbalance != settings.m_iqImbalance) || force) + { + m_deviceAPI->configureCorrections(settings.m_dcBlock, settings.m_iqImbalance); + qDebug("TestSourceInput::applySettings: corrections: DC block: %s IQ imbalance: %s", + settings.m_dcBlock ? "true" : "false", + settings.m_iqImbalance ? "true" : "false"); + } + if ((m_settings.m_sampleRate != settings.m_sampleRate) || force) { if (m_testSourceThread != 0) @@ -287,6 +295,27 @@ bool TestSourceInput::applySettings(const TestSourceSettings& settings, bool for } } + if ((m_settings.m_dcFactor != settings.m_dcFactor) || force) + { + if (m_testSourceThread != 0) { + m_testSourceThread->setDCFactor(settings.m_dcFactor); + } + } + + if ((m_settings.m_iFactor != settings.m_iFactor) || force) + { + if (m_testSourceThread != 0) { + m_testSourceThread->setIFactor(settings.m_iFactor); + } + } + + if ((m_settings.m_qFactor != settings.m_qFactor) || force) + { + if (m_testSourceThread != 0) { + m_testSourceThread->setQFactor(settings.m_qFactor); + } + } + if ((m_settings.m_sampleSizeIndex != settings.m_sampleSizeIndex) || force) { if (m_testSourceThread != 0) { diff --git a/plugins/samplesource/testsource/testsourcesettings.cpp b/plugins/samplesource/testsource/testsourcesettings.cpp index 7d68d0e3e..6fe1aac82 100644 --- a/plugins/samplesource/testsource/testsourcesettings.cpp +++ b/plugins/samplesource/testsource/testsourcesettings.cpp @@ -32,6 +32,11 @@ void TestSourceSettings::resetToDefaults() m_fcPos = FC_POS_CENTER; m_sampleSizeIndex = 0; m_amplitudeBits = 127; + m_dcBlock = false; + m_iqImbalance = false; + m_dcFactor = 0.0f; + m_iFactor = 0.0f; + m_qFactor = 0.0f; } QByteArray TestSourceSettings::serialize() const @@ -44,6 +49,11 @@ QByteArray TestSourceSettings::serialize() const s.writeS32(5, (int) m_fcPos); s.writeU32(6, m_sampleSizeIndex); s.writeS32(7, m_amplitudeBits); + s.writeBool(8, m_dcBlock); + s.writeBool(9, m_iqImbalance); + s.writeFloat(10, m_dcFactor); + s.writeFloat(11, m_iFactor); + s.writeFloat(12, m_qFactor); return s.final(); } @@ -69,6 +79,11 @@ bool TestSourceSettings::deserialize(const QByteArray& data) m_fcPos = (fcPos_t) intval; d.readU32(6, &m_sampleSizeIndex, 0); d.readS32(7, &m_amplitudeBits, 128); + d.readBool(8, &m_dcBlock, false); + d.readBool(9, &m_iqImbalance, false); + d.readFloat(10, &m_dcFactor, 0.0f); + d.readFloat(11, &m_iFactor, 0.0f); + d.readFloat(12, &m_qFactor, 0.0f); return true; } diff --git a/plugins/samplesource/testsource/testsourcesettings.h b/plugins/samplesource/testsource/testsourcesettings.h index 9fac36aa4..883746a62 100644 --- a/plugins/samplesource/testsource/testsourcesettings.h +++ b/plugins/samplesource/testsource/testsourcesettings.h @@ -31,6 +31,11 @@ struct TestSourceSettings { fcPos_t m_fcPos; quint32 m_sampleSizeIndex; qint32 m_amplitudeBits; + bool m_dcBlock; + bool m_iqImbalance; + float m_dcFactor; //!< -1.0 < x < 1.0 + float m_iFactor; //!< -1.0 < x < 1.0 + float m_qFactor; //!< -1.0 < x < 1.0 TestSourceSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/testsource/testsourcethread.cpp b/plugins/samplesource/testsource/testsourcethread.cpp index 03433e00f..b88a03271 100644 --- a/plugins/samplesource/testsource/testsourcethread.cpp +++ b/plugins/samplesource/testsource/testsourcethread.cpp @@ -37,6 +37,12 @@ TestSourceThread::TestSourceThread(SampleSinkFifo* sampleFifo, QObject* parent) m_bitSizeIndex(0), m_bitShift(8), m_amplitudeBits(127), + m_dcBias(0.0f), + m_iBias(0.0f), + m_qBias(0.0f), + m_amplitudeBitsDC(0), + m_amplitudeBitsI(127), + m_amplitudeBitsQ(127), m_frequency(435*1000), m_fcPosShift(0), m_throttlems(TESTSOURCE_THROTTLE_MS), @@ -109,6 +115,27 @@ void TestSourceThread::setBitSize(quint32 bitSizeIndex) void TestSourceThread::setAmplitudeBits(int32_t amplitudeBits) { m_amplitudeBits = amplitudeBits; + m_amplitudeBitsDC = m_dcBias * amplitudeBits; + m_amplitudeBitsI = (1.0f + m_iBias) * amplitudeBits; + m_amplitudeBitsQ = (1.0f + m_qBias) * amplitudeBits; +} + +void TestSourceThread::setDCFactor(float dcFactor) +{ + m_dcBias = dcFactor; + m_amplitudeBitsDC = m_dcBias * m_amplitudeBits; +} + +void TestSourceThread::setIFactor(float iFactor) +{ + m_iBias = iFactor; + m_amplitudeBitsI = (1.0f + m_iBias) * m_amplitudeBits; +} + +void TestSourceThread::setQFactor(float iFactor) +{ + m_qBias = iFactor; + m_amplitudeBitsQ = (1.0f + m_qBias) * m_amplitudeBits; } void TestSourceThread::setFrequencyShift(int shift) @@ -163,8 +190,8 @@ void TestSourceThread::generate(quint32 chunksize) for (int i = 0; i < n-1;) { Complex c = m_nco.nextIQ(); - m_buf[i++] = (int16_t) (c.real() * (float) m_amplitudeBits); - m_buf[i++] = (int16_t) (c.imag() * (float) m_amplitudeBits); + m_buf[i++] = (int16_t) (c.real() * (float) m_amplitudeBitsI) + m_amplitudeBitsDC; + m_buf[i++] = (int16_t) (c.imag() * (float) m_amplitudeBitsQ); } callback(m_buf, n); diff --git a/plugins/samplesource/testsource/testsourcethread.h b/plugins/samplesource/testsource/testsourcethread.h index 56c039ae4..d7f237cb6 100644 --- a/plugins/samplesource/testsource/testsourcethread.h +++ b/plugins/samplesource/testsource/testsourcethread.h @@ -44,6 +44,9 @@ public: void setFcPos(int fcPos); void setBitSize(uint32_t bitSizeIndex); void setAmplitudeBits(int32_t amplitudeBits); + void setDCFactor(float iFactor); + void setIFactor(float iFactor); + void setQFactor(float qFactor); void setFrequencyShift(int shift); void connectTimer(const QTimer& timer); @@ -67,6 +70,12 @@ private: uint32_t m_bitSizeIndex; uint32_t m_bitShift; int32_t m_amplitudeBits; + float m_dcBias; + float m_iBias; + float m_qBias; + int32_t m_amplitudeBitsDC; + int32_t m_amplitudeBitsI; + int32_t m_amplitudeBitsQ; uint64_t m_frequency; int m_fcPosShift;