New marker type: non-uniformity
This commit is contained in:
parent
8778d82576
commit
886be660f6
@ -136,6 +136,9 @@ QString Marker::formatToString(Marker::Format f)
|
|||||||
case Format::CenterBandwidth: return "Center + Bandwidth";
|
case Format::CenterBandwidth: return "Center + Bandwidth";
|
||||||
case Format::InsertionLoss: return "Insertion loss";
|
case Format::InsertionLoss: return "Insertion loss";
|
||||||
case Format::P1dB: return "P1dB";
|
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 "";
|
case Format::Last: return "";
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
@ -262,6 +265,11 @@ std::vector<Marker::Format> Marker::applicableFormats()
|
|||||||
ret.push_back(Format::AvgTone);
|
ret.push_back(Format::AvgTone);
|
||||||
ret.push_back(Format::AvgModulationProduct);
|
ret.push_back(Format::AvgModulationProduct);
|
||||||
break;
|
break;
|
||||||
|
case Type::NonUniformity:
|
||||||
|
ret.push_back(Format::NonUniformity);
|
||||||
|
ret.push_back(Format::maxDeltaNeg);
|
||||||
|
ret.push_back(Format::maxDeltaPos);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -363,6 +371,15 @@ std::vector<Marker::Format> Marker::defaultActiveFormats()
|
|||||||
if(pref.Marker.defaultBehavior.showP1dB) {
|
if(pref.Marker.defaultBehavior.showP1dB) {
|
||||||
ret.push_back(Format::P1dB);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,6 +566,16 @@ QString Marker::readableData(Format f)
|
|||||||
} else {
|
} else {
|
||||||
return "Input P1dB:"+Unit::ToString(position, "dBm", " ", 4);
|
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:
|
case Format::Last:
|
||||||
return "Invalid";
|
return "Invalid";
|
||||||
}
|
}
|
||||||
@ -625,6 +652,8 @@ QString Marker::readableSettings()
|
|||||||
return "none";
|
return "none";
|
||||||
case Type::PhaseNoise:
|
case Type::PhaseNoise:
|
||||||
return Unit::ToString(offset, "Hz", " kM", 4);
|
return Unit::ToString(offset, "Hz", " kM", 4);
|
||||||
|
case Type::NonUniformity:
|
||||||
|
return "None";
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -987,6 +1016,7 @@ std::set<Marker::Type> Marker::getSupportedTypes()
|
|||||||
supported.insert(Type::Minimum);
|
supported.insert(Type::Minimum);
|
||||||
supported.insert(Type::Delta);
|
supported.insert(Type::Delta);
|
||||||
supported.insert(Type::PeakTable);
|
supported.insert(Type::PeakTable);
|
||||||
|
supported.insert(Type::NonUniformity);
|
||||||
if(!parentTrace->isReflection()) {
|
if(!parentTrace->isReflection()) {
|
||||||
supported.insert(Type::Lowpass);
|
supported.insert(Type::Lowpass);
|
||||||
supported.insert(Type::Highpass);
|
supported.insert(Type::Highpass);
|
||||||
@ -1172,6 +1202,9 @@ void Marker::setType(Marker::Type t)
|
|||||||
case Type::PhaseNoise:
|
case Type::PhaseNoise:
|
||||||
required_helpers = {{"o", "Offset", Type::Manual}};
|
required_helpers = {{"o", "Offset", Type::Manual}};
|
||||||
break;
|
break;
|
||||||
|
case Type::NonUniformity:
|
||||||
|
required_helpers = {{"l", "Lower Limit", Type::Manual}, {"u", "Upper Limit", Type::Manual}};
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1183,6 +1216,14 @@ void Marker::setType(Marker::Type t)
|
|||||||
helper->setType(h.type);
|
helper->setType(h.type);
|
||||||
helperMarkers.push_back(helper);
|
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();
|
constrainFormat();
|
||||||
|
|
||||||
updateSymbol();
|
updateSymbol();
|
||||||
@ -1881,6 +1922,32 @@ void Marker::update()
|
|||||||
setPosition(p1db);
|
setPosition(p1db);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case Type::Last:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1905,6 +1972,10 @@ std::complex<double> Marker::getData() const
|
|||||||
bool Marker::isMovable()
|
bool Marker::isMovable()
|
||||||
{
|
{
|
||||||
if(parent) {
|
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
|
// helper traces are never movable by the user
|
||||||
return false;
|
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()
|
QPixmap &Marker::getSymbol()
|
||||||
{
|
{
|
||||||
return symbol;
|
return symbol;
|
||||||
|
@ -47,6 +47,9 @@ public:
|
|||||||
AvgModulationProduct, // average level of modulation products
|
AvgModulationProduct, // average level of modulation products
|
||||||
// compression parameters
|
// compression parameters
|
||||||
P1dB, // power level at 1dB compression
|
P1dB, // power level at 1dB compression
|
||||||
|
NonUniformity,
|
||||||
|
maxDeltaPos,
|
||||||
|
maxDeltaNeg,
|
||||||
// keep last at end
|
// keep last at end
|
||||||
Last,
|
Last,
|
||||||
};
|
};
|
||||||
@ -68,6 +71,7 @@ public:
|
|||||||
double getPosition() const;
|
double getPosition() const;
|
||||||
std::complex<double> getData() const;
|
std::complex<double> getData() const;
|
||||||
bool isMovable();
|
bool isMovable();
|
||||||
|
bool isEditable();
|
||||||
Trace::DataType getDomain();
|
Trace::DataType getDomain();
|
||||||
|
|
||||||
QPixmap& getSymbol();
|
QPixmap& getSymbol();
|
||||||
@ -92,6 +96,7 @@ public:
|
|||||||
TOI,
|
TOI,
|
||||||
PhaseNoise,
|
PhaseNoise,
|
||||||
P1dB,
|
P1dB,
|
||||||
|
NonUniformity,
|
||||||
// keep last at end
|
// keep last at end
|
||||||
Last,
|
Last,
|
||||||
};
|
};
|
||||||
@ -171,6 +176,7 @@ private:
|
|||||||
case Type::TOI: return "TOI/IP3";
|
case Type::TOI: return "TOI/IP3";
|
||||||
case Type::PhaseNoise: return "Phase noise";
|
case Type::PhaseNoise: return "Phase noise";
|
||||||
case Type::P1dB: return "1dB compression";
|
case Type::P1dB: return "1dB compression";
|
||||||
|
case Type::NonUniformity: return "Non-uniformity";
|
||||||
default: return QString();
|
default: return QString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -211,6 +217,10 @@ private:
|
|||||||
double peakThreshold;
|
double peakThreshold;
|
||||||
double offset;
|
double offset;
|
||||||
|
|
||||||
|
// non-uniformity
|
||||||
|
double maxDeltaNeg;
|
||||||
|
double maxDeltaPos;
|
||||||
|
|
||||||
Format formatTable;
|
Format formatTable;
|
||||||
std::set<Format> formatGraph;
|
std::set<Format> formatGraph;
|
||||||
|
|
||||||
|
@ -303,7 +303,7 @@ QVariant MarkerModel::headerData(int section, Qt::Orientation orientation, int r
|
|||||||
|
|
||||||
bool MarkerModel::setData(const QModelIndex &index, const QVariant &value, int)
|
bool MarkerModel::setData(const QModelIndex &index, const QVariant &value, int)
|
||||||
{
|
{
|
||||||
if((unsigned int) index.row() >= markers.size()) {
|
if(!index.isValid()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto m = markerFromIndex(index);
|
auto m = markerFromIndex(index);
|
||||||
@ -340,7 +340,7 @@ Qt::ItemFlags MarkerModel::flags(const QModelIndex &index) const
|
|||||||
case ColIndexData: flags |= Qt::ItemIsEnabled; break;
|
case ColIndexData: flags |= Qt::ItemIsEnabled; break;
|
||||||
}
|
}
|
||||||
auto marker = markerFromIndex(index);
|
auto marker = markerFromIndex(index);
|
||||||
if(marker->getParent()) {
|
if(!marker->isEditable()) {
|
||||||
// this is a helper marker -> nothing is editable
|
// this is a helper marker -> nothing is editable
|
||||||
flags &= ~Qt::ItemIsEditable;
|
flags &= ~Qt::ItemIsEditable;
|
||||||
}
|
}
|
||||||
|
@ -433,7 +433,7 @@ Marker *TracePlot::markerAtPosition(QPoint p, bool onlyMovable)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto markers = t.first->getMarkers();
|
auto markers = t.first->getMarkers();
|
||||||
for(auto m : markers) {
|
for(Marker* m : markers) {
|
||||||
if(!m->isMovable() && onlyMovable) {
|
if(!m->isMovable() && onlyMovable) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -448,6 +448,9 @@ Marker *TracePlot::markerAtPosition(QPoint p, bool onlyMovable)
|
|||||||
closestDistance = distance;
|
closestDistance = distance;
|
||||||
if(m->getParent()) {
|
if(m->getParent()) {
|
||||||
closestMarker = m->getParent();
|
closestMarker = m->getParent();
|
||||||
|
if(closestMarker->getType() == Marker::Type::NonUniformity) {
|
||||||
|
closestMarker = m;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
closestMarker = m;
|
closestMarker = m;
|
||||||
}
|
}
|
||||||
|
@ -380,6 +380,9 @@ void PreferencesDialog::setInitialGUIState()
|
|||||||
ui->MarkerShowAvgTone->setChecked(p->Marker.defaultBehavior.showAvgTone);
|
ui->MarkerShowAvgTone->setChecked(p->Marker.defaultBehavior.showAvgTone);
|
||||||
ui->MarkerShowAvgMod->setChecked(p->Marker.defaultBehavior.showAvgModulation);
|
ui->MarkerShowAvgMod->setChecked(p->Marker.defaultBehavior.showAvgModulation);
|
||||||
ui->MarkerShowP1dB->setChecked(p->Marker.defaultBehavior.showP1dB);
|
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->MarkerInterpolate->setCurrentIndex(p->Marker.interpolatePoints ? 1 : 0);
|
||||||
ui->MarkerSortOrder->setCurrentIndex((int) p->Marker.sortOrder);
|
ui->MarkerSortOrder->setCurrentIndex((int) p->Marker.sortOrder);
|
||||||
ui->MarkerSymbolStyle->setCurrentIndex((int) p->Marker.symbolStyle);
|
ui->MarkerSymbolStyle->setCurrentIndex((int) p->Marker.symbolStyle);
|
||||||
@ -485,6 +488,9 @@ void PreferencesDialog::updateFromGUI()
|
|||||||
p->Marker.defaultBehavior.showAvgTone = ui->MarkerShowAvgTone->isChecked();
|
p->Marker.defaultBehavior.showAvgTone = ui->MarkerShowAvgTone->isChecked();
|
||||||
p->Marker.defaultBehavior.showAvgModulation = ui->MarkerShowAvgMod->isChecked();
|
p->Marker.defaultBehavior.showAvgModulation = ui->MarkerShowAvgMod->isChecked();
|
||||||
p->Marker.defaultBehavior.showP1dB = ui->MarkerShowP1dB->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.interpolatePoints = ui->MarkerInterpolate->currentIndex() == 1;
|
||||||
p->Marker.sortOrder = (MarkerSortOrder) ui->MarkerSortOrder->currentIndex();
|
p->Marker.sortOrder = (MarkerSortOrder) ui->MarkerSortOrder->currentIndex();
|
||||||
p->Marker.symbolStyle = (MarkerSymbolStyle) ui->MarkerSymbolStyle->currentIndex();
|
p->Marker.symbolStyle = (MarkerSymbolStyle) ui->MarkerSymbolStyle->currentIndex();
|
||||||
|
@ -150,7 +150,7 @@ public:
|
|||||||
struct {
|
struct {
|
||||||
bool showDataOnGraphs;
|
bool showDataOnGraphs;
|
||||||
bool showdB, showdBm, showdBuV, showdBAngle, showRealImag, showImpedance, showVSWR, showResistance, showCapacitance, showInductance, showQualityFactor;
|
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;
|
} defaultBehavior;
|
||||||
bool interpolatePoints;
|
bool interpolatePoints;
|
||||||
MarkerSortOrder sortOrder;
|
MarkerSortOrder sortOrder;
|
||||||
@ -264,6 +264,9 @@ private:
|
|||||||
{&Marker.defaultBehavior.showAvgTone, "Marker.defaultBehavior.showAvgTone", true},
|
{&Marker.defaultBehavior.showAvgTone, "Marker.defaultBehavior.showAvgTone", true},
|
||||||
{&Marker.defaultBehavior.showAvgModulation, "Marker.defaultBehavior.showAvgModulation", true},
|
{&Marker.defaultBehavior.showAvgModulation, "Marker.defaultBehavior.showAvgModulation", true},
|
||||||
{&Marker.defaultBehavior.showP1dB, "Marker.defaultBehavior.showP1dB", 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.interpolatePoints, "Marker.interpolatePoints", false},
|
||||||
{&Marker.sortOrder, "Marker.sortOrder", MarkerSortOrder::PrefMarkerSortXCoord},
|
{&Marker.sortOrder, "Marker.sortOrder", MarkerSortOrder::PrefMarkerSortXCoord},
|
||||||
{&Marker.symbolStyle, "Marker.symbolStyle", MarkerSymbolStyle::EmptyNumberAbove},
|
{&Marker.symbolStyle, "Marker.symbolStyle", MarkerSymbolStyle::EmptyNumberAbove},
|
||||||
|
@ -93,7 +93,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>6</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="Startup">
|
<widget class="QWidget" name="Startup">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
@ -1457,7 +1457,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>749</width>
|
<width>749</width>
|
||||||
<height>576</height>
|
<height>605</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_23">
|
<layout class="QVBoxLayout" name="verticalLayout_23">
|
||||||
@ -1640,6 +1640,27 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -1774,8 +1795,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>763</width>
|
<width>168</width>
|
||||||
<height>561</height>
|
<height>127</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
||||||
|
Loading…
Reference in New Issue
Block a user