From 8db7f003ee4e6d601503ac528308b1ff4fc03c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Thu, 8 Dec 2022 13:45:07 +0100 Subject: [PATCH] new matching network option: defined shunt --- .../LibreVNA-GUI/Tools/parameters.cpp | 15 ++++ .../LibreVNA-GUI/Tools/parameters.h | 7 ++ .../VNA/Deembedding/matchingnetwork.cpp | 41 ++++++++++- .../VNA/Deembedding/matchingnetwork.h | 1 + .../VNA/Deembedding/matchingnetworkdialog.ui | 43 +++++++++++ .../PC_Application/LibreVNA-GUI/icons.qrc | 6 +- .../LibreVNA-GUI/icons/definedShunt.png | Bin 0 -> 1496 bytes .../LibreVNA-GUI/icons/definedShunt.svg | 68 ++++++++++++++++++ .../LibreVNA-GUI/icons/definedThrough.png | Bin 884 -> 1431 bytes .../LibreVNA-GUI/icons/definedThrough.svg | 16 ++++- 10 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 Software/PC_Application/LibreVNA-GUI/icons/definedShunt.png create mode 100644 Software/PC_Application/LibreVNA-GUI/icons/definedShunt.svg diff --git a/Software/PC_Application/LibreVNA-GUI/Tools/parameters.cpp b/Software/PC_Application/LibreVNA-GUI/Tools/parameters.cpp index b5e715b..2128680 100644 --- a/Software/PC_Application/LibreVNA-GUI/Tools/parameters.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Tools/parameters.cpp @@ -65,3 +65,18 @@ void Parameters::fromJSON(nlohmann::json j) m21 = complex(j.value("m21_real", 0.0), j.value("m21_imag", 0.0)); m22 = complex(j.value("m22_real", 0.0), j.value("m22_imag", 0.0)); } + +Yparam::Yparam(const Sparam &s, Type Z01, Type Z02) +{ + // from https://www.rfcafe.com/references/electrical/s-h-y-z.htm + auto denom = (conj(Z01)+s.m11*Z01)*(conj(Z02)+s.m22*Z02)-s.m12*s.m21*Z01*Z02; + m11 = ((1.0-s.m11)*(conj(Z02)+s.m22*Z02)+s.m12*s.m21*Z02) / denom; + m12 = -2.0*s.m12*sqrt(real(Z01)*real(Z02)); + m21 = -2.0*s.m21*sqrt(real(Z01)*real(Z02)); + m22 = ((conj(Z01)+s.m11*Z01)*(1.0-s.m22)+s.m12*s.m21*Z01) / denom; +} + +Yparam::Yparam(const Sparam &s, Type Z0) + : Yparam(s, Z0, Z0) +{ +} diff --git a/Software/PC_Application/LibreVNA-GUI/Tools/parameters.h b/Software/PC_Application/LibreVNA-GUI/Tools/parameters.h index 41e4129..2da96a7 100644 --- a/Software/PC_Application/LibreVNA-GUI/Tools/parameters.h +++ b/Software/PC_Application/LibreVNA-GUI/Tools/parameters.h @@ -131,4 +131,11 @@ public: } }; +class Yparam : public Parameters { +public: + using Parameters::Parameters; + Yparam(const Sparam &s, Type Z01, Type Z02); + Yparam(const Sparam &s, Type Z0); +}; + #endif // TPARAM_H diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.cpp index 747b08e..1ae5180 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.cpp @@ -109,6 +109,7 @@ void MatchingNetwork::edit() ui->lParallelL->installEventFilter(this); ui->lParallelR->installEventFilter(this); ui->lDefinedThrough->installEventFilter(this); + ui->lDefinedShunt->installEventFilter(this); ui->port->setValue(port); ui->port->setMaximum(VirtualDevice::getInfo(VirtualDevice::getConnected()).ports); @@ -361,6 +362,8 @@ bool MatchingNetwork::eventFilter(QObject *object, QEvent *event) dragComponent = new MatchingComponent(MatchingComponent::Type::ParallelR); } else if(object->objectName() == "lDefinedThrough") { dragComponent = new MatchingComponent(MatchingComponent::Type::DefinedThrough); + } else if(object->objectName() == "lDefinedShunt") { + dragComponent = new MatchingComponent(MatchingComponent::Type::DefinedShunt); } else { dragComponent = nullptr; } @@ -470,6 +473,19 @@ MatchingComponent::MatchingComponent(Type type) updateTouchstoneLabel(); } break; + case Type::DefinedShunt: { + touchstone = new Touchstone(2); + touchstoneLabel = new QLabel(); + touchstoneLabel->setWordWrap(true); + touchstoneLabel->setAlignment(Qt::AlignCenter); + auto layout = new QVBoxLayout(); + layout->addWidget(touchstoneLabel); + layout->setContentsMargins(0, 0, 0, 0); + setLayout(layout); + setStyleSheet("image: url(:/icons/definedShunt.png);"); + updateTouchstoneLabel(); + } + break; default: break; } @@ -504,7 +520,16 @@ 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, touchstone->getReferenceImpedance()); + } + case Type::DefinedShunt: + if(touchstone->points() == 0 || freq < touchstone->minFreq() || freq > touchstone->maxFreq()) { + // outside of provided frequency range, pass through unchanged + return ABCDparam(1.0, 0.0, 0.0, 1.0); + } else { + auto d = touchstone->interpolate(freq); + auto Y = Yparam(Sparam(d.S[0], d.S[1], d.S[2], d.S[3]), touchstone->getReferenceImpedance()); + return ABCDparam(1.0, 0.0, Y.m11, 1.0); } default: return ABCDparam(1.0, 0.0, 0.0, 1.0); @@ -547,6 +572,7 @@ nlohmann::json MatchingComponent::toJSON() j["value"] = eValue->value(); break; case Type::DefinedThrough: + case Type::DefinedShunt: j["touchstone"] = touchstone->toJSON(); break; case Type::Last: @@ -567,6 +593,7 @@ void MatchingComponent::fromJSON(nlohmann::json j) eValue->setValue(j.value("value", 1e-12)); break; case Type::DefinedThrough: + case Type::DefinedShunt: touchstone->fromJSON(j["touchstone"]); updateTouchstoneLabel(); break; @@ -578,7 +605,7 @@ void MatchingComponent::fromJSON(nlohmann::json j) void MatchingComponent::mouseDoubleClickEvent(QMouseEvent *e) { Q_UNUSED(e); - if(type == Type::DefinedThrough) { + if(type == Type::DefinedThrough || type == Type::DefinedShunt) { // select new touchstone file auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "Touchstone files (*.s2p)", nullptr, QFileDialog::DontUseNativeDialog); if (!filename.isEmpty()) { @@ -588,6 +615,7 @@ void MatchingComponent::mouseDoubleClickEvent(QMouseEvent *e) InformationBox::ShowError("Failed to load file", QString("Attempt to load file ended with error: \"") + e.what()+"\""); } updateTouchstoneLabel(); + emit valueChanged(); } } } @@ -597,6 +625,9 @@ void MatchingComponent::updateTouchstoneLabel() if(!touchstone || !touchstoneLabel) { return; } + QFont font = touchstoneLabel->font(); + font.setPointSize(10); + touchstoneLabel->setFont(font); if(touchstone->points() == 0) { touchstoneLabel->setText("No data. Double-click to select touchstone file"); } else { @@ -604,6 +635,11 @@ void MatchingComponent::updateTouchstoneLabel() + " to "+Unit::ToString(touchstone->maxFreq(), "Hz", " kMG", 4); touchstoneLabel->setText(text); } + if(type == Type::DefinedThrough) { + touchstoneLabel->setAlignment(Qt::AlignCenter); + } else if(type == Type::DefinedShunt) { + touchstoneLabel->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + } } QString MatchingComponent::typeToName(MatchingComponent::Type type) @@ -616,6 +652,7 @@ QString MatchingComponent::typeToName(MatchingComponent::Type type) case Type::ParallelL: return "ParallelL"; case Type::ParallelC: return "ParallelC"; case Type::DefinedThrough: return "Touchstone Through"; + case Type::DefinedShunt: return "Touchstone Shunt"; default: return ""; } } diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.h b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.h index 7297bf2..6825ebd 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.h +++ b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetwork.h @@ -24,6 +24,7 @@ public: ParallelL, ParallelC, DefinedThrough, + DefinedShunt, // Add new matching components here, do not explicitly assign values and keep the Last entry at the last position Last, }; diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetworkdialog.ui b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetworkdialog.ui index ee9eb7e..d5c06ea 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetworkdialog.ui +++ b/Software/PC_Application/LibreVNA-GUI/VNA/Deembedding/matchingnetworkdialog.ui @@ -596,6 +596,49 @@ + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + border-image: url(:/icons/definedShunt.svg); + + + Def. Shunt + + + Qt::AlignHCenter|Qt::AlignTop + + + true + + + + + + diff --git a/Software/PC_Application/LibreVNA-GUI/icons.qrc b/Software/PC_Application/LibreVNA-GUI/icons.qrc index 58f230d..0c25332 100644 --- a/Software/PC_Application/LibreVNA-GUI/icons.qrc +++ b/Software/PC_Application/LibreVNA-GUI/icons.qrc @@ -50,14 +50,12 @@ icons/down.png icons/up.png icons/chainlink.png - icons/definedThrough.svg icons/seriesR.png icons/seriesL.png icons/seriesC.png icons/parallelR.png icons/parallelL.png icons/parallelC.png - icons/definedThrough.png icons/LibreVNAV1.svg icons/compound_V1_Ref_Left.svg icons/compound_V1_Ref_Middle.svg @@ -69,5 +67,9 @@ icons/compound_V1_USB.png icons/DUT_onePort.png icons/port.png + icons/definedShunt.png + icons/definedShunt.svg + icons/definedThrough.png + icons/definedThrough.svg diff --git a/Software/PC_Application/LibreVNA-GUI/icons/definedShunt.png b/Software/PC_Application/LibreVNA-GUI/icons/definedShunt.png new file mode 100644 index 0000000000000000000000000000000000000000..81bfba793fbeb044d0dbfde17da7340d5428ec7d GIT binary patch literal 1496 zcma)6X;70_6b%Z3P+6>H6G5;n10ewoqAWo%KtNX60!|V@VpJB9O;7`BWKDr;fs`dO zkODCw2}lDH%O-^&hzmp@Mo0mL3__5w@BQesfBK`-H*?>)bKks~_s+fNWO;kK98lC& z1c5*YT#<+i0Frk@VbAWqg@FLDKL!~T2LdUV?uLwfzV8SKB$w@qIO~`6VU~hM{)E

_%*e^n+8?Id>}p`rHl@L6B6!MSO-?24mu``yLw z$~_M8lP$F@)kyHRERV=%vw{h(<~P{(QRz70W^Svf^Jo0?)7y4CdAtQXUOw`BS!8Yz zRz_Whbl0iP;QvF2+Fus{c%+ucv+`ijXm4TWx_OKm%W?>WY-Z&_?ydalp5<&Ba$z{! z$*FUA7$w~j)Z^`SRg!(+TrO8fIYafuSWJ9Ef}#AehuuB<;?a2X9*c7W4wK@gTV?jQ zm%om6NFrh&BDt4!Td%!S+9ZmiBv7<)bT9{DA3QUn`cSUY~=gs%g4 zL_*kDPID|r7|c)hm9)3FmzL@@O(I)Oq*7@ine33VY4U)^VnNK!4WT_eu~J6Bqb%Krlux!5^kcqzyCr|kQOB!wz#;+9~?~Y7~>;- zeFvy6c^`zrELwk!6SyDQhc2Vm?WMvTNe${cuh#1Jb8TsS{}Bco$1-iG3dPflKY^~&Agp$QaP{e|3C z5vti9Vqt8IkByB@NlC%sa7jr?VPOW=){WKGQ{4}bxdk7h!!Oa9d>8*w-L6_geEjpdd#d}1ncLChc6tSw ziYQs>_;Mz~;Be!oa2zg(830VLXl|$PYAA-i(vhK3?%f@Je55JPrFi4WX>)Kw@G#Ir z7Z;bk<};(sw*isXJb6-%%`eb^Vop(B z7Z(?^v8`d2%--0#PU?6@db+Y6d?w!JQXMKa)j@qAUsS5Dt{`h_X7+|+i?2gPo-7g0 z8bPbBWBgR4|Lss`A$&ofs&d9`;zn62wlYd*dd^j_-{hI~CU#CKa88BHK_=`)@OR)W qx^_|~4dDlHs8*Y~OXa^{J0H7x&Ys=h@`Em5)gV_VPXx;` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.png b/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.png index 71b41820ecdae0060c2d1119bae058ae29474e2f..38be093ecfb5fa702b81d29cfa702149e4dea617 100644 GIT binary patch delta 1222 zcmV;%1UdWk2A2zvIDZ96Nkl7b z-ELsFJ3aIJeRBKFowMJ^oquyCDWxET_ZL%uBB4kq5{f7iijz767=MyMOHIsTB9Vxy zs@pfy($dUkvk~V@)3k5jzHQ&MSS&W1ZP(W-rL(g$0gG8!Sm^2Lsj8~V%ggimd@o+S zc=YH|US3{KPL2>F8jUV2EOc~qT)upHk1MXNtqlzgm6w-CA`wMVUcGwt`0?Y-&CQaM z5`DD4zu)8W3=R&Klz)^QI&>&Ot0fcF;^N|g0|&Nmy4~)~%*?M}ze*{GhlgLje3_k{ zEe+DqqetiF=JcNxMX}rMZns-X+1}nBkH@8yy}iAsPoIv(Vu@LwUE437I&~@(3VrzS zK?qS@U48cKS%dDA4jw$1m6i4S_3LOf`taey`T2Pv#FZ;o7JnBPmzS55{OD$Sdb+r{ zxU{s?=tmZxKYtE|LY0-3X0v%_W=7w%1_A-I*?jESv7|b>(Thf-0|Ns>i1qdLa5(IC zyDb)rLGi}M#y)=h7!HSn!Qk}tbYWqk5aQgqbNXn1e}8*>`;j9@l29=gi`CZFrlh3o z=(kKJ)9!-(^nVLU<>loUE?oHO<3~qFZ8lqC4jXqt@z2gTo!gmX>}P9T^$9d-rZyT7OzsSJ%wU%nzggWhEykC&$Of zrIcG+TPIJR92^|n=`;MW^gtlc)zxLQ*>2vvIWaNu{ZK3xD<~+~p4j8Zk0>%Ghs_-zxbPl!{OoK;S(oL#N+Wxmo7CoH-|zY zeJBtJ6n_;J2_c?6d-neQ``X%CpU>y@dT-sjrC&laaC`qk$&Oa?&Ye4fKtM`aQ&aQ( zr4ygem!F^i<;$0ql@*W2bN%}D?(S|W<;289Lqo%#TKcX{QIaXv)zy`il|6XyU}Ixr z`_8Sct*ckBzI*phO1ZwiE~P9gDpC|hO6hbuD}O614X>DF8;s4(O{ddYQBl#-(xTrJ zkH;Mjhu`m)QU-%TDdpiP5M_0hJrw)^+*@1qIYv+u>{&!4NRDy6(}-B1ymY$x@nZ{nsYPDLe)?Ylp=ksM|X4>ucWO~*6 z>;G<4Rdu;s7cX9X`}S=zy{;s`c4PFV^ABF!M;T+kxa%J=vPC7fsFNTAJdv{&k*^j3 kOp%-|lQaVp7?gni2Dn53>_2~?RR91007*qoM6N<$f*`t!hX4Qo delta 667 zcmV;M0%ZM{3-kt%IAjARNklW2ca>D1byuN9vtot?tET8 zk9UZMh$zy$e+-j91ucI)$uszuXc$I+FJSQhkmS+gv)0FP?E7bEcocur#l^+*^Yhcw z)AaOoI-O=k)vxR8>yeR>jg1Y*aiYZu~;1N6 z;QP@MEPf_Ui0?8=@go zTv=I}nVH$&-*2^AUmHI@K9-i2Ow$yRX0s_Gu~_Ww?M*}qg+eNo(q3`M7K~1(Qz#VT z@%Zxca(9dCy19Q`u3oQ;$k*%a>}+@M*4EbE-rgS?pn;u>mzS5eZHq`IlPQ-D_RhlhtEa&mIAy}d0WtyXJlYN|UswVsRG-=o^Loy}$+A0L%c z^YioL_}dv=~QdXvxR^Z9(=9AKJeFc|dv z{XF&STD#pYl}ZZ>3-|Z;!}Pv}ZABfjvoja}P3g6&TVl`w#9>0$>J#%Xk0)002ovPDHLkV1hU* BTGapm diff --git a/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.svg b/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.svg index c50ab38..d3f3102 100644 --- a/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.svg +++ b/Software/PC_Application/LibreVNA-GUI/icons/definedThrough.svg @@ -20,6 +20,12 @@ + + + + + + @@ -27,7 +33,7 @@ - + @@ -40,5 +46,13 @@ + + + + + + + +