39 const int n =
static_cast<int>(data.size());
40 VectorXd proms(peakIndices.size());
42 for (
int p = 0; p < peakIndices.size(); ++p) {
43 int idx = peakIndices[p];
44 double peakVal = data(idx);
47 double leftMin = peakVal;
48 for (
int i = idx - 1; i >= 0; --i) {
49 if (data(i) > peakVal)
51 leftMin = std::min(leftMin, data(i));
55 double rightMin = peakVal;
56 for (
int i = idx + 1; i < n; ++i) {
57 if (data(i) > peakVal)
59 rightMin = std::min(rightMin, data(i));
63 double highestValley = std::max(leftMin, rightMin);
64 proms(p) = peakVal - highestValley;
75 const int n =
static_cast<int>(data.size());
76 QList<QPair<int, double>> peaks;
84 for (
int i = 1; i < n - 1; ++i) {
85 if (data(i) > data(i - 1) && data(i) > data(i + 1)) {
93 if (params.
dProminence > 0.0 && !peakIdx.isEmpty()) {
96 for (
int i = 0; i < peakIdx.size(); ++i) {
98 filtered.append(peakIdx[i]);
107 std::vector<int> sortedIdx(peakIdx.begin(), peakIdx.end());
108 std::sort(sortedIdx.begin(), sortedIdx.end(),
109 [&data](
int a,
int b) { return data(a) > data(b); });
112 std::vector<bool> suppressed(
static_cast<size_t>(n),
false);
114 for (
int idx : sortedIdx) {
115 if (suppressed[
static_cast<size_t>(idx)])
122 for (
int s = lo; s <= hi; ++s) {
124 suppressed[
static_cast<size_t>(s)] =
true;
130 std::sort(kept.begin(), kept.end());
135 for (
int idx : peakIdx) {
136 peaks.append(qMakePair(idx, data(idx)));
Local-maxima peak detection in 1-D signals with prominence filtering.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
DSPSHARED_EXPORT QList< QPair< int, double > > peakFinder(const Eigen::VectorXd &data, const PeakFinderParams ¶ms=PeakFinderParams())
Find peaks in a 1D signal.
DSPSHARED_EXPORT Eigen::VectorXd peakProminences(const Eigen::VectorXd &data, const QList< int > &peakIndices)
Compute prominence of each peak.