diff --git a/Software/PC_Application/Calibration/calibration.cpp b/Software/PC_Application/Calibration/calibration.cpp index 8a6738e..75d460d 100644 --- a/Software/PC_Application/Calibration/calibration.cpp +++ b/Software/PC_Application/Calibration/calibration.cpp @@ -27,6 +27,7 @@ Calibration::Calibration() type = Type::None; port1Standard = port2Standard = PortStandard::Male; + throughZeroLength = false; } Calibration::Standard Calibration::getPort1Standard(Calibration::Measurement m) @@ -141,6 +142,10 @@ bool Calibration::constructErrorTerms(Calibration::Type type) port1Standard = PortStandard::Male; port2Standard = PortStandard::Male; } + if(port1Standard == port2Standard) { + // unable to use zero-length through + throughZeroLength = false; + } switch(type) { case Type::Port1SOL: constructPort1SOL(); break; case Type::Port2SOL: constructPort2SOL(); break; @@ -194,6 +199,14 @@ void Calibration::construct12TermPoints() p.fe30 = S21_isolation; // See page 18 of https://www.rfmentor.com/sites/default/files/NA_Error_Models_and_Cal_Methods.pdf // Formulas for S11M and S21M solved for e22 and e10e32 + if (throughZeroLength) { + // use ideal through + actual.ThroughS11 = 0.0; + actual.ThroughS12 = 1.0; + actual.ThroughS21 = 1.0; + actual.ThroughS22 = 0.0; + } + auto deltaS = actual.ThroughS11*actual.ThroughS22 - actual.ThroughS21 * actual.ThroughS12; p.fe22 = ((S11_through - p.fe00)*(1.0 - p.fe11 * actual.ThroughS11)-actual.ThroughS11*p.fe10e01) / ((S11_through - p.fe00)*(actual.ThroughS22-p.fe11*deltaS)-deltaS*p.fe10e01); @@ -859,6 +872,16 @@ QString Calibration::descriptiveCalName(){ return tmp; } +bool Calibration::getThroughZeroLength() const +{ + return throughZeroLength; +} + +void Calibration::setThroughZeroLength(bool value) +{ + throughZeroLength = value; +} + double Calibration::getMinFreq(){ return this->minFreq; } @@ -900,6 +923,7 @@ nlohmann::json Calibration::toJSON() j["type"] = TypeToString(getType()).toStdString(); j["port1StandardMale"] = port1Standard == PortStandard::Male; j["port2StandardMale"] = port2Standard == PortStandard::Male; + j["throughZeroLength"] = throughZeroLength; return j; } @@ -910,6 +934,7 @@ void Calibration::fromJSON(nlohmann::json j) resetErrorTerms(); port1Standard = j.value("port1StandardMale", true) ? PortStandard::Male : PortStandard::Female; port2Standard = j.value("port2StandardMale", true) ? PortStandard::Male : PortStandard::Female; + throughZeroLength = j.value("throughZeroLength", false); if(j.contains("measurements")) { // grab measurements for(auto j_m : j["measurements"]) { @@ -981,6 +1006,11 @@ ostream& operator<<(ostream &os, const Calibration &c) istream& operator >>(istream &in, Calibration &c) { + // old file format did not contain port standard gender, set default + c.port1Standard = Calibration::PortStandard::Male; + c.port2Standard = Calibration::PortStandard::Male; + c.throughZeroLength = false; + std::string line; while(getline(in, line)) { QString qLine = QString::fromStdString(line).simplified(); @@ -1020,9 +1050,6 @@ istream& operator >>(istream &in, Calibration &c) } } } - // old file format did not contain port standard gender, set default - c.port1Standard = Calibration::PortStandard::Male; - c.port2Standard = Calibration::PortStandard::Male; qDebug() << "Calibration file parsing complete"; return in; } diff --git a/Software/PC_Application/Calibration/calibration.h b/Software/PC_Application/Calibration/calibration.h index f465790..f3f2717 100644 --- a/Software/PC_Application/Calibration/calibration.h +++ b/Software/PC_Application/Calibration/calibration.h @@ -115,6 +115,8 @@ public: }; void setPortStandard(int port, PortStandard standard); PortStandard getPortStandard(int port); + bool getThroughZeroLength() const; + void setThroughZeroLength(bool value); QString getCurrentCalibrationFile(); double getMinFreq(); @@ -176,6 +178,7 @@ private: QString currentCalFile; PortStandard port1Standard, port2Standard; + bool throughZeroLength; }; #endif // CALIBRATION_H diff --git a/Software/PC_Application/Calibration/calibrationtracedialog.cpp b/Software/PC_Application/Calibration/calibrationtracedialog.cpp index 74f8775..55c2f08 100644 --- a/Software/PC_Application/Calibration/calibrationtracedialog.cpp +++ b/Software/PC_Application/Calibration/calibrationtracedialog.cpp @@ -26,12 +26,26 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d ui->tableView->setColumnWidth(3, 160); UpdateCalibrationStatus(); + auto updateThroughStandardUI = [=](){ + if(cal->getPortStandard(1) == cal->getPortStandard(2)) { + // same gender on both ports, can't use zero length through + ui->throughCalkit->click(); + ui->throughZero->setEnabled(false); + ui->throughCalkit->setEnabled(false); + } else { + // user may select option for through + ui->throughZero->setEnabled(true); + ui->throughCalkit->setEnabled(true); + } + }; + connect(ui->port1Group, qOverload(&QButtonGroup::buttonClicked), [=](){ if(ui->port1Male->isChecked()) { cal->setPortStandard(1, Calibration::PortStandard::Male); } else { cal->setPortStandard(1, Calibration::PortStandard::Female); } + updateThroughStandardUI(); UpdateCalibrationStatus(); }); @@ -41,6 +55,16 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d } else { cal->setPortStandard(2, Calibration::PortStandard::Female); } + updateThroughStandardUI(); + UpdateCalibrationStatus(); + }); + + connect(ui->throughGroup, qOverload(&QButtonGroup::buttonClicked), [=](){ + if(ui->throughZero->isChecked()) { + cal->setThroughZeroLength(true); + } else { + cal->setThroughZeroLength(false); + } UpdateCalibrationStatus(); }); @@ -48,9 +72,11 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d if(!cal->getCalibrationKit().hasSeparateMaleFemaleStandards()) { ui->port1Standards->hide(); ui->port2Standards->hide(); + ui->throughStandard->hide(); // default selection is male ui->port1Male->click(); ui->port2Male->click(); + ui->throughCalkit->click(); } else { // separate standards defined if(cal->getPortStandard(1) == Calibration::PortStandard::Male) { @@ -63,6 +89,12 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d } else { ui->port2Female->setChecked(true); } + if(cal->getThroughZeroLength()) { + ui->throughZero->setChecked(true); + } else { + ui->throughCalkit->setChecked(true); + } + updateThroughStandardUI(); } // Check calibration kit span diff --git a/Software/PC_Application/Calibration/calibrationtracedialog.ui b/Software/PC_Application/Calibration/calibrationtracedialog.ui index 0a4dea5..58dd531 100644 --- a/Software/PC_Application/Calibration/calibrationtracedialog.ui +++ b/Software/PC_Application/Calibration/calibrationtracedialog.ui @@ -18,7 +18,7 @@ - + @@ -77,6 +77,35 @@ + + + + Through Standard + + + + + + From calibration kit + + + throughGroup + + + + + + + Zero-length through + + + throughGroup + + + + + + @@ -173,5 +202,6 @@ +