Contenido principal

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

findpeaks

Encontrar los máximos locales

Descripción

pks = findpeaks(y) devuelve un vector con los máximos locales (picos) del vector de la señal de entrada, y. Un pico local es una muestra de datos que es mayor que sus dos muestras vecinas o es igual a Inf. Los picos se muestran por orden de aparición. Se excluyen los puntos finales de señal que no sean Inf. Si un pico es plano, la función devuelve solo el punto con el índice más bajo.

ejemplo

[pks,locs] = findpeaks(y) devuelve además los índices en los que se producen los picos.

ejemplo

[pks,locs,w,p] = findpeaks(y) devuelve además las anchuras de los picos como el vector w y las prominencias de los picos como el vector p.

ejemplo

[___] = findpeaks(y,x) especifica x como el vector de ubicación y devuelve cualquiera de los argumentos de salida de las sintaxis anteriores. locs y w se expresan en términos de x.

ejemplo

[___] = findpeaks(y,Fs) especifica la tasa de muestreo, Fs, de los datos. Se supone que la primera muestra de y se ha tomado en el momento cero. locs y w se convierten en unidades de tiempo.

ejemplo

[___] = findpeaks(___,Name,Value) especifica las opciones utilizando argumentos nombre-valor además de cualquiera de los argumentos de entrada de las sintaxis anteriores.

ejemplo

findpeaks(___) sin argumentos de salida representa la señal y superpone los valores máximos.

ejemplo

Ejemplos

contraer todo

Defina un vector con tres picos y represéntelo.

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

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

Encuentre los máximos locales. Los picos se muestran por orden de aparición. La primera muestra no se incluye a pesar de ser la máxima. Para el pico plano, la función devuelve solo el punto con menor índice.

pks = findpeaks(data)
pks = 1×3

    15    10    20

Utilice findpeaks sin argumentos de salida para mostrar los picos.

findpeaks(data)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Cree una señal que consista en una suma de curvas de campana. Especifique la ubicación, la altura y la anchura de cada curva.

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);

Represente las curvas individuales y su suma.

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

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

Utilice findpeaks con la configuración predeterminada para encontrar los picos de la señal y sus ubicaciones.

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

Represente los picos utilizando findpeaks y etiquételos.

findpeaks(PeakSig,x)

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

Figure contains an axes object. The axes object contains 8 objects of type line, text. One or more of the lines displays its values using only markers

Clasifique los picos del más alto al más bajo.

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

findpeaks(PeakSig,x)

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

Figure contains an axes object. The axes object contains 8 objects of type line, text. One or more of the lines displays its values using only markers

Cree una señal que consista en una suma de curvas de campana montadas en un período completo de un coseno. Especifique la ubicación, la altura y la anchura de cada curva.

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;

Represente las curvas individuales y su suma.

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

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

Utilice findpeaks para localizar y representar los picos que tienen una prominencia de al menos 4.

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

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, prominence, width (half-prominence).

Los picos más altos y más bajos son los únicos que satisfacen la condición.

Muestra las prominencias y las anchuras a media prominencia de todos los picos.

