Selectable reference impedance
This commit is contained in:
parent
d526270fd2
commit
cece0080ed
@ -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");
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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},
|
||||||
|
@ -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><html><head/><body><p>Frequency of the first IF</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
Loading…
Reference in New Issue
Block a user