findpeaks

Найдите локальные максимумы

Синтаксис

pks = findpeaks(data)
[pks,locs] = findpeaks(data)
[pks,locs,w,p] = findpeaks(data)
[___] = findpeaks(data,x)
[___] = findpeaks(data,Fs)
[___] = findpeaks(___,Name,Value)
findpeaks(___)

Описание

пример

pks = findpeaks(data) возвращает вектор с локальными максимумами (peaks) вектора входного сигнала, data. Локальный пик является выборкой данных, которая или больше, чем ее две соседних выборки или равна Inf. Конечные точки сигнала Non-Inf исключены. Если пик является плоским, функция возвращает только точку с самым низким индексом.

пример

[pks,locs] = findpeaks(data) дополнительно возвращает индексы, в которых происходит peaks.

пример

[pks,locs,w,p] = findpeaks(data) дополнительно возвращает ширины peaks как векторный w и выдающиеся положения peaks как векторный p.

пример

[___] = findpeaks(data,x) задает x как вектор местоположения и возвращает любой из выходных аргументов от предыдущих синтаксисов. locs и w выражаются с точки зрения x.

пример

[___] = findpeaks(data,Fs) задает частоту дискретизации, Fs, данных. Первая выборка data принята, чтобы быть взятой в нуле времени. locs и w преобразованы в единицы измерения времени.

пример

[___] = findpeaks(___,Name,Value) задает аргументы пары "имя-значение" использования опций в дополнение к любому из входных параметров в предыдущих синтаксисах.

пример

findpeaks(___) без выходных аргументов строит сигнал и накладывает пиковые значения.

Примеры

свернуть все

Задайте вектор с тремя peaks и постройте его.

data = [25 8 15 5 6 10 10 3 1 20 7];
plot(data)

Найдите локальные максимумы. Peaks выводится в порядке вхождения. Первая выборка не включена несмотря на то, чтобы быть максимумом. Для плоского пика функция возвращает только точку с самым низким индексом.

pks = findpeaks(data)
pks = 1×3

    15    10    20

Используйте findpeaks без выходных аргументов, чтобы отобразить peaks.

findpeaks(data)

Создайте сигнал, который состоит из суммы кривых нормального распределения. Задайте местоположение, высоту и ширину каждой кривой.

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

Постройте отдельные кривые и их сумму.

plot(x,Gauss,'--',x,PeakSig)

Используйте findpeaks с настройками по умолчанию, чтобы найти peaks сигнала и их местоположений.

[pks,locs] = findpeaks(PeakSig,x);

Постройте peaks с помощью findpeaks и маркируйте их.

findpeaks(PeakSig,x)

