Selectable reference impedance

This commit is contained in:
Jan Käberich 2022-03-15 15:26:02 +01:00
parent d526270fd2
commit cece0080ed
12 changed files with 46 additions and 16 deletions

View File

@ -3,17 +3,18 @@
#include "ui_impedancematchdialog.h" #include "ui_impedancematchdialog.h"
#include "Tools/eseries.h" #include "Tools/eseries.h"
#include "Util/util.h" #include "Util/util.h"
#include "preferences.h"
using namespace std; using namespace std;
constexpr double ImpedanceMatchDialog::Z0;
ImpedanceMatchDialog::ImpedanceMatchDialog(MarkerModel &model, Marker *marker, QWidget *parent) : ImpedanceMatchDialog::ImpedanceMatchDialog(MarkerModel &model, Marker *marker, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::ImpedanceMatchDialog) ui(new Ui::ImpedanceMatchDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
Z0 = Preferences::getInstance().Acquisition.refImp;
// set SI units and prefixes // set SI units and prefixes
ui->zReal->setUnit("Ohm"); ui->zReal->setUnit("Ohm");
ui->zImag->setUnit("Ohm"); ui->zImag->setUnit("Ohm");

View File

@ -22,7 +22,7 @@ private slots:
void calculateMatch(); void calculateMatch();
private: private:
static constexpr double Z0 = 50.0; double Z0;
Ui::ImpedanceMatchDialog *ui; Ui::ImpedanceMatchDialog *ui;
}; };

View File

