new marker type: negative peak table

This commit is contained in:
Jan Käberich 2023-01-05 19:52:54 +01:00
parent 5ad44c780c
commit 0dbf362f57
4 changed files with 23 additions and 4 deletions

View File

@ -192,6 +192,7 @@ std::vector<Marker::Format> Marker::applicableFormats()
case Type::Maximum: case Type::Maximum:
case Type::Minimum: case Type::Minimum:
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
if(Trace::isSAParameter(parentTrace->liveParameter())) { if(Trace::isSAParameter(parentTrace->liveParameter())) {
ret.push_back(Format::dBm); ret.push_back(Format::dBm);
ret.push_back(Format::dBuV); ret.push_back(Format::dBuV);
@ -225,6 +226,7 @@ std::vector<Marker::Format> Marker::applicableFormats()
case Type::Maximum: case Type::Maximum:
case Type::Minimum: case Type::Minimum:
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
if(Trace::isSAParameter(parentTrace->liveParameter())) { if(Trace::isSAParameter(parentTrace->liveParameter())) {
ret.push_back(Format::dBm); ret.push_back(Format::dBm);
ret.push_back(Format::dBuV); ret.push_back(Format::dBuV);
@ -441,6 +443,7 @@ QString Marker::readableData(Format f)
case Trace::DataType::TimeZeroSpan: case Trace::DataType::TimeZeroSpan:
switch(type) { switch(type) {
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
return "Found " + QString::number(helperMarkers.size()) + " peaks"; return "Found " + QString::number(helperMarkers.size()) + " peaks";
case Type::Delta: { case Type::Delta: {
if(!delta) { if(!delta) {
@ -647,6 +650,7 @@ QString Marker::readableSettings()
case Type::Bandpass: case Type::Bandpass:
return Unit::ToString(cutoffAmplitude, "db", " ", 3); return Unit::ToString(cutoffAmplitude, "db", " ", 3);
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
return Unit::ToString(peakThreshold, "db", " ", 3); return Unit::ToString(peakThreshold, "db", " ", 3);
case Type::TOI: case Type::TOI:
return "none"; return "none";
@ -712,6 +716,7 @@ QString Marker::tooltipSettings()
case Type::Bandpass: case Type::Bandpass:
return "Cutoff amplitude (relativ to peak)"; return "Cutoff amplitude (relativ to peak)";
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
return "Peak threshold"; return "Peak threshold";
case Type::PhaseNoise: case Type::PhaseNoise:
return "Frequency offset"; return "Frequency offset";
@ -1016,6 +1021,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::NegativePeakTable);
supported.insert(Type::Flatness); supported.insert(Type::Flatness);
if(!parentTrace->isReflection()) { if(!parentTrace->isReflection()) {
supported.insert(Type::Lowpass); supported.insert(Type::Lowpass);
@ -1315,6 +1321,7 @@ nlohmann::json Marker::toJSON()
j["delta_marker"] = delta->toHash(); j["delta_marker"] = delta->toHash();
break; break;
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
j["peak_threshold"] = peakThreshold; j["peak_threshold"] = peakThreshold;
break; break;
case Type::Lowpass: case Type::Lowpass:
@ -1377,6 +1384,7 @@ void Marker::fromJSON(nlohmann::json j)
// Instead it will be correctly assigned in TraceMarkerModel::fromJSON() // Instead it will be correctly assigned in TraceMarkerModel::fromJSON()
break; break;
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
peakThreshold = j.value("peak_threshold", -40); peakThreshold = j.value("peak_threshold", -40);
break; break;
case Type::Lowpass: case Type::Lowpass:
@ -1576,6 +1584,7 @@ SIUnitEdit *Marker::getSettingsEditor()
ret->setValue(cutoffAmplitude); ret->setValue(cutoffAmplitude);
break; break;
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
ret = new SIUnitEdit("db", " ", 3); ret = new SIUnitEdit("db", " ", 3);
ret->setValue(peakThreshold); ret->setValue(peakThreshold);
break; break;
@ -1707,6 +1716,7 @@ void Marker::adjustSettings(double value)
cutoffAmplitude = value; cutoffAmplitude = value;
break; break;
case Type::PeakTable: case Type::PeakTable:
case Type::NegativePeakTable:
peakThreshold = value; peakThreshold = value;
break; break;
case Type::PhaseNoise: case Type::PhaseNoise:
@ -1778,9 +1788,10 @@ void Marker::update()
case Type::Minimum: case Type::Minimum:
setPosition(parentTrace->findExtremum(false, xmin, xmax)); setPosition(parentTrace->findExtremum(false, xmin, xmax));
break; break;
case Type::PeakTable: { case Type::PeakTable:
case Type::NegativePeakTable: {
deleteHelperMarkers(); deleteHelperMarkers();
auto peaks = parentTrace->findPeakFrequencies(100, peakThreshold, 3.0, xmin, xmax); auto peaks = parentTrace->findPeakFrequencies(100, peakThreshold, 3.0, xmin, xmax, type == Type::NegativePeakTable);
char suffix = 'a'; char suffix = 'a';
for(auto p : peaks) { for(auto p : peaks) {
auto helper = new Marker(model, number, this); auto helper = new Marker(model, number, this);

View File

@ -96,6 +96,7 @@ public:
Minimum, Minimum,
Delta, Delta,
PeakTable, PeakTable,
NegativePeakTable,
Lowpass, Lowpass,
Highpass, Highpass,
Bandpass, Bandpass,
@ -176,6 +177,7 @@ private:
case Type::Minimum: return "Minimum"; case Type::Minimum: return "Minimum";
case Type::Delta: return "Delta"; case Type::Delta: return "Delta";
case Type::PeakTable: return "Peak Table"; case Type::PeakTable: return "Peak Table";
case Type::NegativePeakTable: return "Negative Peak Table";
case Type::Lowpass: return "Lowpass"; case Type::Lowpass: return "Lowpass";
case Type::Highpass: return "Highpass"; case Type::Highpass: return "Highpass";
case Type::Bandpass: return "Bandpass"; case Type::Bandpass: return "Bandpass";

View File

@ -1361,12 +1361,15 @@ double Trace::findExtremum(bool max, double xmin, double xmax)
return freq; return freq;
} }
std::vector<double> Trace::findPeakFrequencies(unsigned int maxPeaks, double minLevel, double minValley, double xmin, double xmax) std::vector<double> Trace::findPeakFrequencies(unsigned int maxPeaks, double minLevel, double minValley, double xmin, double xmax, bool negativePeaks)
{ {
if(lastMath->getDataType() != DataType::Frequency) { if(lastMath->getDataType() != DataType::Frequency) {
// not in frequency domain // not in frequency domain
return vector<double>(); return vector<double>();
} }
if(negativePeaks) {
minLevel = -minLevel;
}
using peakInfo = struct peakinfo { using peakInfo = struct peakinfo {
double frequency; double frequency;
double level_dbm; double level_dbm;
@ -1380,6 +1383,9 @@ std::vector<double> Trace::findPeakFrequencies(unsigned int maxPeaks, double min
continue; continue;
} }
double dbm = Util::SparamTodB(d.y); double dbm = Util::SparamTodB(d.y);
if(negativePeaks) {
dbm = -dbm;
}
if((dbm >= max_dbm) && (min_dbm <= dbm - minValley)) { if((dbm >= max_dbm) && (min_dbm <= dbm - minValley)) {
// potential peak frequency // potential peak frequency
frequency = d.x; frequency = d.x;

View File

@ -81,7 +81,7 @@ public:
* To detect the next peak, the signal first has to drop at least minValley below the peak level. * To detect the next peak, the signal first has to drop at least minValley below the peak level.
*/ */
std::vector<double> findPeakFrequencies(unsigned int maxPeaks = 100, double minLevel = -100.0, double minValley = 3.0, std::vector<double> findPeakFrequencies(unsigned int maxPeaks = 100, double minLevel = -100.0, double minValley = 3.0,
double xmin = std::numeric_limits<double>::lowest(), double xmax = std::numeric_limits<double>::max()); double xmin = std::numeric_limits<double>::lowest(), double xmax = std::numeric_limits<double>::max(), bool negativePeaks = false);
enum class SampleType { enum class SampleType {
Frequency, Frequency,
TimeImpulse, TimeImpulse,