Неожиданное поведение функции findpeaks в инструменте обработки сигналов MATLAB - PullRequest
2 голосов
/ 07 декабря 2010

Редактировать: На самом деле это не неожиданное поведение, но мне все еще нужно решение.findpeaks compares each element of data to its neighboring values.

У меня есть данные, которые содержат пики, которые я определяю с помощью функции findpeaks из панели инструментов обработки сигналов.Иногда кажется, что функция не может правильно определять пики, когда у меня есть одно и то же значение дважды рядом друг с другом.Это происходит очень редко в моих данных, но вот пример, иллюстрирующий мою проблему:

>> values

values =

   -0.0324
   -0.0371
   -0.0393
   -0.0387
   -0.0331
   -0.0280
   -0.0216
   -0.0134
   -0.0011
    0.0098
    0.0217
    0.0352
    0.0467
    0.0548
    0.0639
    0.0740
    0.0813
    0.0858                  <-- here should be another peak
    0.0858                  <--
    0.0812
    0.0719
    0.0600
    0.0473
    0.0353
    0.0239
    0.0151
    0.0083
    0.0034
   -0.0001
   -0.0025
   -0.0043
   -0.0057
   -0.0048
   -0.0038
   -0.0026
    0.0007
    0.0043
    0.0062
    0.0083
    0.0106
    0.0111
    0.0116
    0.0102
    0.0089
    0.0057
    0.0025
   -0.0025
   -0.0056

Теперь функция findpeaks находит только один пик:

>> [pks loc] = findpeaks(values)

pks =

    0.0116


loc =

    42

Если я строю данныеСтановится очевидным, что findpeaks пропускает один из пиков в местоположении 18/19, поскольку они оба имеют значение 0.08579.

alt text

Каков наилучший способ найти этинедостающие пики?

Ответы [ 5 ]

1 голос
/ 17 апреля 2012

Это старая тема, но, возможно, некоторые все еще ищут более простое решение для этого (как я сделал сегодня):

Вы также можете просто вычесть очень небольшое фиксированное значение из всех значений на платокроме первого значения.Это приводит к тому, что каждое первое значение на плато всегда будет самым высоким на соответствующих плато, заставляя их включаться в виде пиков.* Надеюсь, это поможет!

1 голос
/ 07 декабря 2010

Если у вас есть набор инструментов для обработки изображений, вы можете использовать IMREGIONALMAX , чтобы найти пики, после чего вы можете использовать regionprops, чтобы найти центр областей (если это то, что вам нужно), т.е. *

bw = imregionalmax(signal);
peakLocations = find(bw); %# returns n peaks for an n-tuple of max-values

stats = regionprops(bw,'Centroid');
peakLocations = cat(1,stats.Centroid); %# returns the center of the n-tuple of max-values
0 голосов
/ 12 февраля 2019

Поведение, которое вы описываете, является известной ошибкой в ​​версиях MATLAB до R2010b. Минимальный пример

findpeaks([0 1 1 0])

, который возвращает [], а

findpeaks([0 1 0])

возвращает (положение) пика.

Ошибка была исправлена ​​в R2010b и позже, см. Официальный Отчет об ошибках . С этим исправлением findpeaks возвращает передний фронт «пиков с повторяющимися значениями» (которые я бы назвал plateaus ).

0 голосов
/ 07 декабря 2010

Я закончил тем, что написал свою собственную более простую версию findpeaks, которая, кажется, работает для моей цели.

function [pks,locs] = my_findpeaks(X)      
    M = numel(X);
    pks = [];
    locs = [];
    if (M < 4)
        datamsgid = generatemsgid('emptyDataSet');
        error(datamsgid,'Data set must contain at least 4 samples.');
    else
        for idx=1:M-3
            if X(idx)< X(idx+1) && X(idx+1)>=X(idx+2) && X(idx+2)> X(idx+3)
                pks = [pks X(idx)];
                locs = [locs idx];
            end

        end

    end
end

Редактировать: Чтобы уточнить, проблема возникла, когда у меня был пик, который был точно между двумя точками выборки, и эти две точки выборки имели совпадение одинакового значения.Это произошло только пару раз в более чем 10 000 случаев.

0 голосов
/ 07 декабря 2010

Использовать второй производный тест вместо?

...