@ -305,7 +305,7 @@ void TraceSmithChart::draw(QPainter &p) {
p.drawLine(dataToPixel(complex<double>(edgeReflection,0)),dataToPixel(complex<double>(-edgeReflection,0))); p.drawLine(dataToPixel(complex<double>(edgeReflection,0)),dataToPixel(complex<double>(-edgeReflection,0)));
constexpr std::array<double, 5> impedanceLines = {10, 25, 50, 100, 250}; constexpr std::array<double, 5> impedanceLines = {10, 25, 50, 100, 250};
for(auto z : impedanceLines) { for(auto z : impedanceLines) {
z /= ReferenceImpedance; z /= Preferences::getInstance().Acquisition.refImp;
auto radius = 1.0/z; 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));
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); auto data = pixelToData(pos);
if(abs(data) <= edgeReflection) { 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); auto ret = Unit::ToString(data.real(), "", " ", 3);
if(data.imag() >= 0) { if(data.imag() >= 0) {
ret += "+"; ret += "+";
@ -586,18 +586,19 @@ SmithChartConstantLine::SmithChartConstantLine()
std::vector<SmithChartArc> SmithChartConstantLine::getArcs() std::vector<SmithChartArc> SmithChartConstantLine::getArcs()
{ {
double Z0 = Preferences::getInstance().Acquisition.refImp;
std::vector<SmithChartArc> arcs; std::vector<SmithChartArc> arcs;
switch(type) { switch(type) {
case Type::VSWR: case Type::VSWR:
arcs.push_back(SmithChartArc(QPointF(0.0, 0.0), (param - 1.0) / (param + 1.0))); arcs.push_back(SmithChartArc(QPointF(0.0, 0.0), (param - 1.0) / (param + 1.0)));
break; break;
case Type::Resistance: { 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)); arcs.push_back(SmithChartArc(QPointF((circleLeft + 1.0) / 2, 0.0), (1.0 - circleLeft) / 2.0));
} }
break; break;
case Type::Reactance: { case Type::Reactance: {
auto radius = 1.0/(param / 50.0); auto radius = 1.0/(param / Z0);
if(radius > 0) { if(radius > 0) {
arcs.push_back(SmithChartArc(QPointF(1.0, radius), radius)); arcs.push_back(SmithChartArc(QPointF(1.0, radius), radius));
} else { } else {

View File

@ -115,7 +115,6 @@ public slots:
void axisSetupDialog(); void axisSetupDialog();
protected: protected:
static constexpr double ReferenceImpedance = 50.0;
static constexpr double screenUsage = 0.9; static constexpr double screenUsage = 0.9;
static constexpr double smithCoordMax = 4096; static constexpr double smithCoordMax = 4096;

View File

@ -1247,7 +1247,7 @@ QString TraceXYPlot::AxisUnit(TraceXYPlot::YAxisType type)
case TraceXYPlot::YAxisType::ImpulseReal: return ""; case TraceXYPlot::YAxisType::ImpulseReal: return "";
case TraceXYPlot::YAxisType::ImpulseMag: return "dB"; case TraceXYPlot::YAxisType::ImpulseMag: return "dB";
case TraceXYPlot::YAxisType::Step: return ""; 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::GroupDelay: return "s";
case TraceXYPlot::YAxisType::Disabled: case TraceXYPlot::YAxisType::Disabled:
case TraceXYPlot::YAxisType::Real: case TraceXYPlot::YAxisType::Real:

View File

@ -1,5 +1,7 @@
#include "util.h" #include "util.h"
#include "preferences.h"
#include <QVector2D> #include <QVector2D>
void Util::unwrapPhase(std::vector<double> &phase, unsigned int start_index) void Util::unwrapPhase(std::vector<double> &phase, unsigned int start_index)
@ -59,3 +61,7 @@ double Util::distanceToLine(QPointF point, QPointF l1, QPointF l2, QPointF *clos
} }
return orthVect.length(); return orthVect.length();
} }
std::complex<double> Util::SparamToImpedance(std::complex<double> d) {
return Preferences::getInstance().Acquisition.refImp * (1.0 + d) / (1.0 - d);
}

View File

@ -44,9 +44,7 @@ namespace Util {
static inline double SparamToVSWR(std::complex<double> d) { static inline double SparamToVSWR(std::complex<double> d) {
return SparamToVSWR(abs(d)); return SparamToVSWR(abs(d));
} }
static inline std::complex<double> SparamToImpedance(std::complex<double> d) { std::complex<double> SparamToImpedance(std::complex<double> d);
return 50.0 * (1.0 + d) / (1.0 - d);
}
// all these conversions assume series connection of real and imag part // all these conversions assume series connection of real and imag part
static inline double SparamToResistance(std::complex<double> d) { static inline double SparamToResistance(std::complex<double> d) {
return SparamToImpedance(d).real(); return SparamToImpedance(d).real();

View File

@ -32,7 +32,7 @@ void MatchingNetwork::transformDatapoint(Protocol::Datapoint &p)
complex<double>(p.real_S12, p.imag_S12), complex<double>(p.real_S12, p.imag_S12),
complex<double>(p.real_S21, p.imag_S21), complex<double>(p.real_S21, p.imag_S21),
complex<double>(p.real_S22, p.imag_S22)); complex<double>(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) { if(matching.count(p.frequency) == 0) {
// this point is not calculated yet // this point is not calculated yet
MatchingPoint m; MatchingPoint m;
@ -56,7 +56,7 @@ void MatchingNetwork::transformDatapoint(Protocol::Datapoint &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];
auto corrected = m.p1 * measurement * m.p2; 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.real_S11 = real(S.m11);
p.imag_S11 = imag(S.m11); p.imag_S11 = imag(S.m11);
p.real_S12 = real(S.m12); p.real_S12 = real(S.m12);
@ -541,7 +541,7 @@ ABCDparam MatchingComponent::parameters(double freq)
} else { } else {
auto d = touchstone->interpolate(freq); auto d = touchstone->interpolate(freq);
auto S = Sparam(d.S[0], d.S[1], d.S[2], d.S[3]); 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: default:
return ABCDparam(1.0, 0.0, 0.0, 1.0); return ABCDparam(1.0, 0.0, 0.0, 1.0);

View File

@ -12,7 +12,7 @@ using namespace std;
TwoThru::TwoThru() TwoThru::TwoThru()
{ {
Z0 = 50.0; Z0 = Preferences::getInstance().Acquisition.refImp;
} }
void TwoThru::transformDatapoint(Protocol::Datapoint &p) void TwoThru::transformDatapoint(Protocol::Datapoint &p)

View File

@ -88,6 +88,9 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) :
ui->StartupSARBW->setPrefixes(" k"); ui->StartupSARBW->setPrefixes(" k");
// Acquisition page // Acquisition page
ui->AcquisitionReferenceImpedance->setUnit("Ω");
ui->AcquisitionReferenceImpedance->setPrefixes(" ");
ui->AcquisitionReferenceImpedance->setPrecision(3);
ui->AcquisitionDFTlimitRBW->setUnit("Hz"); ui->AcquisitionDFTlimitRBW->setUnit("Hz");
ui->AcquisitionDFTlimitRBW->setPrefixes(" k"); ui->AcquisitionDFTlimitRBW->setPrefixes(" k");
connect(ui->AcquisitionUseDFT, &QCheckBox::toggled, [=](bool enabled) { connect(ui->AcquisitionUseDFT, &QCheckBox::toggled, [=](bool enabled) {
@ -234,6 +237,7 @@ void PreferencesDialog::setInitialGUIState()
ui->AcquisitionAdjustPowerLevel->setChecked(p->Acquisition.adjustPowerLevel); ui->AcquisitionAdjustPowerLevel->setChecked(p->Acquisition.adjustPowerLevel);
ui->AcquisitionUseHarmonic->setChecked(p->Acquisition.harmonicMixing); ui->AcquisitionUseHarmonic->setChecked(p->Acquisition.harmonicMixing);
ui->AcquisitionAllowSegmentedSweep->setChecked(p->Acquisition.allowSegmentedSweep); ui->AcquisitionAllowSegmentedSweep->setChecked(p->Acquisition.allowSegmentedSweep);
ui->AcquisitionReferenceImpedance->setValue(p->Acquisition.refImp);
ui->AcquisitionUseDFT->setChecked(p->Acquisition.useDFTinSAmode); ui->AcquisitionUseDFT->setChecked(p->Acquisition.useDFTinSAmode);
ui->AcquisitionDFTlimitRBW->setValue(p->Acquisition.RBWLimitForDFT); ui->AcquisitionDFTlimitRBW->setValue(p->Acquisition.RBWLimitForDFT);
ui->AcquisitionAveragingMode->setCurrentIndex(p->Acquisition.useMedianAveraging ? 1 : 0); ui->AcquisitionAveragingMode->setCurrentIndex(p->Acquisition.useMedianAveraging ? 1 : 0);
@ -294,6 +298,7 @@ void PreferencesDialog::updateFromGUI()
p->Acquisition.adjustPowerLevel = ui->AcquisitionAdjustPowerLevel->isChecked(); p->Acquisition.adjustPowerLevel = ui->AcquisitionAdjustPowerLevel->isChecked();
p->Acquisition.harmonicMixing = ui->AcquisitionUseHarmonic->isChecked(); p->Acquisition.harmonicMixing = ui->AcquisitionUseHarmonic->isChecked();
p->Acquisition.allowSegmentedSweep = ui->AcquisitionAllowSegmentedSweep->isChecked(); p->Acquisition.allowSegmentedSweep = ui->AcquisitionAllowSegmentedSweep->isChecked();
p->Acquisition.refImp = ui->AcquisitionReferenceImpedance->value();
p->Acquisition.useDFTinSAmode = ui->AcquisitionUseDFT->isChecked(); p->Acquisition.useDFTinSAmode = ui->AcquisitionUseDFT->isChecked();
p->Acquisition.RBWLimitForDFT = ui->AcquisitionDFTlimitRBW->value(); p->Acquisition.RBWLimitForDFT = ui->AcquisitionDFTlimitRBW->value();
p->Acquisition.useMedianAveraging = ui->AcquisitionAveragingMode->currentIndex() == 1; p->Acquisition.useMedianAveraging = ui->AcquisitionAveragingMode->currentIndex() == 1;

View File

@ -73,6 +73,7 @@ public:
bool useDFTinSAmode; bool useDFTinSAmode;
double RBWLimitForDFT; double RBWLimitForDFT;
bool useMedianAveraging; bool useMedianAveraging;
double refImp; // reference impedance
// advanced, hardware specific settings // advanced, hardware specific settings
double IF1; double IF1;
@ -152,6 +153,7 @@ private:
{&Acquisition.useDFTinSAmode, "Acquisition.useDFTinSAmode", true}, {&Acquisition.useDFTinSAmode, "Acquisition.useDFTinSAmode", true},
{&Acquisition.RBWLimitForDFT, "Acquisition.RBWLimitForDFT", 3000.0}, {&Acquisition.RBWLimitForDFT, "Acquisition.RBWLimitForDFT", 3000.0},
{&Acquisition.useMedianAveraging, "Acquisition.useMedianAveraging", false}, {&Acquisition.useMedianAveraging, "Acquisition.useMedianAveraging", false},
{&Acquisition.refImp, "Acquisition.referenceImpedance", 50.0},
{&Acquisition.IF1, "Acquisition.IF1", 62000000}, {&Acquisition.IF1, "Acquisition.IF1", 62000000},
{&Acquisition.ADCprescaler, "Acquisition.ADCprescaler", 128}, {&Acquisition.ADCprescaler, "Acquisition.ADCprescaler", 128},
{&Acquisition.DFTPhaseInc, "Acquisition.DFTPhaseInc", 1280}, {&Acquisition.DFTPhaseInc, "Acquisition.DFTPhaseInc", 1280},

View File

@ -745,6 +745,24 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QFormLayout" name="formLayout_11">
<item row="0" column="0">
<widget class="QLabel" name="label_39">
<property name="text">
<string>Reference impedance:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="SIUnitEdit" name="AcquisitionReferenceImpedance">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Frequency of the first IF&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>