From 358872904e0e483414c9f5436c4ea9cb9cc5c1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Fri, 1 Mar 2024 09:08:37 +0100 Subject: [PATCH] Fix impedance renormalization and honor new reference impedance for traces --- .../PC_Application/LibreVNA-GUI/Traces/trace.cpp | 14 ++++++++++++-- .../PC_Application/LibreVNA-GUI/Traces/trace.h | 3 ++- .../LibreVNA-GUI/Traces/tracemodel.cpp | 2 +- .../VNA/Deembedding/impedancerenormalization.cpp | 2 +- Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp | 8 ++++---- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/trace.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/trace.cpp index 4e982be4..9215011a 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/trace.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/trace.cpp @@ -151,7 +151,7 @@ void Trace::addData(const Trace::Data &d, const DeviceDriver::SASettings &s, int addData(d, domain, 50.0, index); } -void Trace::addDeembeddingData(const Trace::Data &d, int index) +void Trace::addDeembeddingData(const Trace::Data &d, double reference_impedance, int index) { bool wasAvailable = deembeddingAvailable(); if(index >= 0) { @@ -179,6 +179,7 @@ void Trace::addDeembeddingData(const Trace::Data &d, int index) deembeddingData.insert(lower, d); } } + deembedded_reference_impedance = reference_impedance; if(deembeddingActive) { emit outputSamplesChanged(index, index + 1); } @@ -687,7 +688,11 @@ void Trace::setModel(TraceModel *model) double Trace::getReferenceImpedance() const { - return reference_impedance; + if(deembeddingActive) { + return deembedded_reference_impedance; + } else { + return reference_impedance; + } } const std::vector& Trace::getMathOperations() const @@ -1316,6 +1321,10 @@ bool Trace::deembeddingAvailable() void Trace::setDeembeddingActive(bool active) { + if(active == deembeddingActive) { + // no change + return; + } deembeddingActive = active; if(deembeddingAvailable()) { if(active) { @@ -1330,6 +1339,7 @@ void Trace::setDeembeddingActive(bool active) void Trace::clearDeembedding() { deembeddingData.clear(); + setDeembeddingActive(false); deembeddingChanged(); } diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/trace.h b/Software/PC_Application/LibreVNA-GUI/Traces/trace.h index 0599e2bb..3ef220ab 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/trace.h +++ b/Software/PC_Application/LibreVNA-GUI/Traces/trace.h @@ -46,7 +46,7 @@ class Trace : public TraceMath void clear(bool force = false); void addData(const Data& d, DataType domain, double reference_impedance = 50.0, int index = -1); void addData(const Data& d, const DeviceDriver::SASettings &s, int index = -1); - void addDeembeddingData(const Data& d, int index = -1); + void addDeembeddingData(const Data& d, double reference_impedance = 50.0, int index = -1); void setName(QString name); void setVelocityFactor(double v); void fillFromTouchstone(Touchstone &t, unsigned int parameter); @@ -288,6 +288,7 @@ private slots: // de-embedding variables std::vector deembeddingData; bool deembeddingActive; + double deembedded_reference_impedance; std::vector mathOps; TraceMath *lastMath; diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/tracemodel.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/tracemodel.cpp index d2bc673b..e69e900c 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/tracemodel.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/tracemodel.cpp @@ -314,7 +314,7 @@ void TraceModel::addVNAData(const DeviceDriver::VNAMeasurement& d, TraceMath::Da if(!deembedded) { t->addData(td, datatype, d.Z0, index); } else { - t->addDeembeddingData(td, index); + t->addDeembeddingData(td, d.Z0, index); } } } diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/impedancerenormalization.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/impedancerenormalization.cpp index fd7ccc5d..e4564d6e 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/impedancerenormalization.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/impedancerenormalization.cpp @@ -46,7 +46,7 @@ void ImpedanceRenormalization::transformDatapoint(DeviceDriver::VNAMeasurement & for(auto i=1;i<=ports;i++) { auto S11name = "S"+QString::number(i)+QString::number(i); auto S11 = p.measurements[S11name]; - transformed[S11name] = Sparam(ABCDparam(Sparam(S11, 0.0, 0.0, 1.0), p.Z0), impedance).m11; + transformed[S11name] = Sparam(ABCDparam(Sparam(S11, 0.1, 0.1, 1.0), p.Z0), impedance).m11; for(auto j=i+1;j<=ports;j++) { auto S12name = "S"+QString::number(i)+QString::number(j); auto S21name = "S"+QString::number(j)+QString::number(i); diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp index ce6cb368..ad535bb8 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp @@ -94,10 +94,6 @@ VNA::VNA(AppWindow *window, QString name) connect(calLoad, &QAction::triggered, [=](){ LoadCalibration(); - if(window->getDevice() && !cal.validForDevice(window->getDevice()->getSerial())) { - InformationBox::ShowMessage("Invalid calibration", "The selected calibration was created for a different device. You can still load it but the resulting " - "data likely isn't useful."); - } if(cal.getCaltype().type != Calibration::Type::None) { if(InformationBox::AskQuestion("Adjust span?", "Do you want to adjust the span to match the loaded calibration file?", false)) { SpanMatchCal(); @@ -510,6 +506,10 @@ VNA::VNA(AppWindow *window, QString name) calApplyToTraces->setEnabled(true); bMatchCal->setEnabled(true); saveCal->setEnabled(true); + if(window->getDevice() && !cal.validForDevice(window->getDevice()->getSerial())) { + InformationBox::ShowMessage("Invalid calibration", "The selected calibration was created for a different device. You can still load it but the resulting " + "data likely isn't useful."); + } }); tb_cal->addWidget(cbType);