consider internal reflection path for matching network

This commit is contained in:
Jan Käberich 2022-12-09 17:41:32 +01:00
parent a84d8de0e6
commit b67275831b

View File

@ -4,6 +4,7 @@
#include "unit.h" #include "unit.h"
#include "CustomWidgets/informationbox.h" #include "CustomWidgets/informationbox.h"
#include "appwindow.h" #include "appwindow.h"
#include "Util/util.h"
#include <QDialog> #include <QDialog>
#include <QHBoxLayout> #include <QHBoxLayout>
@ -54,6 +55,17 @@ void MatchingNetwork::transformDatapoint(VirtualDevice::VNAMeasurement &p)
// at this point the map contains the matching network effect // at this point the map contains the matching network effect
auto m = matching[p.frequency]; auto m = matching[p.frequency];
VirtualDevice::VNAMeasurement uncorrected = p; VirtualDevice::VNAMeasurement uncorrected = p;
auto portReflectionName = "S"+QString::number(port)+QString::number(port);
if(!uncorrected.measurements.count(portReflectionName)) {
// the reflection measurement for the port to de-embed is not included, nothing can be done
return;
}
// calculate internal reflection at the matching port
auto portReflectionS = uncorrected.measurements[portReflectionName];
auto matchingReflectionS = Sparam(m.forward, p.Z0).m22;
auto internalPortReflectionS = matchingReflectionS / (1.0 - matchingReflectionS * portReflectionS);
// handle the measurements // handle the measurements
for(auto &meas : p.measurements) { for(auto &meas : p.measurements) {
QString name = meas.first; QString name = meas.first;
@ -78,12 +90,23 @@ void MatchingNetwork::transformDatapoint(VirtualDevice::VNAMeasurement &p)
} }
} else { } else {
// through measurement // through measurement
if(i != port && j != port) {
try {
// find through measurements from these two ports to and from the embedding port
auto toPort = uncorrected.measurements["S"+QString::number(port)+QString::number(j)];
auto fromPort = uncorrected.measurements["S"+QString::number(i)+QString::number(port)];
p.measurements[name] = p.measurements[name] + toPort * internalPortReflectionS * fromPort;
} catch (...) {
// missing measurements, nothing can be done
}
} else {
// Already handled by reflection measurement (toSparam uses S12/S21 as well) // Already handled by reflection measurement (toSparam uses S12/S21 as well)
// and if the corresponding reflection measurement is not available, we can't // and if the corresponding reflection measurement is not available, we can't
// do anything anyway // do anything anyway
} }
} }
} }
}
void MatchingNetwork::edit() void MatchingNetwork::edit()
{ {