New marker type: non-uniformity

This commit is contained in:
Jan Käberich 2022-12-14 10:59:53 +01:00
parent 8778d82576
commit 886be660f6
7 changed files with 135 additions and 8 deletions

View File

@ -136,6 +136,9 @@ QString Marker::formatToString(Marker::Format f)
case Format::CenterBandwidth: return "Center + Bandwidth";
case Format::InsertionLoss: return "Insertion loss";
case Format::P1dB: return "P1dB";
case Format::NonUniformity: return "Non-uniformity";
case Format::maxDeltaNeg: return "Max. Delta Negative";
case Format::maxDeltaPos: return "Max. Delta Positive";
case Format::Last: return "";
}
return "";
@ -262,6 +265,11 @@ std::vector<Marker::Format> Marker::applicableFormats()
ret.push_back(Format::AvgTone);
ret.push_back(Format::AvgModulationProduct);
break;
case Type::NonUniformity:
ret.push_back(Format::NonUniformity);
ret.push_back(Format::maxDeltaNeg);
ret.push_back(Format::maxDeltaPos);
break;
default:
break;
}
@ -363,6 +371,15 @@ std::vector<Marker::Format> Marker::defaultActiveFormats()
if(pref.Marker.defaultBehavior.showP1dB) {
ret.push_back(Format::P1dB);
}
if(pref.Marker.defaultBehavior.showNonUniformity) {
ret.push_back(Format::NonUniformity);
}
if(pref.Marker.defaultBehavior.showMaxDeltaNeg) {
ret.push_back(Format::maxDeltaNeg);
}
if(pref.Marker.defaultBehavior.showMaxDeltaPos) {
ret.push_back(Format::maxDeltaPos);
}
return ret;
}
@ -549,6 +566,16 @@ QString Marker::readableData(Format f)
} else {
return "Input P1dB:"+Unit::ToString(position, "dBm", " ", 4);
}
break;
case Format::NonUniformity:
return "Non-uniformity:"+Unit::ToString(maxDeltaNeg+maxDeltaPos, "dB", " ", 4);
break;
case Format::maxDeltaNeg:
return "max. Δ-:"+Unit::ToString(maxDeltaNeg, "dB", " ", 4);
break;
case Format::maxDeltaPos:
return "max. Δ+:"+Unit::ToString(maxDeltaPos, "dB", " ", 4);
break;
case Format::Last:
return "Invalid";
}
@ -625,6 +652,8 @@ QString Marker::readableSettings()
return "none";
case Type::PhaseNoise:
return Unit::ToString(offset, "Hz", " kM", 4);
case Type::NonUniformity:
return "None";
default:
break;
}
@ -987,6 +1016,7 @@ std::set<Marker::Type> Marker::getSupportedTypes()
supported.insert(Type::Minimum);
supported.insert(Type::Delta);
supported.insert(Type::PeakTable);
supported.insert(Type::NonUniformity);
if(!parentTrace->isReflection()) {
supported.insert(Type::Lowpass);
supported.insert(Type::Highpass);
@ -1172,6 +1202,9 @@ void Marker::setType(Marker::Type t)
case Type::PhaseNoise:
required_helpers = {{"o", "Offset", Type::Manual}};
break;
case Type::NonUniformity:
required_helpers = {{"l", "Lower Limit", Type::Manual}, {"u", "Upper Limit", Type::Manual}};
break;
default:
break;
}
@ -1183,6 +1216,14 @@ void Marker::setType(Marker::Type t)
helper->setType(h.type);
helperMarkers.push_back(helper);
}
if(type == Type::NonUniformity) {
// need to update when any of the helper markers is moved
for(auto h : helperMarkers) {
connect(h, &Marker::positionChanged, [=](){
setPosition((helperMarkers[0]->position + helperMarkers[1]->position)/2);
});
}
}
constrainFormat();
updateSymbol();
@ -1881,6 +1922,32 @@ void Marker::update()
setPosition(p1db);
}
break;
case Type::NonUniformity: {
auto dbLower = Util::SparamTodB(helperMarkers[0]->getData());
auto dbUpper = Util::SparamTodB(helperMarkers[1]->getData());
auto posLower = helperMarkers[0]->getPosition();
auto posUpper = helperMarkers[1]->getPosition();
if(posLower > posUpper) {
swap(posLower, posUpper);
swap(dbLower, dbUpper);
}
auto startIndex = parentTrace->index(posLower);
auto stopIndex = parentTrace->index(posUpper);
maxDeltaNeg = std::numeric_limits<double>::lowest();
maxDeltaPos = std::numeric_limits<double>::lowest();
for(int i=startIndex;i<=stopIndex;i++) {
auto dbTrace = Util::SparamTodB(parentTrace->sample(i).y);
auto dbStraightLine = Util::Scale((double) i, (double) startIndex, (double) stopIndex, dbLower, dbUpper);
auto delta = dbTrace - dbStraightLine;
if(delta > maxDeltaPos) {
maxDeltaPos = delta;
}
if(-delta > maxDeltaNeg) {
maxDeltaNeg = -delta;
}
}
}
break;
case Type::Last:
break;
}
@ -1905,6 +1972,10 @@ std::complex<double> Marker::getData() const
bool Marker::isMovable()
{
if(parent) {
if(parent->type == Type::NonUniformity) {
// non-uniformity is the exception, it has movable helper markers
return true;
}
// helper traces are never movable by the user
return false;
}
@ -1920,6 +1991,19 @@ bool Marker::isMovable()
}
}
bool Marker::isEditable()
{
if(parent) {
if(parent->type == Type::NonUniformity) {
// non-uniformity is the exception, it has movable helper markers
return true;
}
// helper traces are never movable by the user
return false;
}
return true;
}
QPixmap &Marker::getSymbol()
{
return symbol;

View File

@ -47,6 +47,9 @@ public:
AvgModulationProduct, // average level of modulation products
// compression parameters
P1dB, // power level at 1dB compression
NonUniformity,
maxDeltaPos,
maxDeltaNeg,
// keep last at end
Last,
};
@ -68,6 +71,7 @@ public:
double getPosition() const;
std::complex<double> getData() const;
bool isMovable();
bool isEditable();
Trace::DataType getDomain();
QPixmap& getSymbol();
@ -92,6 +96,7 @@ public:
TOI,
PhaseNoise,
P1dB,
NonUniformity,
// keep last at end
Last,
};
@ -171,6 +176,7 @@ private:
case Type::TOI: return "TOI/IP3";
case Type::PhaseNoise: return "Phase noise";
case Type::P1dB: return "1dB compression";
case Type::NonUniformity: return "Non-uniformity";
default: return QString();
}
}
@ -211,6 +217,10 @@ private:
double peakThreshold;
double offset;
// non-uniformity
double maxDeltaNeg;
double maxDeltaPos;
Format formatTable;
std::set<Format> formatGraph;