[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

Las manchas solares son un fenómeno cíclico. Se sabe que su número alcanza un pico cada 11 años aproximadamente.

Cargue el archivo sunspot.dat, que contiene el número medio de manchas solares observadas cada año desde 1700 hasta 1987. Busque y represente los máximos.

load sunspot.dat

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

findpeaks(avSpots,year)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Mejore su estimación de la duración del ciclo ignorando los picos que están muy próximos entre sí. Busque y represente los picos de nuevo, pero ahora restrinja las separaciones aceptables entre picos a valores superiores a seis años.

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Utilice las ubicaciones de los picos devueltos por findpeaks para calcular el intervalo medio entre los máximos.

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

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

Cree un arreglo datetime utilizando los datos de año. Supongamos que las manchas solares se cuentan cada año el 20 de marzo, cerca del equinoccio de primavera. Busque los años de mayor número de manchas solares. Utilice la función years para especificar la separación mínima de los picos en forma de duration.

ty = datetime(year,3,20);

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

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Calcule el ciclo medio de las manchas solares utilizando la funcionalidad datetime.

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

Cree un calendario con los datos. Especifique la variable temporal en años. Represente los datos. Muestre las cinco últimas entradas del horario.

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

Figure contains an axes object. The axes object 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  

Cargue una señal de audio muestreada a 7418 Hz. Seleccione 200 muestras.

load mtlb
select = mtlb(1001:1200);

Busque los picos que estén separados por al menos 5 ms.

Para aplicar esta restricción, findpeaks elige el pico más alto de la señal y elimina todos los picos situados a menos de 5 ms de él. A continuación, la función repite el procedimiento para el pico más alto restante e itera hasta que se agoten los picos a considerar.

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Busque los picos que tienen una amplitud de al menos 1 V.

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Busque los picos que son al menos 1 V más altos que sus muestras vecinas.

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Busque los picos que caen al menos 1 V a cada lado antes de que la señal alcance un valor superior.

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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Los sensores pueden devolver lecturas recortadas si los datos son mayores que un punto de saturación determinado. Puede optar por ignorar estos picos por considerarlos insignificantes o incorporarlos a su análisis.

Genere una señal que consiste en un producto de funciones trigonométricas de frecuencias de 5 Hz y 3 Hz integradas en ruido blanco gaussiano de varianza 0,1². La señal se muestrea durante un segundo a una velocidad de 100 Hz. Reinicie el generador de números aleatorios para obtener resultados reproducibles.

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;

Simule una medición saturada truncando cada lectura que sea mayor que un límite especificado de 0.32. Represente la señal saturada.

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

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

Figure contains an axes object. The axes object with xlabel Time (s) contains an object of type line.

Localice los picos de la señal. findpeaks informa solo del borde ascendente de cada pico plano.

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

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

Figure contains an axes object. The axes object with xlabel Time (s) contains 2 objects of type line. One or more of the lines displays its values using only markers

Utilice el par nombre-valor 'Threshold' para excluir los picos planos. Exija una diferencia de amplitud mínima de 10-4 entre un pico y sus vecinos.

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

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

Figure contains an axes object. The axes object with xlabel Time (s) contains 3 objects of type line. One or more of the lines displays its values using only markers

Cree una señal que consista en una suma de curvas de campana. Especifique la ubicación, la altura y la anchura de cada curva.

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);

Represente las curvas individuales y su suma.

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

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

Mida la anchura de los picos utilizando la media prominencia como referencia.

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

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, prominence, width (half-prominence).

Vuelva a medir las anchuras, esta vez utilizando la media altura como referencia.

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

Figure contains an axes object. The axes object with title Signal Peak Widths contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, height, width (half-height), border.

Obtenga una estimación refinada de la ubicación de los dos picos principales de una señal utilizando el método de mínimos cuadrados no lineales con un núcleo de función sinc.

Generar señal

La compresión del pulso de radar de una forma de onda FM lineal produce un espectro en forma de sinc, en el que las ubicaciones de frecuencia de los picos son proporcionales a la distancia entre el radar y el objeto detectado. Primero puede estimar las ubicaciones y amplitudes de los picos con findpeaks y, a continuación, mejorar sus estimaciones con refinepeaks. Este ejemplo encuentra las ubicaciones y amplitudes de los picos de una señal de compresión de pulso sintética sin ruido y utiliza refinepeaks para mejorar las estimaciones.

Genere una señal compuesta de dos formas de onda en forma de sinc con picos de 1 y 1.5 a 4.76 kHz y 35.8 kHz, respectivamente. Establezca el espaciado de frecuencia en 2.5 Hz.

aTarget = [1 1.5];
fTarget = 1e3*[4.76 35.8];
freqkHzFull = (0:0.0025:50)';
waveFull = abs(sinc([1 0.5].*(freqkHzFull-fTarget/1e3)))*aTarget';

Submuestree la señal por un factor de 200, de modo que el espaciado de frecuencia entre muestras sea de 0.5 kHz. Este ejemplo refina las estimaciones de la amplitud y la ubicación de los picos de la señal submuestreada y compara las estimaciones mejoradas con los valores en las señales originales.

freq = downsample(freqkHzFull,200);
wave = downsample(waveFull,200);

plot(freqkHzFull,waveFull,freq,wave,"*")
legend(["Full signal" "Selected samples"],Location="northwest")
xlabel("Frequency (kHz)")
ylabel("Magnitude")

Figure contains an axes object. The axes object with xlabel Frequency (kHz), ylabel Magnitude contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Full signal, Selected samples.

Refinar picos utilizando mínimos cuadrados no lineales

Utilice findpeaks para calcular estimaciones iniciales de las amplitudes, ubicaciones y anchos a media altura de los dos picos más altos de la señal.

[PV,PL,PW] = findpeaks(wave,NPeaks=2, ...
    SortStr="descend",WidthReference="halfheight");

Utilice refinepeaks para mejorar la estimación de los picos utilizando el método de mínimos cuadrados no lineales (NLS). Especifique los puntos de frecuencia de la señal y los anchos de los picos. Los valores de los picos se acercan mucho más a los valores esperados de 1.5 y 1, mientras que las ubicaciones de frecuencia se aproximan a 35.8 kHz y 4.76 kHz, respectivamente.

