Frequency range override for smith/polar chart

This commit is contained in:
Jan Käberich 2022-08-21 17:38:46 +02:00
parent 33726a815a
commit 71239842f6
6 changed files with 220 additions and 76 deletions

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>389</width> <width>381</width>
<height>275</height> <height>385</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -26,48 +26,83 @@
<property name="title"> <property name="title">
<string>Display mode</string> <string>Display mode</string>
</property> </property>
<layout class="QFormLayout" name="formLayout_2"> <layout class="QVBoxLayout" name="verticalLayout">
<item row="0" column="0"> <item>
<widget class="QLabel" name="label_4"> <layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Frequency:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="displayModeFreq">
<item>
<property name="text">
<string>Show complete traces</string>
</property>
</item>
<item>
<property name="text">
<string>Limit to current span</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="displayFreqOverride">
<property name="text"> <property name="text">
<string>Frequency:</string> <string>Override visible frequency range</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item>
<widget class="QComboBox" name="displayModeFreq"> <layout class="QFormLayout" name="formLayout_3">
<item> <item row="0" column="0">
<property name="text"> <widget class="QLabel" name="label_7">
<string>Show complete traces</string> <property name="text">
</property> <string>Start:</string>
</property>
</widget>
</item> </item>
<item> <item row="0" column="1">
<property name="text"> <widget class="SIUnitEdit" name="displayStartFreq"/>
<string>Limit to current span</string>
</property>
</item> </item>
</widget> <item row="1" column="0">
</item> <widget class="QLabel" name="label_8">
<item row="1" column="0"> <property name="text">
<widget class="QLabel" name="label_5"> <string>Stop:</string>
<property name="text"> </property>
<string>Γ</string> </widget>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="displayModeRefl">
<item>
<property name="text">
<string>Show complete traces</string>
</property>
</item> </item>
<item> <item row="1" column="1">
<property name="text"> <widget class="SIUnitEdit" name="displayStopFreq"/>
<string>Limit to visible area</string>
</property>
</item> </item>
</widget> <item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Γ</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="displayModeRefl">
<item>
<property name="text">
<string>Show complete traces</string>
</property>
</item>
<item>
<property name="text">
<string>Limit to visible area</string>
</property>
</item>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>881</width> <width>976</width>
<height>334</height> <height>460</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -26,48 +26,83 @@
<property name="title"> <property name="title">
<string>Display mode</string> <string>Display mode</string>
</property> </property>
<layout class="QFormLayout" name="formLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item row="0" column="0"> <item>
<widget class="QLabel" name="label_4"> <layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Frequency:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="displayModeFreq">
<item>
<property name="text">
<string>Show complete traces</string>
</property>
</item>
<item>
<property name="text">
<string>Limit to current span</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="displayFreqOverride">
<property name="text"> <property name="text">
<string>Frequency:</string> <string>Override visible frequency range</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item>
<widget class="QComboBox" name="displayModeFreq"> <layout class="QFormLayout" name="formLayout_4">
<item> <item row="0" column="0">
<property name="text"> <widget class="QLabel" name="label_7">
<string>Show complete traces</string> <property name="text">
</property> <string>Start:</string>
</property>
</widget>
</item> </item>
<item> <item row="1" column="0">
<property name="text"> <widget class="QLabel" name="label_8">
<string>Limit to current span</string> <property name="text">
</property> <string>Stop:</string>
</property>
</widget>
</item> </item>
</widget> <item row="2" column="0">
</item> <widget class="QLabel" name="label_5">
<item row="1" column="0"> <property name="text">
<widget class="QLabel" name="label_5"> <string>Impedance:</string>
<property name="text"> </property>
<string>Impedance:</string> </widget>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="displayModeImp">
<item>
<property name="text">
<string>Show complete traces</string>
</property>
</item> </item>
<item> <item row="2" column="1">
<property name="text"> <widget class="QComboBox" name="displayModeImp">
<string>Limit to visible area</string> <item>
</property> <property name="text">
<string>Show complete traces</string>
</property>
</item>
<item>
<property name="text">
<string>Limit to visible area</string>
</property>
</item>
</widget>
</item> </item>
</widget> <item row="0" column="1">
<widget class="SIUnitEdit" name="displayStartFreq"/>
</item>
<item row="1" column="1">
<widget class="SIUnitEdit" name="displayStopFreq"/>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -12,6 +12,9 @@ TracePolar::TracePolar(TraceModel &model, QWidget *parent)
{ {
limitToSpan = true; limitToSpan = true;
limitToEdge = true; limitToEdge = true;
manualFrequencyRange = false;
fmin = 0;
fmax = 6000000000;
edgeReflection = 1.0; edgeReflection = 1.0;
dx = 0; dx = 0;
initializeTraceInfo(); initializeTraceInfo();
@ -24,6 +27,9 @@ nlohmann::json TracePolar::toJSON()
j["limit_to_edge"] = limitToEdge; j["limit_to_edge"] = limitToEdge;
j["edge_reflection"] = edgeReflection; j["edge_reflection"] = edgeReflection;
j["offset_axis_x"] = dx; j["offset_axis_x"] = dx;
j["frequency_override"] = manualFrequencyRange;
j["override_min"] = fmin;
j["override_max"] = fmax;
nlohmann::json jtraces; nlohmann::json jtraces;
for(auto t : traces) { for(auto t : traces) {
if(t.second) { if(t.second) {
@ -39,6 +45,9 @@ void TracePolar::fromJSON(nlohmann::json j)
limitToSpan = j.value("limit_to_span", true); limitToSpan = j.value("limit_to_span", true);
limitToEdge = j.value("limit_to_edge", false); limitToEdge = j.value("limit_to_edge", false);
edgeReflection = j.value("edge_reflection", 1.0); edgeReflection = j.value("edge_reflection", 1.0);
manualFrequencyRange = j.value("frequency_override", false);
fmin = j.value("override_min", 0.0);
fmax = j.value("override_max", 6000000000.0);
dx = j.value("offset_axis_x", 0.0); dx = j.value("offset_axis_x", 0.0);
for(unsigned int hash : j["traces"]) { for(unsigned int hash : j["traces"]) {
// attempt to find the traces with this hash // attempt to find the traces with this hash

View File

@ -50,6 +50,9 @@ protected:
bool limitToSpan; bool limitToSpan;
bool limitToEdge; bool limitToEdge;
bool manualFrequencyRange;
double fmin, fmax; // frequency range when manual range is selected
double edgeReflection; // magnitude of reflection coefficient at the edge of the polar chart (zoom factor) double edgeReflection; // magnitude of reflection coefficient at the edge of the polar chart (zoom factor)
double dx; double dx;
QTransform transform; QTransform transform;

View File

@ -30,6 +30,24 @@ void TracePolarChart::axisSetupDialog()
} else { } else {
ui->displayModeRefl->setCurrentIndex(0); ui->displayModeRefl->setCurrentIndex(0);
} }
ui->displayStartFreq->setUnit("Hz");
ui->displayStartFreq->setPrefixes(" kMG");
ui->displayStartFreq->setPrecision(6);
ui->displayStartFreq->setValue(fmin);
ui->displayStopFreq->setUnit("Hz");
ui->displayStopFreq->setPrefixes(" kMG");
ui->displayStopFreq->setPrecision(6);
ui->displayStopFreq->setValue(fmax);
connect(ui->displayFreqOverride, &QCheckBox::toggled, [=](bool active){
ui->displayModeFreq->setEnabled(!active);
ui->displayStartFreq->setEnabled(active);
ui->displayStopFreq->setEnabled(active);
});
ui->displayFreqOverride->setChecked(manualFrequencyRange);
emit ui->displayFreqOverride->toggled(manualFrequencyRange);
ui->zoomReflection->setPrecision(3); ui->zoomReflection->setPrecision(3);
ui->zoomFactor->setPrecision(3); ui->zoomFactor->setPrecision(3);
ui->offsetRealAxis->setPrecision(3); ui->offsetRealAxis->setPrecision(3);
@ -40,6 +58,9 @@ void TracePolarChart::axisSetupDialog()
connect(ui->buttonBox, &QDialogButtonBox::accepted, [=](){ connect(ui->buttonBox, &QDialogButtonBox::accepted, [=](){
limitToSpan = ui->displayModeFreq->currentIndex() == 1; limitToSpan = ui->displayModeFreq->currentIndex() == 1;
limitToEdge = ui->displayModeRefl->currentIndex() == 1; limitToEdge = ui->displayModeRefl->currentIndex() == 1;
manualFrequencyRange = ui->displayFreqOverride->isChecked();
fmin = ui->displayStartFreq->value();
fmax = ui->displayStopFreq->value();
triggerReplot(); triggerReplot();
}); });
connect(ui->zoomFactor, &SIUnitEdit::valueChanged, [=](){ connect(ui->zoomFactor, &SIUnitEdit::valueChanged, [=](){
@ -71,6 +92,16 @@ void TracePolarChart::draw(QPainter &p) {
transform = p.transform(); transform = p.transform();
p.restore(); p.restore();
auto minimumVisibleFrequency = std::numeric_limits<double>::lowest();
auto maximumVisibleFrequency = std::numeric_limits<double>::max();
if(manualFrequencyRange) {
minimumVisibleFrequency = fmin;
maximumVisibleFrequency = fmax;
} else if(limitToSpan) {
minimumVisibleFrequency = sweep_fmin;
maximumVisibleFrequency = sweep_fmax;
}
auto drawArc = [&](PolarArc a) { auto drawArc = [&](PolarArc a) {
a.constrainToCircle(QPointF(0,0), edgeReflection); a.constrainToCircle(QPointF(0,0), edgeReflection);
auto topleft = dataToPixel(complex<double>(a.center.x() - a.radius, a.center.y() - a.radius)); auto topleft = dataToPixel(complex<double>(a.center.x() - a.radius, a.center.y() - a.radius));
@ -147,7 +178,7 @@ void TracePolarChart::draw(QPainter &p) {
for(int i=1;i<nPoints;i++) { for(int i=1;i<nPoints;i++) {
auto last = trace->sample(i-1); auto last = trace->sample(i-1);
auto now = trace->sample(i); auto now = trace->sample(i);
if (limitToSpan && (trace->getDataType() == Trace::DataType::Frequency) && (last.x < sweep_fmin || now.x > sweep_fmax)) { if ((trace->getDataType() == Trace::DataType::Frequency) && (last.x < minimumVisibleFrequency || now.x > maximumVisibleFrequency)) {
continue; continue;
} }
if(isnan(now.y.real())) { if(isnan(now.y.real())) {
@ -179,7 +210,7 @@ void TracePolarChart::draw(QPainter &p) {
if(!m->isVisible()) { if(!m->isVisible()) {
continue; continue;
} }
if (limitToSpan && (m->getPosition() < sweep_fmin || m->getPosition() > sweep_fmax)) { if (m->getPosition() < minimumVisibleFrequency || m->getPosition() > maximumVisibleFrequency) {
continue; continue;
} }
if(m->getPosition() < trace->minX() || m->getPosition() > trace->maxX()) { if(m->getPosition() < trace->minX() || m->getPosition() > trace->maxX()) {

View File

@ -62,6 +62,24 @@ void TraceSmithChart::axisSetupDialog()
} else { } else {
ui->displayModeImp->setCurrentIndex(0); ui->displayModeImp->setCurrentIndex(0);
} }
ui->displayStartFreq->setUnit("Hz");
ui->displayStartFreq->setPrefixes(" kMG");
ui->displayStartFreq->setPrecision(6);
ui->displayStartFreq->setValue(fmin);
ui->displayStopFreq->setUnit("Hz");
ui->displayStopFreq->setPrefixes(" kMG");
ui->displayStopFreq->setPrecision(6);
ui->displayStopFreq->setValue(fmax);
connect(ui->displayFreqOverride, &QCheckBox::toggled, [=](bool active){
ui->displayModeFreq->setEnabled(!active);
ui->displayStartFreq->setEnabled(active);
ui->displayStopFreq->setEnabled(active);
});
ui->displayFreqOverride->setChecked(manualFrequencyRange);
emit ui->displayFreqOverride->toggled(manualFrequencyRange);
ui->zoomReflection->setPrecision(3); ui->zoomReflection->setPrecision(3);
ui->zoomFactor->setPrecision(3); ui->zoomFactor->setPrecision(3);
ui->zoomReflection->setValue(edgeReflection); ui->zoomReflection->setValue(edgeReflection);
@ -80,6 +98,9 @@ void TraceSmithChart::axisSetupDialog()
connect(ui->buttonBox, &QDialogButtonBox::accepted, [=](){ connect(ui->buttonBox, &QDialogButtonBox::accepted, [=](){
limitToSpan = ui->displayModeFreq->currentIndex() == 1; limitToSpan = ui->displayModeFreq->currentIndex() == 1;
limitToEdge = ui->displayModeImp->currentIndex() == 1; limitToEdge = ui->displayModeImp->currentIndex() == 1;
manualFrequencyRange = ui->displayFreqOverride->isChecked();
fmin = ui->displayStartFreq->value();
fmax = ui->displayStopFreq->value();
updateContextMenu(); updateContextMenu();
triggerReplot(); triggerReplot();
}); });
@ -180,6 +201,16 @@ void TraceSmithChart::draw(QPainter &p) {
transform = p.transform(); transform = p.transform();
p.restore(); p.restore();
auto minimumVisibleFrequency = std::numeric_limits<double>::lowest();
auto maximumVisibleFrequency = std::numeric_limits<double>::max();
if(manualFrequencyRange) {
minimumVisibleFrequency = fmin;
maximumVisibleFrequency = fmax;
} else if(limitToSpan) {
minimumVisibleFrequency = sweep_fmin;
maximumVisibleFrequency = sweep_fmax;
}
auto drawArc = [&](SmithChartArc a) { auto drawArc = [&](SmithChartArc a) {
a.constrainToCircle(QPointF(0,0), edgeReflection); a.constrainToCircle(QPointF(0,0), edgeReflection);
auto topleft = dataToPixel(complex<double>(a.center.x() - a.radius, a.center.y() - a.radius)); auto topleft = dataToPixel(complex<double>(a.center.x() - a.radius, a.center.y() - a.radius));
@ -241,7 +272,7 @@ void TraceSmithChart::draw(QPainter &p) {
for(int i=1;i<nPoints;i++) { for(int i=1;i<nPoints;i++) {
auto last = trace->sample(i-1); auto last = trace->sample(i-1);
auto now = trace->sample(i); auto now = trace->sample(i);
if (limitToSpan && (trace->getDataType() == Trace::DataType::Frequency) && (last.x < sweep_fmin || now.x > sweep_fmax)) { if ((trace->getDataType() == Trace::DataType::Frequency) && (last.x < minimumVisibleFrequency || now.x > maximumVisibleFrequency)) {
continue; continue;
} }
if(isnan(now.y.real())) { if(isnan(now.y.real())) {
@ -276,7 +307,7 @@ void TraceSmithChart::draw(QPainter &p) {
// if (m->isTimeDomain()) { // if (m->isTimeDomain()) {
// continue; // continue;
// } // }
if (limitToSpan && (m->getPosition() < sweep_fmin || m->getPosition() > sweep_fmax)) { if (m->getPosition() < minimumVisibleFrequency || m->getPosition() > maximumVisibleFrequency) {
continue; continue;
} }
if(m->getPosition() < trace->minX() || m->getPosition() > trace->maxX()) { if(m->getPosition() < trace->minX() || m->getPosition() > trace->maxX()) {