new marker type: negative peak table
This commit is contained in:
parent
5ad44c780c
commit
0dbf362f57
@ -192,6 +192,7 @@ std::vector<Marker::Format> Marker::applicableFormats()
|
||||
case Type::Maximum:
|
||||
case Type::Minimum:
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
if(Trace::isSAParameter(parentTrace->liveParameter())) {
|
||||
ret.push_back(Format::dBm);
|
||||
ret.push_back(Format::dBuV);
|
||||
@ -225,6 +226,7 @@ std::vector<Marker::Format> Marker::applicableFormats()
|
||||
case Type::Maximum:
|
||||
case Type::Minimum:
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
if(Trace::isSAParameter(parentTrace->liveParameter())) {
|
||||
ret.push_back(Format::dBm);
|
||||
ret.push_back(Format::dBuV);
|
||||
@ -441,6 +443,7 @@ QString Marker::readableData(Format f)
|
||||
case Trace::DataType::TimeZeroSpan:
|
||||
switch(type) {
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
return "Found " + QString::number(helperMarkers.size()) + " peaks";
|
||||
case Type::Delta: {
|
||||
if(!delta) {
|
||||
@ -647,6 +650,7 @@ QString Marker::readableSettings()
|
||||
case Type::Bandpass:
|
||||
return Unit::ToString(cutoffAmplitude, "db", " ", 3);
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
return Unit::ToString(peakThreshold, "db", " ", 3);
|
||||
case Type::TOI:
|
||||
return "none";
|
||||
@ -712,6 +716,7 @@ QString Marker::tooltipSettings()
|
||||
case Type::Bandpass:
|
||||
return "Cutoff amplitude (relativ to peak)";
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
return "Peak threshold";
|
||||
case Type::PhaseNoise:
|
||||
return "Frequency offset";
|
||||
@ -1016,6 +1021,7 @@ std::set<Marker::Type> Marker::getSupportedTypes()
|
||||
supported.insert(Type::Minimum);
|
||||
supported.insert(Type::Delta);
|
||||
supported.insert(Type::PeakTable);
|
||||
supported.insert(Type::NegativePeakTable);
|
||||
supported.insert(Type::Flatness);
|
||||
if(!parentTrace->isReflection()) {
|
||||
supported.insert(Type::Lowpass);
|
||||
@ -1315,6 +1321,7 @@ nlohmann::json Marker::toJSON()
|
||||
j["delta_marker"] = delta->toHash();
|
||||
break;
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
j["peak_threshold"] = peakThreshold;
|
||||
break;
|
||||
case Type::Lowpass:
|
||||
@ -1377,6 +1384,7 @@ void Marker::fromJSON(nlohmann::json j)
|
||||
// Instead it will be correctly assigned in TraceMarkerModel::fromJSON()
|
||||
break;
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
peakThreshold = j.value("peak_threshold", -40);
|
||||
break;
|
||||
case Type::Lowpass:
|
||||
@ -1576,6 +1584,7 @@ SIUnitEdit *Marker::getSettingsEditor()
|
||||
ret->setValue(cutoffAmplitude);
|
||||
break;
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
ret = new SIUnitEdit("db", " ", 3);
|
||||
ret->setValue(peakThreshold);
|
||||
break;
|
||||
@ -1707,6 +1716,7 @@ void Marker::adjustSettings(double value)
|
||||
cutoffAmplitude = value;
|
||||
break;
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable:
|
||||
peakThreshold = value;
|
||||
break;
|
||||
case Type::PhaseNoise:
|
||||
@ -1778,9 +1788,10 @@ void Marker::update()
|
||||
case Type::Minimum:
|
||||
setPosition(parentTrace->findExtremum(false, xmin, xmax));
|
||||
break;
|
||||
case Type::PeakTable: {
|
||||
case Type::PeakTable:
|
||||
case Type::NegativePeakTable: {
|
||||
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';
|
||||
for(auto p : peaks) {
|
||||
auto helper = new Marker(model, number, this);
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
Minimum,
|
||||
Delta,
|
||||
PeakTable,
|
||||
NegativePeakTable,
|
||||
Lowpass,
|
||||
Highpass,
|
||||
Bandpass,
|
||||
@ -176,6 +177,7 @@ private:
|
||||
case Type::Minimum: return "Minimum";
|
||||
case Type::Delta: return "Delta";
|
||||
case Type::PeakTable: return "Peak Table";
|
||||
case Type::NegativePeakTable: return "Negative Peak Table";
|
||||
case Type::Lowpass: return "Lowpass";
|
||||
case Type::Highpass: return "Highpass";
|
||||
case Type::Bandpass: return "Bandpass";
|
||||
|
@ -1361,12 +1361,15 @@ double Trace::findExtremum(bool max, double xmin, double xmax)
|
||||
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) {
|
||||
// not in frequency domain
|
||||
return vector<double>();
|
||||
}
|
||||
if(negativePeaks) {
|
||||
minLevel = -minLevel;
|
||||
}
|
||||
using peakInfo = struct peakinfo {
|
||||
double frequency;
|
||||
double level_dbm;
|
||||
@ -1380,6 +1383,9 @@ std::vector<double> Trace::findPeakFrequencies(unsigned int maxPeaks, double min
|
||||
continue;
|
||||
}
|
||||
double dbm = Util::SparamTodB(d.y);
|
||||
if(negativePeaks) {
|
||||
dbm = -dbm;
|
||||
}
|
||||
if((dbm >= max_dbm) && (min_dbm <= dbm - minValley)) {
|
||||
// potential peak frequency
|
||||
frequency = d.x;
|
||||
|
@ -81,7 +81,7 @@ public:
|
||||
* 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,
|
||||
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 {
|
||||
Frequency,
|
||||
TimeImpulse,
|
||||
|
Loading…
Reference in New Issue
Block a user