View File

@ -303,7 +303,7 @@ QVariant MarkerModel::headerData(int section, Qt::Orientation orientation, int r
bool MarkerModel::setData(const QModelIndex &index, const QVariant &value, int)
{
if((unsigned int) index.row() >= markers.size()) {
if(!index.isValid()) {
return false;
}
auto m = markerFromIndex(index);
@ -340,7 +340,7 @@ Qt::ItemFlags MarkerModel::flags(const QModelIndex &index) const
case ColIndexData: flags |= Qt::ItemIsEnabled; break;
}
auto marker = markerFromIndex(index);
if(marker->getParent()) {
if(!marker->isEditable()) {
// this is a helper marker -> nothing is editable
flags &= ~Qt::ItemIsEditable;
}

View File

@ -433,7 +433,7 @@ Marker *TracePlot::markerAtPosition(QPoint p, bool onlyMovable)
continue;
}
auto markers = t.first->getMarkers();
for(auto m : markers) {
for(Marker* m : markers) {
if(!m->isMovable() && onlyMovable) {
continue;
}
@ -448,6 +448,9 @@ Marker *TracePlot::markerAtPosition(QPoint p, bool onlyMovable)
closestDistance = distance;
if(m->getParent()) {
closestMarker = m->getParent();
if(closestMarker->getType() == Marker::Type::NonUniformity) {
closestMarker = m;
}
} else {
closestMarker = m;
}

View File

@ -380,6 +380,9 @@ void PreferencesDialog::setInitialGUIState()
ui->MarkerShowAvgTone->setChecked(p->Marker.defaultBehavior.showAvgTone);
ui->MarkerShowAvgMod->setChecked(p->Marker.defaultBehavior.showAvgModulation);
ui->MarkerShowP1dB->setChecked(p->Marker.defaultBehavior.showP1dB);
ui->MarkerShowNonUniformity->setChecked(p->Marker.defaultBehavior.showNonUniformity);
ui->MarkerShowMaxDeltaNeg->setChecked(p->Marker.defaultBehavior.showMaxDeltaNeg);
ui->MarkerShowMaxDeltaPos->setChecked(p->Marker.defaultBehavior.showMaxDeltaPos);
ui->MarkerInterpolate->setCurrentIndex(p->Marker.interpolatePoints ? 1 : 0);
ui->MarkerSortOrder->setCurrentIndex((int) p->Marker.sortOrder);
ui->MarkerSymbolStyle->setCurrentIndex((int) p->Marker.symbolStyle);
@ -485,6 +488,9 @@ void PreferencesDialog::updateFromGUI()
p->Marker.defaultBehavior.showAvgTone = ui->MarkerShowAvgTone->isChecked();
p->Marker.defaultBehavior.showAvgModulation = ui->MarkerShowAvgMod->isChecked();
p->Marker.defaultBehavior.showP1dB = ui->MarkerShowP1dB->isChecked();
p->Marker.defaultBehavior.showNonUniformity = ui->MarkerShowNonUniformity->isChecked();
p->Marker.defaultBehavior.showMaxDeltaNeg = ui->MarkerShowMaxDeltaNeg->isChecked();
p->Marker.defaultBehavior.showMaxDeltaPos = ui->MarkerShowMaxDeltaPos->isChecked();
p->Marker.interpolatePoints = ui->MarkerInterpolate->currentIndex() == 1;
p->Marker.sortOrder = (MarkerSortOrder) ui->MarkerSortOrder->currentIndex();
p->Marker.symbolStyle = (MarkerSymbolStyle) ui->MarkerSymbolStyle->currentIndex();

View File

@ -150,7 +150,7 @@ public:
struct {
bool showDataOnGraphs;
bool showdB, showdBm, showdBuV, showdBAngle, showRealImag, showImpedance, showVSWR, showResistance, showCapacitance, showInductance, showQualityFactor;
bool showNoise, showPhasenoise, showCenterBandwidth, showCutoff, showInsertionLoss, showTOI, showAvgTone, showAvgModulation, showP1dB;
bool showNoise, showPhasenoise, showCenterBandwidth, showCutoff, showInsertionLoss, showTOI, showAvgTone, showAvgModulation, showP1dB, showNonUniformity, showMaxDeltaNeg, showMaxDeltaPos;
} defaultBehavior;
bool interpolatePoints;
MarkerSortOrder sortOrder;
@ -264,6 +264,9 @@ private:
{&Marker.defaultBehavior.showAvgTone, "Marker.defaultBehavior.showAvgTone", true},
{&Marker.defaultBehavior.showAvgModulation, "Marker.defaultBehavior.showAvgModulation", true},
{&Marker.defaultBehavior.showP1dB, "Marker.defaultBehavior.showP1dB", true},
{&Marker.defaultBehavior.showNonUniformity, "Marker.defaultBehavior.showNonUniformity", true},
{&Marker.defaultBehavior.showMaxDeltaNeg, "Marker.defaultBehavior.showMaxDeltaNeg", true},
{&Marker.defaultBehavior.showMaxDeltaPos, "Marker.defaultBehavior.showMaxDeltaPos", true},
{&Marker.interpolatePoints, "Marker.interpolatePoints", false},
{&Marker.sortOrder, "Marker.sortOrder", MarkerSortOrder::PrefMarkerSortXCoord},
{&Marker.symbolStyle, "Marker.symbolStyle", MarkerSymbolStyle::EmptyNumberAbove},

View File

@ -93,7 +93,7 @@
</size>
</property>
<property name="currentIndex">
<number>6</number>
<number>3</number>
</property>
<widget class="QWidget" name="Startup">
<layout class="QHBoxLayout" name="horizontalLayout_4">
@ -1457,7 +1457,7 @@
<x>0</x>
<y>0</y>
<width>749</width>
<height>576</height>
<height>605</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_23">
@ -1640,6 +1640,27 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="MarkerShowNonUniformity">
<property name="text">
<string>Non-uniformity</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="MarkerShowMaxDeltaNeg">
<property name="text">
<string>Max. Delta Negative</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="MarkerShowMaxDeltaPos">
<property name="text">
<string>Max. Delta Positive</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -1774,8 +1795,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>763</width>
<height>561</height>
<width>168</width>
<height>127</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_12">