Это может быть легко решена с помощью findpeaks
из обработки сигналов Toolbox. В частности, для данных я должен был назвать это таким образом:
[pks, locs] = findpeaks(max(vec)-vec, 'minpeakdistance', 160, 'minpeakheight', 22);
findpeaks
находит только положительные пики (локальные максимумы). Таким образом, нам нужно сделать так, чтобы все локальные минимумы становились локальными максимумами. Я сделал это, взяв максимальное значение вектора и вычитая с вектором. Поскольку существует так много локальных пиков, поле minpeakdistance
позволяет находить пики, которые, по крайней мере, разделены между этими пиками. Я настроил это на 160. Кроме того, минимальная высота пика обнаруживает пики, которые превышают определенное число, которое я настроил как 22. pks
находит фактические пиковые значения, а locs
дает вам местоположения пиков в вашем сигнале. Нам нужно использовать locs
, чтобы найти фактические пиковые данные, потому что мы выполнили это на зеркальной отраженной версии вашего сигнала. Таким образом, чтобы получить фактический пик данных, выполните следующие действия:
pks_final = vecs(loc);
В качестве демонстрации, давайте построить этот сигнал, а также пики, которые были расположены на findpeaks
:
plot(1:numel(vec), vec, locs, vec(locs), 'r.');
Исходные данные нанесены в синий цвет, а обнаруженные пики - красным. Это то, что я получаю:
Удачи!
Вы попробовали метод 'findpeaks'? У него есть параметры для фильтрации, я бы попробовал сначала «MinPeakprominence» – Daniel
Согласен с Даниэлем. Используйте «findpeaks» на негативе ваших данных. – rayryeng
Я скоро напишу ответ, если никто ничего не написал – rayryeng