Main Content

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

ejemplo

pks = findpeaks(data) devuelve un vector con los máximos locales (picos) del vector de la señal de entrada, data. 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(data) devuelve además los índices en los que se producen los picos.

ejemplo

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

ejemplo

[___] = findpeaks(data,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(data,Fs) especifica la tasa de muestreo, Fs, de los datos. Se supone que la primera muestra de data 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.

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.

Argumentos de entrada

contraer todo

Datos de entrada, especificados como un vector. data 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 data. Si se omite x, los índices de data 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

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, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: 'SortStr','descend','NPeaks',3 encuentra los tres picos más altos de la señal.

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. 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

Prominencia

La prominencia de un pico mide cuánto destaca el pico debido a su altura intrínseca y a su ubicación en relación con otros picos. Un pico aislado bajo puede ser más prominente que uno más alto, pero que por lo demás es un miembro poco llamativo de una franja alta.

Para medir la prominencia de un pico:

  1. Coloque un marcador en el pico.

  2. Amplíe una línea horizontal desde el pico a la izquierda y a la derecha hasta que la línea haga una de las siguientes cosas:

    • Cruza la señal porque hay un pico más alto.

    • Llega al extremo izquierdo o derecho de la señal.

  3. Busque el mínimo de la señal en cada uno de los dos intervalos definidos en el paso 2. Este punto es un valle o uno de los puntos finales de la señal.

  4. El mayor de los dos intervalos mínimos especifica el nivel de referencia. La altura del pico por encima de este nivel es su prominencia.

findpeaks no hace ninguna suposición sobre el comportamiento de la señal más allá de sus puntos finales, sea cual sea su altura. Por consiguiente, los pasos 2 y 4 no tienen en cuenta el comportamiento de la señal más allá de los puntos finales, lo que suele afectar al valor del nivel de referencia. Consideremos, por ejemplo, los picos de esta señal:

Signal with nine peaks, numbered 1 through 9 from left to right. The valleys between each pair of peaks are labeled from left to right with the letters a through i. In decreasing order of height, the peaks are 2, 6, 1, 8, 4, which is equal to 8, 7, 3, 9, and 5. In decreasing order of height, the valleys are a, g, c, i, f, b, which is equal to f, e, d, and h. For this signal, peak 6 has the highest prominence, even though it is lower than peak 2.

Número de picoEl intervalo izquierdo está entre el pico y elEl intervalo derecho está entre el pico y elPunto más bajo del intervalo izquierdoPunto más bajo del intervalo derechoNivel de referencia (mínimo más alto)
1Extremo izquierdoCruce debido al pico 2Punto final izquierdoaa
2Extremo izquierdoExtremo derechoPunto final izquierdohPunto final izquierdo
3Cruce debido al pico 2Cruce debido al pico 4bcc
4Cruce debido al pico 2Cruce debido al pico 6bdb
5Cruce debido al pico 4Cruce debido al pico 6dee
6Cruce debido al pico 2Extremo derechodhd
7Cruce debido al pico 6Cruce debido al pico 8fgg
8Cruce debido al pico 6Extremo derechofhf
9Cruce debido al pico 8Cruce debido al punto final derechohii

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2007b