text(locs+.02,pks,num2str((1:numel(pks))'))

Сортировка peaks от самого высокого до самого короткого.

[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend');

findpeaks(PeakSig,x)

text(lsor+.02,psor,num2str((1:numel(psor))'))

Создайте сигнал, который состоит из суммы кривых нормального распределения, едущих на полном периоде косинуса. Задайте местоположение, высоту и ширину каждой кривой.

x = linspace(0,1,1000);

base = 4*cos(2*pi*x);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 7 5 5 4 5];
Wdt = [1 3 3 4 2 3]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss)+base;

Постройте отдельные кривые и их сумму.

plot(x,Gauss,'--',x,PeakSig,x,base)

Используйте findpeaks, чтобы определить местоположение и построить peaks, который имеет выдающееся положение по крайней мере 4.

findpeaks(PeakSig,x,'MinPeakProminence',4,'Annotate','extents')

Самый высокий и самый низкий peaks является единственными единицами, которые удовлетворяют условие.

Отобразите выдающиеся положения и ширины в половине выдающегося положения всего peaks.

[pks,locs,widths,proms] = findpeaks(PeakSig,x);
widths
widths = 1×6

    0.0154    0.0431    0.0377    0.0625    0.0274    0.0409

proms
proms = 1×6

    2.6816    5.5773    3.1448    4.4171    2.9191    3.6363

Солнечные пятна являются циклическим явлением. Их номер, как известно, достигает максимума примерно каждые 11 лет.

Загрузите файл sunspot.dat, который содержит среднее количество солнечных пятен, наблюдаемых каждый год от 1 700 до 1987. Найдите и постройте максимумы.

load sunspot.dat

year = sunspot(:,1);
avSpots = sunspot(:,2);

findpeaks(avSpots,year)

Улучшите свою оценку длительности цикла путем игнорирования peaks, который является очень друг близко к другу. Найдите и постройте peaks снова, но теперь ограничьте приемлемые разделения от пика к пику значениями, больше, чем шесть лет.

findpeaks(avSpots,year,'MinPeakDistance',6)

Используйте пиковые местоположения, возвращенные findpeaks, чтобы вычислить средний интервал между максимумами.

[pks,locs] = findpeaks(avSpots,year,'MinPeakDistance',6);

meanCycle = mean(diff(locs))
meanCycle = 10.9600

Создайте массив datetime с помощью данных года. Примите, что солнечные пятна считались каждый год 20-го марта, близко к весеннему равноденствию. Найдите пиковые годы солнечного пятна. Используйте функцию years, чтобы задать минимальное пиковое разделение как duration.

ty = datetime(year,3,20);

[pk,lk] = findpeaks(avSpots,ty,'MinPeakDistance',years(6));

plot(ty,avSpots,lk,pk,'o')

Вычислите средний цикл солнечной активности с помощью функциональности datetime.

dttmCycle = years(mean(diff(lk)))
dttmCycle = 10.9600

Создайте расписание с данными. Задайте переменную времени в годах. Отобразите данные на графике. Покажите последние пять записей расписания.

TT = timetable(years(year),avSpots);
plot(TT.Time,TT.Variables)

entries = TT(end-4:end,:)
entries=5×2 timetable
      Time      avSpots
    ________    _______

    1983 yrs     66.6  
    1984 yrs     45.9  
    1985 yrs     17.9  
    1986 yrs     13.4  
    1987 yrs     29.3  

Загрузите звуковой сигнал, выбранный на уровне 7 418 Гц. Выберите 200 выборок.

load mtlb
select = mtlb(1001:1200);

Найдите peaks, который разделяется по крайней мере на 5 мс.

Чтобы применить это ограничение, findpeaks выбирает самый высокий пик в сигнале и устраняет весь peaks в 5 мс из него. Функция затем повторяет процедуру для самого высокого остающегося пика и выполняет итерации, пока это не исчерпывает peaks, чтобы рассмотреть.

findpeaks(select,Fs,'MinPeakDistance',0.005)

Найдите peaks, который имеет амплитуду по крайней мере 1 В.

findpeaks(select,Fs,'MinPeakHeight',1)

Найдите peaks, который на по крайней мере 1 В выше, чем их соседние выборки.

findpeaks(select,Fs,'Threshold',1)

Найдите peaks, который понижается по крайней мере на 1 В с обеих сторон, прежде чем сигнал достигает более высокого значения.

findpeaks(select,Fs,'MinPeakProminence',1)

Датчики могут возвратить отсеченные показания, если данные больше, чем данная точка насыщения. Можно принять решение игнорировать этот peaks как бессмысленный или включить их к анализу.

Сгенерируйте сигнал, который состоит из продукта тригонометрических функций частот 5 Гц и 3 Гц, встроенные в белый Гауссов шум отклонения 0,1 ². Сигнал выбирается в течение одной секунды на уровне 100 Гц. Сбросьте генератор случайных чисел для восстанавливаемых результатов.

rng default

fs = 1e2;
t = 0:1/fs:1-1/fs;

s = sin(2*pi*5*t).*sin(2*pi*3*t)+randn(size(t))/10;

Моделируйте влажное измерение путем усечения каждого чтения, которое больше, чем заданное, связанное 0,32. Постройте влажный сигнал.

bnd = 0.32;
s(s>bnd) = bnd;

plot(t,s)
xlabel('Time (s)')

Найдите peaks сигнала. findpeaks сообщает только о возрастающем ребре каждого плоского пика.

[pk,lc] = findpeaks(s,t);

hold on
plot(lc,pk,'x')

Используйте пару "имя-значение" 'Threshold', чтобы исключить плоский peaks. Потребуйте минимального амплитудного различия 10-4 между пиком и его соседями.

[pkt,lct] = findpeaks(s,t,'Threshold',1e-4);

plot(lct,pkt,'o','MarkerSize',12)

Создайте сигнал, который состоит из суммы кривых нормального распределения. Задайте местоположение, высоту и ширину каждой кривой.

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [4 4 2 2 2 3];
Wdt = [3 8 4 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

Постройте отдельные кривые и их сумму.

plot(x,Gauss,'--',x,PeakSig)
grid

Измерьте ширины peaks с помощью половины выдающегося положения в качестве ссылки.

findpeaks(PeakSig,x,'Annotate','extents')

Измерьте ширины снова, на этот раз с помощью половины высоты в качестве ссылки.

findpeaks(PeakSig,x,'Annotate','extents','WidthReference','halfheight')
title('Signal Peak Widths')

Входные параметры

свернуть все

Входные данные, заданные как вектор. data должен быть действительным и должен иметь по крайней мере три элемента.

Типы данных: double | single

Местоположения, заданные как вектор или массив datetime. x должен увеличиться монотонно и иметь ту же длину как data. Если x не использован, то индексы data используются в качестве местоположений.

Типы данных: double | single | datetime

Частота дискретизации, заданная как положительная скалярная величина. Частота дискретизации является количеством выборок в единицу времени. Если модуль времени является секундами, частота дискретизации имеет модули герц.

Типы данных: double | single

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'SortStr','descend','NPeaks',3 находит три самых высоких peaks сигнала.

Максимальное количество peaks, чтобы возвратиться, заданный как пара, разделенная запятой, состоящая из 'NPeaks' и положительного целочисленного скаляра. findpeaks действует от первого элемента входных данных и останавливается, когда количество peaks достигает значения 'NPeaks'.

Типы данных: double | single

Пиковая сортировка, заданная как пара, разделенная запятой, состоящая из 'SortStr' и одно из этих значений:

  • 'none' возвращает peaks в порядке, в котором они происходят во входных данных.

  • 'ascend' возвращает peaks в возрастании или увеличении порядка от самого маленького до самого большого значения.

  • 'descend' возвращает peaks в порядке убывания от самого большого до наименьшего значения.

Минимальная пиковая высота, заданная как пара, разделенная запятой, состоящая из 'MinPeakHeight' и действительного скаляра. Использование этот аргумент, чтобы иметь findpeaks возвращает только тот peaks выше, чем 'MinPeakHeight'. Определение минимальной пиковой высоты может уменьшать время вычислений.

Типы данных: double | single

Минимальное пиковое выдающееся положение, заданное как пара, разделенная запятой, состоящая из 'MinPeakProminence' и действительного скаляра. Использование этот аргумент, чтобы иметь findpeaks возвращает только тот peaks, который имеет относительную важность, по крайней мере, 'MinPeakProminence'. Смотрите Выдающееся положение для получения дополнительной информации.

Типы данных: double | single

Минимальная разность высот между пиком и его соседями, заданными как пара, разделенная запятой, состоящая из 'Threshold' и неотрицательного действительного скаляра. Использование этот аргумент, чтобы иметь findpeaks возвращает только тот peaks, который превышает их мгновенные соседние значения, по крайней мере, значением 'Threshold'.

Типы данных: double | single

Минимальное пиковое разделение, заданное как пара, разделенная запятой, состоящая из 'MinPeakDistance' и положительного действительного скаляра. Когда вы задаете значение для 'MinPeakDistance', алгоритм выбирает самый высокий пик в сигнале и игнорирует весь peaks в 'MinPeakDistance' его. Функция затем повторяет процедуру для самого высокого остающегося пика и выполняет итерации, пока это не исчерпывает peaks, чтобы рассмотреть.

  • Если вы задаете вектор местоположения, x, то 'MinPeakDistance' должен быть выражен с точки зрения x. Если x является массивом datetime, то задайте 'MinPeakDistance' как скаляр duration или в виде числа, выраженного в днях.

  • Если вы задаете частоту дискретизации, Fs, то 'MinPeakDistance' должен быть выражен в модулях времени.

  • Если вы не задаете ни x, ни Fs, то 'MinPeakDistance' должен быть выражен в модулях выборок.

Использование этот аргумент, чтобы иметь findpeaks игнорирует маленький peaks, который происходит в окружении более крупного пика.

Типы данных: double | single | duration

Ссылочная высота для измерений ширины, заданных как пара, разделенная запятой, состоящая из 'WidthReference' и или 'halfprom' или 'halfheight'. findpeaks оценивает ширину пика как расстояние между точками, где убывающий сигнал прерывает горизонтальную ссылочную строку. Высота строки выбрана с помощью критерия, заданного в 'WidthReference':

  • 'halfprom' располагает ссылочную строку ниже пика на вертикальном расстоянии, равном половине пикового выдающегося положения. Смотрите Выдающееся положение для получения дополнительной информации.

  • 'halfheight' располагает ссылочную строку в половине пиковой высоты. Строка является усеченной, если какая-либо из ее точек пересечения лежит за пределами границ peaks, выбранного установкой 'MinPeakHeight', 'MinPeakProminence' и 'Threshold'. Граница между peaks задана горизонтальным положением самой низкой долины между ними. Peaks с высотой меньше, чем нуль отбрасывается.

Местоположения точек пересечения вычисляются линейной интерполяцией.

Минимальная пиковая ширина, заданная как пара, разделенная запятой, состоящая из 'MinPeakWidth' и положительного действительного скаляра. Используйте этот аргумент, чтобы выбрать только тот peaks, который имеет ширины, по крайней мере, 'MinPeakWidth'.

  • Если вы задаете вектор местоположения, x, то 'MinPeakWidth' должен быть выражен с точки зрения x. Если x является массивом datetime, то задайте 'MinPeakWidth' как скаляр duration или в виде числа, выраженного в днях.

  • Если вы задаете частоту дискретизации, Fs, то 'MinPeakWidth' должен быть выражен в модулях времени.

  • Если вы не задаете ни x, ни Fs, то 'MinPeakWidth' должен быть выражен в модулях выборок.

Типы данных: double | single | duration

Максимальная пиковая ширина, заданная как пара, разделенная запятой, состоящая из 'MaxPeakWidth' и положительного действительного скаляра. Используйте этот аргумент, чтобы выбрать только тот peaks, который имеет ширины в большей части 'MaxPeakWidth'.

  • Если вы задаете вектор местоположения, x, то 'MaxPeakWidth' должен быть выражен с точки зрения x. Если x является массивом datetime, то задайте 'MaxPeakWidth' как скаляр duration или в виде числа, выраженного в днях.

  • Если вы задаете частоту дискретизации, Fs, то 'MaxPeakWidth' должен быть выражен в модулях времени.

  • Если вы не задаете ни x, ни Fs, то 'MaxPeakWidth' должен быть выражен в модулях выборок.

Типы данных: double | single | duration

Стиль графика, заданный как пара, разделенная запятой, состоящая из 'Annotate' и одно из этих значений:

  • 'peaks' строит сигнал и аннотирует местоположение и значение каждого пика.

  • 'extents' строит сигнал и аннотирует местоположение, значение, ширину и выдающееся положение каждого пика.

Этот аргумент проигнорирован, если вы вызываете findpeaks с выходными аргументами.

Выходные аргументы

свернуть все

Локальные максимумы, возвращенные как вектор значений сигналов. Если нет никаких локальных максимумов, то pks пуст.

Пиковые местоположения, возвращенные как вектор.

  • Если вы задаете вектор местоположения, x, то locs содержит значения x в пиковых индексах.

  • Если вы задаете частоту дискретизации, Fs, то locs является вектором моментов времени.

  • Если вы не задаете ни x, ни Fs, то locs является вектором целочисленных индексов.

Пиковые ширины, возвращенные как вектор вещественных чисел. Ширина каждого пика вычисляется как расстояние между точками налево и правом пика, где сигнал прерывает ссылочную строку, высота которой задана WidthReference. Сами точки найдены линейной интерполяцией.

  • Если вы задаете вектор местоположения, x, то ширины выражаются с точки зрения x.

  • Если вы задаете частоту дискретизации, Fs, то ширины выражаются в модулях времени.

  • Если вы не задаете ни x, ни Fs, то ширины выражаются в модулях выборок.

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

Больше о

свернуть все

Выдающееся положение

Выдающееся положение пика измеряется, насколько пик выделяется из-за его внутренней высоты и его местоположения относительно другого peaks. Низкий изолированный пик может быть более видным, чем тот, который выше, но является в противном случае обыкновенным членом высокой области значений.

Измерять выдающееся положение пика:

  1. Поместите маркер в пик.

  2. Расширьте горизонтальную строку от пика налево и прямо пока строка не выполнит одно из следующих действий:

    • Пересекает сигнал, потому что существует более высокий пик

    • Достигает левого или правого конца сигнала

  3. Найдите минимум сигнала в каждом из этих двух интервалов заданным на Шаге 2. Эта точка является или долиной или одной из конечных точек сигнала.

  4. Выше двух минимумов интервала задает контрольный уровень. Высота пика выше этого уровня является своим выдающимся положением.

findpeaks не делает предположения о поведении сигнала вне его конечных точек, безотносительно их высоты. Это отражается на  Шагах 2 и 4 и часто влияет на значение контрольного уровня. Рассмотрите, например, peaks этого сигнала:

Пиковый номерОставленный интервал находится между пиком иПравильный интервал находится между пиком иСамая низкая точка на левом интервалеСамая низкая точка на правильном интервалеКонтрольный уровень (самый высокий минимум)
1Оставленный конецПересечение должного достигнуть максимума 2Оставленная конечная точкаaa
2Оставленный конецПравильный конецОставленная конечная точкаhОставленная конечная точка
3Пересечение должного достигнуть максимума 2Пересечение должного достигнуть максимума 4bcc
4Пересечение должного достигнуть максимума 2Пересечение должного достигнуть максимума 6bdb
5Пересечение должного достигнуть максимума 4Пересечение должного достигнуть максимума 6dee
6Пересечение должного достигнуть максимума 2Правильный конецdhd
7Пересечение должного достигнуть максимума 6Пересечение должного достигнуть максимума 8fgg
8Пересечение должного достигнуть максимума 6Правильный конецfhf
9Пересечение должного достигнуть максимума 8Пересечение из-за правильной конечной точкиhii

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Представленный в R2007b