exponenta event banner

findpeaks

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

Описание

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

Примеры

свернуть все

Определите вектор с тремя пиками и постройте его график.

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

Figure contains an axes. The axes contains an object of type line.

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

pks = findpeaks(data)
pks = 1×3

    15    10    20

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

findpeaks(data)

Figure contains an axes. The axes contains 2 objects of type line.

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

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)

Figure contains an axes. The axes contains 7 objects of type line.

Использовать findpeaks с настройками по умолчанию для поиска пиков сигнала и их местоположений.

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

Постройте график пиков с помощью findpeaks и маркировать их.

findpeaks(PeakSig,x)

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

Figure contains an axes. The axes contains 8 objects of type line, text.

Сортируйте пики от самых высоких до самых коротких.

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

findpeaks(PeakSig,x)

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

Figure contains an axes. The axes contains 8 objects of type line, text.

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

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)

Figure contains an axes. The axes contains 8 objects of type line.

Использовать findpeaks для определения местоположения и построения графика пиков, имеющих значение по меньшей мере 4.

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

Figure contains an axes. The axes contains 4 objects of type line. These objects represent signal, peak, prominence, width (half-prominence).

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

Отображение обозначений и ширины в половине обозначений всех пиков.

[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, который содержит среднее количество солнечных пятен, наблюдаемых каждый год с 1700 по 1987 год. Найдите и постройте графики максимумов.

load sunspot.dat

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

findpeaks(avSpots,year)

Figure contains an axes. The axes contains 2 objects of type line.

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

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

Figure contains an axes. The axes contains 2 objects of type line.

Использовать пиковые местоположения, возвращенные 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')

Figure contains an axes. The axes contains 2 objects of type line.

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

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

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

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

Figure contains an axes. The axes contains an object of type line.

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

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

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

load mtlb
select = mtlb(1001:1200);

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

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

Сформировать сигнал, состоящий из произведения тригонометрических функций частот 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)')

Figure contains an axes. The axes contains an object of type line.

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

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

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

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

Figure contains an axes. The axes contains 3 objects of type line.

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

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

Figure contains an axes. The axes contains 7 objects of type line.

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

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

Figure contains an axes. The axes contains 4 objects of type line. These objects represent signal, peak, prominence, width (half-prominence).

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

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

Figure contains an axes. The axes with title Signal Peak Widths contains 6 objects of type line. These objects represent signal, peak, height, width (half-height), border.

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

свернуть все

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

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

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

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

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

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

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

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 'halfprom' размещает опорную линию под пиком на расстоянии по вертикали, равном половине высоты пика. Дополнительные сведения см. в разделе Известность.

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

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

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

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

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

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

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

Максимальная ширина пика, заданная как разделенная запятыми пара, состоящая из 'MaxPeakWidth' и положительный действительный скаляр. Этот аргумент используется для выбора только тех пиков, ширина которых не превышает '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 - числовой вектор моментов времени с разницей во времени 1/Fs между последовательными выборками.

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

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

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

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

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

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

Подробнее

свернуть все

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

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

Для измерения значимости пика:

  1. Поместите маркер на вершину.

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

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

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

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

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

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

Пиковое числоЛевый интервал лежит между пиком иПравый интервал находится между пиком иСамая низкая точка в левом интервалеСамая низкая точка правого интервалаОпорный уровень (максимальный минимум)
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Пересечение из-за правой конечной точкиhяя

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2007b