LW = max(PW,2);
[Ypk,Xpk] = refinepeaks(wave,PL,freq,Method="NLS",LobeWidth=LW)
Ypk = 2×1

    1.5063
    1.0163

Xpk = 2×1

   35.8001
    4.7628

Represente las amplitudes de los picos refinados en el eje y y las ubicaciones actualizadas de los picos en comparación con las estimaciones iniciales de los picos en el eje x. Los dos picos estimados inicialmente y sus dos muestras circundantes están separados 0.5 kHz entre sí. Los picos refinados, indicados con círculos rellenos, muestran las ubicaciones reales de los picos en comparación con las ubicaciones de los picos estimadas inicialmente, así como las amplitudes corregidas.

refinepeaks(wave,PL,freq,Method="NLS",LobeWidth=LW)
yline(aTarget) % Theoretical peak amplitudes
errorBounds = aTarget.*(1+0.03*[-1;1]);
yline(errorBounds(:),":") % ±3% error bounds
legend("Peak "+[1 2])

Figure contains an axes object. The axes object with title Refined Peaks, xlabel Update to Peak Location, ylabel Amplitude contains 13 objects of type scatter, line, constantline. These objects represent Peak 1, Peak 2.

Argumentos de entrada

contraer todo

Datos de entrada, especificados como un vector. y debe ser real y debe tener al menos tres elementos.

Tipos de datos: double | single

Las ubicaciones, especificadas como un vector o un arreglo datetime. x debe aumentar monotónicamente y tener la misma longitud que y. Si se omite x, los índices de y se utilizan como ubicaciones.

Tipos de datos: double | single | datetime

Tasa de muestreo, especificada como un escalar positivo. La tasa de muestreo es el número de muestras por unidad de tiempo. Si la unidad de tiempo es el segundo, la tasa de muestreo tiene unidades de hercios.

Tipos de datos: double | single

Argumentos de par nombre-valor

contraer todo

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

En las versiones anteriores a la R2021a, use comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: findpeaks(y,x,SortStr="descend",NPeaks=3) encuentra los tres picos más altos de la señal y.

Número máximo de picos a devolver, especificado como escalar entero positivo. findpeaks opera desde el primer elemento de los datos de entrada y termina cuando el número de picos alcanza el valor de 'NPeaks'.

Tipos de datos: double | single

Clasificación de picos, especificada como uno de estos valores:

  • 'none' devuelve los picos en el orden en que aparecen en los datos de entrada.

  • 'ascend' devuelve los picos en orden ascendente o creciente, desde el valor más pequeño al más grande.

  • 'descend' devuelve los picos en orden descendente, del mayor al menor valor.

Altura mínima del pico, especificada como escalar real. Utilice este argumento para que findpeaks devuelva solo los picos superiores a 'MinPeakHeight'. La especificación de una altura de pico mínima puede reducir el tiempo de procesamiento.

Tipos de datos: double | single

Mínima prominencia del pico, especificada como escalar real no negativo. Utilice este argumento para que findpeaks devuelva solo aquellos picos que tengan una importancia relativa de al menos 'MinPeakProminence'. Para obtener más información, consulte Prominencia.

Tipos de datos: double | single

Diferencia mínima de altura entre un pico y sus vecinos, especificada como escalar real no negativo. Utilice este argumento para que findpeaks devuelva solo aquellos picos que superen sus valores vecinos inmediatos en al menos el valor de 'Threshold'.

Tipos de datos: double | single

Separación mínima de los picos, especificada como escalar real positivo. Cuando se especifica un valor para 'MinPeakDistance', el algoritmo elige el pico más alto de la señal e ignora todos los picos que se encuentran dentro de 'MinPeakDistance'. A continuación, la función repite el procedimiento para el pico más alto restante e itera hasta que se agoten los picos a considerar.

  • Si se especifica un vector de ubicación, x, entonces 'MinPeakDistance' debe expresarse en términos de x. Si x es un arreglo de datetime, entonces especifique 'MinPeakDistance' como un escalar de duration o como un escalar numérico expresado en días.

  • Si se especifica una tasa de muestreo, Fs, entonces 'MinPeakDistance' debe expresarse en unidades de tiempo.

  • Si no se especifica x ni Fs, entonces debe expresarse 'MinPeakDistance' en unidades de muestras.

Utilice este argumento para que findpeaks ignore los picos pequeños que se producen en la vecindad de un pico mayor.

Tipos de datos: double | single | duration

