mirror of
https://github.com/jankae/LibreVNA.git
synced 2026-04-06 06:53:37 +00:00
Improve de-embedding
- Add Z parameters with general conversion from and to S parameters - Implement impedance renormalization over general Z parameters - Fix crash after taking de-embedding measurement - Fix various small bugs with new parameter implementation
This commit is contained in:
parent
77a3fc5039
commit
0205ab494d
11 changed files with 286 additions and 77 deletions
|
|
@ -61,33 +61,55 @@ unsigned int DeviceDriver::SApoints() {
|
|||
}
|
||||
}
|
||||
|
||||
Sparam DeviceDriver::VNAMeasurement::toSparam(int port1, int port2) const
|
||||
Sparam DeviceDriver::VNAMeasurement::toSparam(int ports) const
|
||||
{
|
||||
Sparam S;
|
||||
S.set(1,1, measurements.at("S"+QString::number(port1)+QString::number(port1)));
|
||||
S.set(1,2, measurements.at("S"+QString::number(port1)+QString::number(port2)));
|
||||
S.set(2,1, measurements.at("S"+QString::number(port2)+QString::number(port1)));
|
||||
S.set(2,2, measurements.at("S"+QString::number(port2)+QString::number(port2)));
|
||||
if(ports == 0) {
|
||||
// determine number of ports by highest available S parameter
|
||||
for(const auto &m : measurements) {
|
||||
if(!m.first.startsWith("S")) {
|
||||
// something else we can not handle
|
||||
continue;
|
||||
}
|
||||
int to = m.first.mid(1,1).toUInt();
|
||||
int from = m.first.mid(2,1).toUInt();
|
||||
if(to > ports) {
|
||||
ports = to;
|
||||
}
|
||||
if(from > ports) {
|
||||
ports = from;
|
||||
}
|
||||
}
|
||||
}
|
||||
// create S paramters
|
||||
auto S = Sparam(ports);
|
||||
// fill data
|
||||
for(const auto &m : measurements) {
|
||||
if(!m.first.startsWith("S")) {
|
||||
// something else we can not handle
|
||||
continue;
|
||||
}
|
||||
int to = m.first.mid(1,1).toUInt();
|
||||
int from = m.first.mid(2,1).toUInt();
|
||||
S.set(to, from, m.second);
|
||||
}
|
||||
return S;
|
||||
}
|
||||
|
||||
void DeviceDriver::VNAMeasurement::fromSparam(Sparam S, int port1, int port2)
|
||||
void DeviceDriver::VNAMeasurement::fromSparam(Sparam S, std::vector<unsigned int> portMapping)
|
||||
{
|
||||
QString s11 = "S"+QString::number(port1)+QString::number(port1);
|
||||
QString s12 = "S"+QString::number(port1)+QString::number(port2);
|
||||
QString s21 = "S"+QString::number(port2)+QString::number(port1);
|
||||
QString s22 = "S"+QString::number(port2)+QString::number(port2);
|
||||
if(measurements.count(s11)) {
|
||||
measurements[s11] = S.get(1,1);
|
||||
if(portMapping.size() == 0) {
|
||||
// set up default port mapping
|
||||
for(unsigned int i=1;i<=S.ports();i++) {
|
||||
portMapping.push_back(i);
|
||||
}
|
||||
}
|
||||
if(measurements.count(s12)) {
|
||||
measurements[s12] = S.get(1,2);
|
||||
}
|
||||
if(measurements.count(s21)) {
|
||||
measurements[s21] = S.get(2,1);
|
||||
}
|
||||
if(measurements.count(s22)) {
|
||||
measurements[s22] = S.get(2,2);
|
||||
for(unsigned int i=0;i<portMapping.size();i++) {
|
||||
for(unsigned int j=0;j<portMapping.size();j++) {
|
||||
QString name = "S"+QString::number(i+1)+QString::number(j+1);
|
||||
if(measurements.count(name)) {
|
||||
measurements[name] = S.get(portMapping[i], portMapping[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue