Использование findpeaks и minpeakdistance в MATLAB для поиска пиков, разделенных расстоянием, а не индексом

Я пытаюсь получить x-координаты пиков в фигуре MATLAB (пример прилагается). Я использовал findpeaks, но мне не нравится тот факт, что я рисую точки, а не линии.

У меня не всегда будет два пика. Иногда у меня будет три, иногда одна. Множественные пики всегда будут разделены по крайней мере 1/4 диапазона x, а пики всегда будут как минимум в два раза превышать уровень шума.

Вот что я ожидаю, будет работать:

[pks,locs] = findpeaks(yData,...
                       'SortStr','descend',...
                       'MinPeakDistance',floor(range(xData)/4),...
                       'MinPeakHeight',floor(max(yData)/2)...
                       )

Вместо того, чтобы получить два пика, я получаю четыре, связанных вокруг первого пика:

>> locs

locs =

    6774      166785      326792      486799
>> xData(locs)

ans = 

-96780.787939025         -96770.1800919265   
-96770.8959353367        -96771.6117787468

Я предполагаю, что MinPeakDistance работает с индексами xData, а не с самими данными. Как заставить его использовать расстояния между пиками вместо расстояния между индексами пиков?

введите здесь описание изображения


person Nick Sweet    schedule 07.08.2013    source источник


Ответы (2)


findpeaks ничего не знает о координатах x или о том, что вы начертили. Вам нужно указать MinPeakDistance с точки зрения индексов. Вот пример:

xData = -100:1:-1;
yData = rand(1,100);
yData(10) = 100; % peak
yData(11) = 99; % not a peak
yData(50) = 100; % peak
yData(51) = 99; % not a peak
[pks,locs] = findpeaks(yData,...
                       'SortStr','descend',...
                       'MinPeakDistance',floor(length(yData)/4),...
                       'MinPeakHeight',floor(max(yData)/2)...
                       );


xLocs = xData(locs);

pks =

   100   100


locs =

    10    50
person Molly    schedule 07.08.2013
comment
поэтому, если все мои индексы перепутаны (то есть 6774 166785 326792 486799 все вокруг одних и тех же xData), мне нужно отсортировать мои xData в упорядоченные индексы, прежде чем находить пики, затем найти пики, а затем сопоставить мои упорядоченные индексы обратно с исходным индексы? - person Nick Sweet; 07.08.2013
comment
Да. Поиск пиков возвращает индексы, и вам нужно найти способ интерпретировать их с точки зрения ваших координат x. - person Molly; 07.08.2013

Хотя я принял ответ Молли, я нашел свой собственный, который немного менее хлопотный, но менее элегантный:

  %find all peaks significantly above noise floor
  [pks,locs] = findpeaks(yData,'SortStr','descend','MinPeakHeight',floor(max(yData)/2));
  xLocs = xData(locs);           

  %find number of peak clusters
  numPeaks = length(unique(round(xLocs/100)));

  %find locations of numPeaks peaks
  [pks,locs] = findpeaks(yData,'SortStr','descend','npeaks',numPeaks);
person Nick Sweet    schedule 07.08.2013