From c95c7b18af2fa58fb5f977e0c55fecdafd83f52e Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Tue, 27 Sep 2022 15:43:33 +0200 Subject: [PATCH] added invert iq option --- core/src/core.cpp | 1 + core/src/gui/menus/source.cpp | 10 ++++++++++ core/src/signal_path/iq_frontend.cpp | 6 ++++++ core/src/signal_path/iq_frontend.h | 3 +++ 4 files changed, 20 insertions(+) diff --git a/core/src/core.cpp b/core/src/core.cpp index 0c661c9e..58fe0e62 100644 --- a/core/src/core.cpp +++ b/core/src/core.cpp @@ -214,6 +214,7 @@ int sdrpp_main(int argc, char* argv[]) { defConfig["source"] = ""; defConfig["decimationPower"] = 0; defConfig["iqCorrection"] = false; + defConfig["invertIQ"] = false; defConfig["streams"]["Radio"]["muted"] = false; defConfig["streams"]["Radio"]["sink"] = "Audio"; diff --git a/core/src/gui/menus/source.cpp b/core/src/gui/menus/source.cpp index 94f14f81..27f362c0 100644 --- a/core/src/gui/menus/source.cpp +++ b/core/src/gui/menus/source.cpp @@ -13,6 +13,7 @@ namespace sourcemenu { double effectiveOffset = 0.0; int decimationPower = 0; bool iqCorrection = false; + bool invertIQ = false; EventHandler sourceRegisteredHandler; EventHandler sourceUnregisterHandler; @@ -138,7 +139,9 @@ namespace sourcemenu { offsetMode = core::configManager.conf["offsetMode"]; decimationPower = core::configManager.conf["decimationPower"]; iqCorrection = core::configManager.conf["iqCorrection"]; + invertIQ = core::configManager.conf["invertIQ"]; sigpath::iqFrontEnd.setDCBlocking(iqCorrection); + sigpath::iqFrontEnd.setInvertIQ(invertIQ); updateOffset(); refreshSources(); @@ -180,6 +183,13 @@ namespace sourcemenu { core::configManager.release(true); } + if (ImGui::Checkbox("Invert IQ##_sdrpp_inv_iq", &invertIQ)) { + sigpath::iqFrontEnd.setInvertIQ(invertIQ); + core::configManager.acquire(); + core::configManager.conf["invertIQ"] = invertIQ; + core::configManager.release(true); + } + ImGui::LeftLabel("Offset mode"); ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX()); if (ImGui::Combo("##_sdrpp_offset_mode", &offsetMode, offsetModesTxt)) { diff --git a/core/src/signal_path/iq_frontend.cpp b/core/src/signal_path/iq_frontend.cpp index c77ce160..2aa3f458 100644 --- a/core/src/signal_path/iq_frontend.cpp +++ b/core/src/signal_path/iq_frontend.cpp @@ -31,10 +31,12 @@ void IQFrontEnd::init(dsp::stream* in, double sampleRate, bool b decim.init(NULL, _decimRatio); dcBlock.init(NULL, genDCBlockRate(effectiveSr)); + conjugate.init(NULL); preproc.init(&inBuf.out); preproc.addBlock(&decim, _decimRatio > 1); preproc.addBlock(&dcBlock, dcBlocking); + preproc.addBlock(&conjugate, false); // TODO: Replace by parameter split.init(preproc.out); @@ -123,6 +125,10 @@ void IQFrontEnd::setDCBlocking(bool enabled) { preproc.setBlockEnabled(&dcBlock, enabled, [=](dsp::stream* out){ split.setInput(out); }); } +void IQFrontEnd::setInvertIQ(bool enabled) { + preproc.setBlockEnabled(&conjugate, enabled, [=](dsp::stream* out){ split.setInput(out); }); +} + void IQFrontEnd::bindIQStream(dsp::stream* stream) { split.bindStream(stream); } diff --git a/core/src/signal_path/iq_frontend.h b/core/src/signal_path/iq_frontend.h index a3dda529..0fbafdf8 100644 --- a/core/src/signal_path/iq_frontend.h +++ b/core/src/signal_path/iq_frontend.h @@ -7,6 +7,7 @@ #include "../dsp/routing/splitter.h" #include "../dsp/channel/rx_vfo.h" #include "../dsp/sink/handler_sink.h" +#include "../dsp/math/conjugate.h" #include class IQFrontEnd { @@ -27,6 +28,7 @@ public: void setBuffering(bool enabled); void setDecimation(int ratio); + void setInvertIQ(bool enabled); void setDCBlocking(bool enabled); void bindIQStream(dsp::stream* stream); @@ -65,6 +67,7 @@ protected: // Pre-processing chain dsp::multirate::PowerDecimator decim; + dsp::math::Conjugate conjugate; dsp::correction::DCBlocker dcBlock; dsp::chain preproc;