From cece0080ed65119acb8242d2c869346f8d661795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Tue, 15 Mar 2022 15:26:02 +0100 Subject: [PATCH] Selectable reference impedance --- .../Tools/impedancematchdialog.cpp | 5 +++-- .../Tools/impedancematchdialog.h | 2 +- .../PC_Application/Traces/tracesmithchart.cpp | 9 +++++---- .../PC_Application/Traces/tracesmithchart.h | 1 - Software/PC_Application/Traces/tracexyplot.cpp | 2 +- Software/PC_Application/Util/util.cpp | 6 ++++++ Software/PC_Application/Util/util.h | 4 +--- .../VNA/Deembedding/matchingnetwork.cpp | 6 +++--- .../PC_Application/VNA/Deembedding/twothru.cpp | 2 +- Software/PC_Application/preferences.cpp | 5 +++++ Software/PC_Application/preferences.h | 2 ++ Software/PC_Application/preferencesdialog.ui | 18 ++++++++++++++++++ 12 files changed, 46 insertions(+), 16 deletions(-) diff --git a/Software/PC_Application/Tools/impedancematchdialog.cpp b/Software/PC_Application/Tools/impedancematchdialog.cpp index c3e697b..79814c8 100644 --- a/Software/PC_Application/Tools/impedancematchdialog.cpp +++ b/Software/PC_Application/Tools/impedancematchdialog.cpp @@ -3,17 +3,18 @@ #include "ui_impedancematchdialog.h" #include "Tools/eseries.h" #include "Util/util.h" +#include "preferences.h" using namespace std; -constexpr double ImpedanceMatchDialog::Z0; - ImpedanceMatchDialog::ImpedanceMatchDialog(MarkerModel &model, Marker *marker, QWidget *parent) : QDialog(parent), ui(new Ui::ImpedanceMatchDialog) { ui->setupUi(this); + Z0 = Preferences::getInstance().Acquisition.refImp; + // set SI units and prefixes ui->zReal->setUnit("Ohm"); ui->zImag->setUnit("Ohm"); diff --git a/Software/PC_Application/Tools/impedancematchdialog.h b/Software/PC_Application/Tools/impedancematchdialog.h index d326254..14e1bb4 100644 --- a/Software/PC_Application/Tools/impedancematchdialog.h +++ b/Software/PC_Application/Tools/impedancematchdialog.h @@ -22,7 +22,7 @@ private slots: void calculateMatch(); private: - static constexpr double Z0 = 50.0; + double Z0; Ui::ImpedanceMatchDialog *ui; }; diff --git a/Software/PC_Application/Traces/tracesmithchart.cpp b/Software/PC_Application/Traces/tracesmithchart.cpp index 2f084dd..5c0e204 100644 --- a/Software/PC_Application/Traces/tracesmithchart.cpp +++ b/Software/PC_Application/Traces/tracesmithchart.cpp @@ -305,7 +305,7 @@ void TraceSmithChart::draw(QPainter &p) { p.drawLine(dataToPixel(complex(edgeReflection,0)),dataToPixel(complex(-edgeReflection,0))); constexpr std::array impedanceLines = {10, 25, 50, 100, 250}; for(auto z : impedanceLines) { - z /= ReferenceImpedance; + z /= Preferences::getInstance().Acquisition.refImp; auto radius = 1.0/z; drawArc(SmithChartArc(QPointF(1.0, radius), radius, 0, 2*M_PI)); drawArc(SmithChartArc(QPointF(1.0, -radius), radius, 0, 2*M_PI)); @@ -409,7 +409,7 @@ QString TraceSmithChart::mouseText(QPoint pos) { auto data = pixelToData(pos); if(abs(data) <= edgeReflection) { - data = 50.0 * (1.0 + data) / (1.0 - data); + data = Preferences::getInstance().Acquisition.refImp * (1.0 + data) / (1.0 - data); auto ret = Unit::ToString(data.real(), "", " ", 3); if(data.imag() >= 0) { ret += "+"; @@ -586,18 +586,19 @@ SmithChartConstantLine::SmithChartConstantLine() std::vector SmithChartConstantLine::getArcs() { + double Z0 = Preferences::getInstance().Acquisition.refImp; std::vector arcs; switch(type) { case Type::VSWR: arcs.push_back(SmithChartArc(QPointF(0.0, 0.0), (param - 1.0) / (param + 1.0))); break; case Type::Resistance: { - auto circleLeft = (param / 50.0 - 1.0) / (param / 50.0 + 1.0); + auto circleLeft = (param / Z0 - 1.0) / (param / Z0 + 1.0); arcs.push_back(SmithChartArc(QPointF((circleLeft + 1.0) / 2, 0.0), (1.0 - circleLeft) / 2.0)); } break; case Type::Reactance: { - auto radius = 1.0/(param / 50.0); + auto radius = 1.0/(param / Z0); if(radius > 0) { arcs.push_back(SmithChartArc(QPointF(1.0, radius), radius)); } else { diff --git a/Software/PC_Application/Traces/tracesmithchart.h b/Software/PC_Application/Traces/tracesmithchart.h index f83f984..178e269 100644 --- a/Software/PC_Application/Traces/tracesmithchart.h +++ b/Software/PC_Application/Traces/tracesmithchart.h @@ -115,7 +115,6 @@ public slots: void axisSetupDialog(); protected: - static constexpr double ReferenceImpedance = 50.0; static constexpr double screenUsage = 0.9; static constexpr double smithCoordMax = 4096; diff --git a/Software/PC_Application/Traces/tracexyplot.cpp b/Software/PC_Application/Traces/tracexyplot.cpp index fdb9838..d774e6a 100644 --- a/Software/PC_Application/Traces/tracexyplot.cpp +++ b/Software/PC_Application/Traces/tracexyplot.cpp @@ -1247,7 +1247,7 @@ QString TraceXYPlot::AxisUnit(TraceXYPlot::YAxisType type) case TraceXYPlot::YAxisType::ImpulseReal: return ""; case TraceXYPlot::YAxisType::ImpulseMag: return "dB"; case TraceXYPlot::YAxisType::Step: return ""; - case TraceXYPlot::YAxisType::Impedance: return "Ohm"; + case TraceXYPlot::YAxisType::Impedance: return "Ω"; case TraceXYPlot::YAxisType::GroupDelay: return "s"; case TraceXYPlot::YAxisType::Disabled: case TraceXYPlot::YAxisType::Real: diff --git a/Software/PC_Application/Util/util.cpp b/Software/PC_Application/Util/util.cpp index 3395869..5bbf24d 100644 --- a/Software/PC_Application/Util/util.cpp +++ b/Software/PC_Application/Util/util.cpp @@ -1,5 +1,7 @@ #include "util.h" +#include "preferences.h" + #include void Util::unwrapPhase(std::vector &phase, unsigned int start_index) @@ -59,3 +61,7 @@ double Util::distanceToLine(QPointF point, QPointF l1, QPointF l2, QPointF *clos } return orthVect.length(); } + +std::complex Util::SparamToImpedance(std::complex d) { + return Preferences::getInstance().Acquisition.refImp * (1.0 + d) / (1.0 - d); +} diff --git a/Software/PC_Application/Util/util.h b/Software/PC_Application/Util/util.h index 07099e4..190b396 100644 --- a/Software/PC_Application/Util/util.h +++ b/Software/PC_Application/Util/util.h @@ -44,9 +44,7 @@ namespace Util { static inline double SparamToVSWR(std::complex d) { return SparamToVSWR(abs(d)); } - static inline std::complex SparamToImpedance(std::complex d) { - return 50.0 * (1.0 + d) / (1.0 - d); - } + std::complex SparamToImpedance(std::complex d); // all these conversions assume series connection of real and imag part static inline double SparamToResistance(std::complex d) { return SparamToImpedance(d).real(); diff --git a/Software/PC_Application/VNA/Deembedding/matchingnetwork.cpp b/Software/PC_Application/VNA/Deembedding/matchingnetwork.cpp index 874cd43..3458b99 100644 --- a/Software/PC_Application/VNA/Deembedding/matchingnetwork.cpp +++ b/Software/PC_Application/VNA/Deembedding/matchingnetwork.cpp @@ -32,7 +32,7 @@ void MatchingNetwork::transformDatapoint(Protocol::Datapoint &p) complex(p.real_S12, p.imag_S12), complex(p.real_S21, p.imag_S21), complex(p.real_S22, p.imag_S22)); - auto measurement = ABCDparam(S, 50.0); + auto measurement = ABCDparam(S, Preferences::getInstance().Acquisition.refImp); if(matching.count(p.frequency) == 0) { // this point is not calculated yet MatchingPoint m; @@ -56,7 +56,7 @@ void MatchingNetwork::transformDatapoint(Protocol::Datapoint &p) // at this point the map contains the matching network effect auto m = matching[p.frequency]; auto corrected = m.p1 * measurement * m.p2; - S = Sparam(corrected, 50.0); + S = Sparam(corrected, Preferences::getInstance().Acquisition.refImp); p.real_S11 = real(S.m11); p.imag_S11 = imag(S.m11); p.real_S12 = real(S.m12); @@ -541,7 +541,7 @@ ABCDparam MatchingComponent::parameters(double freq) } else { auto d = touchstone->interpolate(freq); auto S = Sparam(d.S[0], d.S[1], d.S[2], d.S[3]); - return ABCDparam(S, 50.0); + return ABCDparam(S, Preferences::getInstance().Acquisition.refImp); } default: return ABCDparam(1.0, 0.0, 0.0, 1.0); diff --git a/Software/PC_Application/VNA/Deembedding/twothru.cpp b/Software/PC_Application/VNA/Deembedding/twothru.cpp index 727a7ce..a961318 100644 --- a/Software/PC_Application/VNA/Deembedding/twothru.cpp +++ b/Software/PC_Application/VNA/Deembedding/twothru.cpp @@ -12,7 +12,7 @@ using namespace std; TwoThru::TwoThru() { - Z0 = 50.0; + Z0 = Preferences::getInstance().Acquisition.refImp; } void TwoThru::transformDatapoint(Protocol::Datapoint &p) diff --git a/Software/PC_Application/preferences.cpp b/Software/PC_Application/preferences.cpp index efa9fac..470e630 100644 --- a/Software/PC_Application/preferences.cpp +++ b/Software/PC_Application/preferences.cpp @@ -88,6 +88,9 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) : ui->StartupSARBW->setPrefixes(" k"); // Acquisition page + ui->AcquisitionReferenceImpedance->setUnit("Ω"); + ui->AcquisitionReferenceImpedance->setPrefixes(" "); + ui->AcquisitionReferenceImpedance->setPrecision(3); ui->AcquisitionDFTlimitRBW->setUnit("Hz"); ui->AcquisitionDFTlimitRBW->setPrefixes(" k"); connect(ui->AcquisitionUseDFT, &QCheckBox::toggled, [=](bool enabled) { @@ -234,6 +237,7 @@ void PreferencesDialog::setInitialGUIState() ui->AcquisitionAdjustPowerLevel->setChecked(p->Acquisition.adjustPowerLevel); ui->AcquisitionUseHarmonic->setChecked(p->Acquisition.harmonicMixing); ui->AcquisitionAllowSegmentedSweep->setChecked(p->Acquisition.allowSegmentedSweep); + ui->AcquisitionReferenceImpedance->setValue(p->Acquisition.refImp); ui->AcquisitionUseDFT->setChecked(p->Acquisition.useDFTinSAmode); ui->AcquisitionDFTlimitRBW->setValue(p->Acquisition.RBWLimitForDFT); ui->AcquisitionAveragingMode->setCurrentIndex(p->Acquisition.useMedianAveraging ? 1 : 0); @@ -294,6 +298,7 @@ void PreferencesDialog::updateFromGUI() p->Acquisition.adjustPowerLevel = ui->AcquisitionAdjustPowerLevel->isChecked(); p->Acquisition.harmonicMixing = ui->AcquisitionUseHarmonic->isChecked(); p->Acquisition.allowSegmentedSweep = ui->AcquisitionAllowSegmentedSweep->isChecked(); + p->Acquisition.refImp = ui->AcquisitionReferenceImpedance->value(); p->Acquisition.useDFTinSAmode = ui->AcquisitionUseDFT->isChecked(); p->Acquisition.RBWLimitForDFT = ui->AcquisitionDFTlimitRBW->value(); p->Acquisition.useMedianAveraging = ui->AcquisitionAveragingMode->currentIndex() == 1; diff --git a/Software/PC_Application/preferences.h b/Software/PC_Application/preferences.h index 67a28c4..f70327b 100644 --- a/Software/PC_Application/preferences.h +++ b/Software/PC_Application/preferences.h @@ -73,6 +73,7 @@ public: bool useDFTinSAmode; double RBWLimitForDFT; bool useMedianAveraging; + double refImp; // reference impedance // advanced, hardware specific settings double IF1; @@ -152,6 +153,7 @@ private: {&Acquisition.useDFTinSAmode, "Acquisition.useDFTinSAmode", true}, {&Acquisition.RBWLimitForDFT, "Acquisition.RBWLimitForDFT", 3000.0}, {&Acquisition.useMedianAveraging, "Acquisition.useMedianAveraging", false}, + {&Acquisition.refImp, "Acquisition.referenceImpedance", 50.0}, {&Acquisition.IF1, "Acquisition.IF1", 62000000}, {&Acquisition.ADCprescaler, "Acquisition.ADCprescaler", 128}, {&Acquisition.DFTPhaseInc, "Acquisition.DFTPhaseInc", 1280}, diff --git a/Software/PC_Application/preferencesdialog.ui b/Software/PC_Application/preferencesdialog.ui index 5cfa158..1687165 100644 --- a/Software/PC_Application/preferencesdialog.ui +++ b/Software/PC_Application/preferencesdialog.ui @@ -745,6 +745,24 @@ + + + + + + Reference impedance: + + + + + + + <html><head/><body><p>Frequency of the first IF</p></body></html> + + + + +