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;