Altura de referencia para las mediciones de anchura, especificada como 'halfprom' o 'halfheight'. findpeaks estima la anchura de un pico como la distancia entre los puntos donde la señal descendente intercepta una línea de referencia horizontal. La altura de la línea se selecciona utilizando el criterio especificado en 'WidthReference':

  • 'halfprom' sitúa la línea de referencia bajo el pico a una distancia vertical igual a la mitad de la prominencia del pico. Para obtener más información, consulte Prominencia.

  • 'halfheight' sitúa la línea de referencia a la mitad de la altura del pico. La línea se trunca si alguno de sus puntos de intercepción se encuentra más allá de los bordes de los picos seleccionados al establecer 'MinPeakHeight', 'MinPeakProminence' y 'Threshold'. El límite entre los picos está definido por la posición horizontal del valle más bajo entre ellos. Los picos con altura inferior a cero se descartan.

Las ubicaciones de los puntos de intercepción se calculan por interpolación lineal.

Anchura mínima del pico, especificada como escalar real positivo. Utilice este argumento para seleccionar solo aquellos picos que tengan una anchura de al menos 'MinPeakWidth'.

  • Si se especifica un vector de ubicación, x, entonces 'MinPeakWidth' debe expresarse en términos de x. Si x es un arreglo de datetime, entonces especifique 'MinPeakWidth' como un escalar de duration o como un escalar numérico expresado en días.

  • Si se especifica una tasa de muestreo, Fs, entonces 'MinPeakWidth' debe expresarse en unidades de tiempo.

  • Si no se especifica x ni Fs, entonces debe expresarse 'MinPeakWidth' en unidades de muestras.

Tipos de datos: double | single | duration

Anchura máxima del pico, especificada como escalar real positivo. Utilice este argumento para seleccionar solo los picos que tengan una anchura máxima de 'MaxPeakWidth'.

  • Si se especifica un vector de ubicación, x, entonces 'MaxPeakWidth' debe expresarse en términos de x. Si x es un arreglo de datetime, entonces especifique 'MaxPeakWidth' como un escalar de duration o como un escalar numérico expresado en días.

  • Si se especifica una tasa de muestreo, Fs, entonces 'MaxPeakWidth' debe expresarse en unidades de tiempo.

  • Si no se especifica x ni Fs, entonces 'MaxPeakWidth' debe expresarse en unidades de muestras.

Tipos de datos: double | single | duration

Estilo de gráfica, especificado como uno de estos valores:

  • 'peaks' representa la señal y anota la ubicación y el valor de cada pico.

  • 'extents' representa la señal y anota la ubicación, el valor, la anchura y la prominencia de cada pico.

Este argumento se ignora si se llama a findpeaks con argumentos de salida.

Argumentos de salida

contraer todo

Máximos locales, devueltos como un vector de valores de la señal. Si no hay máximos locales, entonces pks está vacío.

Ubicaciones de los picos, devueltas como un vector.

  • Si se especifica un vector de ubicación, x, entonces locs contiene los valores de x en los índices de pico.

  • Si se especifica una tasa de muestreo, Fs, entonces locs es un vector numérico de instantes de tiempo con una diferencia de tiempo de 1/Fs entre muestras consecutivas.

  • Si no se especifica x ni Fs, entonces locs es un vector de índices enteros.

Anchura de los picos, devuelta como un vector de números reales. La anchura de cada pico se calcula como la distancia entre los puntos a la izquierda y a la derecha del pico donde la señal intercepta una línea de referencia cuya altura está especificada por WidthReference. Los puntos se encuentran por interpolación lineal.

  • Si se especifica un vector de ubicación, x, entonces las anchuras se expresan en términos de x.

  • Si se especifica una tasa de muestreo, Fs, entonces las anchuras se expresan en unidades de tiempo.

  • Si no se especifica x ni Fs, las anchuras se expresan en unidades de muestras.

Prominencias de picos, devueltas como un vector de números reales. La prominencia de un pico es la distancia vertical mínima que la señal debe descender a ambos lados del pico antes de volver a subir a un nivel superior al del pico o alcanzar un punto final. Para obtener más información, consulte Prominencia.

Más acerca de

contraer todo

Sugerencias

Puede estimar inicialmente los picos de la señal con findpeaks y, a continuación, realzar sus amplitudes y ubicaciones con refinepeaks.

Suponga que tiene una señal con amplitudes y y ubicaciones x. El fragmento de código siguiente muestra cómo puede estimar y refinar picos de y y x.

[yPeaks,xPeaksIdx] = findpeaks(y);
[yRPeaks,xRPeaks] = refinepeaks(y,xPeaksIdx,x)

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2007b

expandir todo