From cbf229c15c29e15026dd614f47dea68e3042dcbd Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 4 Feb 2018 23:42:46 +0100 Subject: [PATCH] Airspy HF (int version): use raw integer samples and do the DC and IQ corrections in the application --- plugins/samplesource/airspyhf/airspyhfgui.cpp | 11 +++++ plugins/samplesource/airspyhf/airspyhfgui.h | 1 + plugins/samplesource/airspyhf/airspyhfgui.ui | 48 ++++++++++++++++++- .../samplesource/airspyhf/airspyhfinput.cpp | 19 +++++++- .../samplesource/airspyhf/airspyhfplugin.cpp | 2 +- .../airspyhf/airspyhfsettings.cpp | 9 ++++ .../samplesource/airspyhf/airspyhfsettings.h | 8 ++++ 7 files changed, 95 insertions(+), 3 deletions(-) diff --git a/plugins/samplesource/airspyhf/airspyhfgui.cpp b/plugins/samplesource/airspyhf/airspyhfgui.cpp index 23f9e46b6..dfbc6af28 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.cpp +++ b/plugins/samplesource/airspyhf/airspyhfgui.cpp @@ -219,6 +219,7 @@ void AirspyHFGui::displaySettings() ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); ui->LOppm->setValue(m_settings.m_LOppmTenths); ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); + ui->autoCorr->setCurrentIndex(m_settings.m_autoCorrOptions); ui->sampleRate->setCurrentIndex(m_settings.m_devSampleRateIndex); ui->decim->setCurrentIndex(m_settings.m_log2Decim); ui->band->blockSignals(false); @@ -277,6 +278,16 @@ void AirspyHFGui::on_resetLOppm_clicked() ui->LOppm->setValue(0); } +void AirspyHFGui::on_autoCorr_currentIndexChanged(int index) +{ + if ((index < 0) || (index > AirspyHFSettings::AutoCorrLast)) { + return; + } + + m_settings.m_autoCorrOptions = (AirspyHFSettings::AutoCorrOptions) index; + sendSettings(); +} + void AirspyHFGui::on_sampleRate_currentIndexChanged(int index) { m_settings.m_devSampleRateIndex = index; diff --git a/plugins/samplesource/airspyhf/airspyhfgui.h b/plugins/samplesource/airspyhf/airspyhfgui.h index 6efe5ddb4..be340ed99 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.h +++ b/plugins/samplesource/airspyhf/airspyhfgui.h @@ -79,6 +79,7 @@ private slots: void on_centerFrequency_changed(quint64 value); void on_LOppm_valueChanged(int value); void on_resetLOppm_clicked(); + void on_autoCorr_currentIndexChanged(int index); void on_sampleRate_currentIndexChanged(int index); void on_decim_currentIndexChanged(int index); void on_startStop_toggled(bool checked); diff --git a/plugins/samplesource/airspyhf/airspyhfgui.ui b/plugins/samplesource/airspyhf/airspyhfgui.ui index f08fe7d30..06c58c5e9 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.ui +++ b/plugins/samplesource/airspyhf/airspyhfgui.ui @@ -7,7 +7,7 @@ 0 0 324 - 132 + 174 @@ -237,6 +237,52 @@ + + + + + + Corr + + + + + + + DC offset and IQ correction options + + + + None + + + + + DC + + + + + DC+IQ + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/plugins/samplesource/airspyhf/airspyhfinput.cpp b/plugins/samplesource/airspyhf/airspyhfinput.cpp index e126d4fa8..c2dfa31e5 100644 --- a/plugins/samplesource/airspyhf/airspyhfinput.cpp +++ b/plugins/samplesource/airspyhf/airspyhfinput.cpp @@ -134,7 +134,7 @@ bool AirspyHFInput::openDevice() delete[] sampleRates; - airspyhf_set_sample_type(m_dev, AIRSPYHF_SAMPLE_INT16_IQ); + airspyhf_set_sample_type(m_dev, AIRSPYHF_SAMPLE_INT16_NDSP_IQ); return true; } @@ -349,6 +349,23 @@ bool AirspyHFInput::applySettings(const AirspyHFSettings& settings, bool force) qDebug() << "AirspyHFInput::applySettings"; + if ((m_settings.m_autoCorrOptions != settings.m_autoCorrOptions) || force) + { + switch(settings.m_autoCorrOptions) + { + case AirspyHFSettings::AutoCorrDC: + m_deviceAPI->configureCorrections(true, false); + break; + case AirspyHFSettings::AutoCorrDCAndIQ: + m_deviceAPI->configureCorrections(true, true); + break; + case AirspyHFSettings::AutoCorrNone: + default: + m_deviceAPI->configureCorrections(false, false); + break; + } + } + if ((m_settings.m_devSampleRateIndex != settings.m_devSampleRateIndex) || force) { forwardChange = true; diff --git a/plugins/samplesource/airspyhf/airspyhfplugin.cpp b/plugins/samplesource/airspyhf/airspyhfplugin.cpp index 16bc6815c..61c48e2f7 100644 --- a/plugins/samplesource/airspyhf/airspyhfplugin.cpp +++ b/plugins/samplesource/airspyhf/airspyhfplugin.cpp @@ -28,7 +28,7 @@ const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = { QString("AirspyHF Input"), - QString("3.11.0"), + QString("3.12.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.cpp b/plugins/samplesource/airspyhf/airspyhfsettings.cpp index b1e21d9d5..903fdb4d0 100644 --- a/plugins/samplesource/airspyhf/airspyhfsettings.cpp +++ b/plugins/samplesource/airspyhf/airspyhfsettings.cpp @@ -32,6 +32,7 @@ void AirspyHFSettings::resetToDefaults() m_transverterMode = false; m_transverterDeltaFrequency = 0; m_bandIndex = 0; + m_autoCorrOptions = AutoCorrNone; } QByteArray AirspyHFSettings::serialize() const @@ -41,6 +42,7 @@ QByteArray AirspyHFSettings::serialize() const s.writeU32(1, m_devSampleRateIndex); s.writeS32(2, m_LOppmTenths); s.writeU32(3, m_log2Decim); + s.writeS32(4, (int) m_autoCorrOptions); s.writeBool(7, m_transverterMode); s.writeS64(8, m_transverterDeltaFrequency); s.writeU32(9, m_bandIndex); @@ -67,6 +69,13 @@ bool AirspyHFSettings::deserialize(const QByteArray& data) d.readS32(2, &m_LOppmTenths, 0); d.readU32(3, &m_log2Decim, 0); d.readS32(4, &intval, 0); + + if (intval < 0 || intval > (int) AutoCorrLast) { + m_autoCorrOptions = AutoCorrNone; + } else { + m_autoCorrOptions = (AutoCorrOptions) intval; + } + d.readBool(7, &m_transverterMode, false); d.readS64(8, &m_transverterDeltaFrequency, 0); d.readU32(9, &uintval, 0); diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.h b/plugins/samplesource/airspyhf/airspyhfsettings.h index 544efe252..6aac4f318 100644 --- a/plugins/samplesource/airspyhf/airspyhfsettings.h +++ b/plugins/samplesource/airspyhf/airspyhfsettings.h @@ -19,6 +19,13 @@ struct AirspyHFSettings { + typedef enum { + AutoCorrNone, + AutoCorrDC, + AutoCorrDCAndIQ, + AutoCorrLast, + } AutoCorrOptions; + quint64 m_centerFrequency; qint32 m_LOppmTenths; quint32 m_devSampleRateIndex; @@ -26,6 +33,7 @@ struct AirspyHFSettings bool m_transverterMode; qint64 m_transverterDeltaFrequency; quint32 m_bandIndex; + AutoCorrOptions m_autoCorrOptions; AirspyHFSettings(); void resetToDefaults();