findpeaks
Encontrar los máximos locales
Sintaxis
Descripción
devuelve un vector con los máximos locales (picos) del vector de la señal de entrada, pks
= findpeaks(data
)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.
[___] = findpeaks(___,
especifica las opciones utilizando argumentos nombre-valor además de cualquiera de los argumentos de entrada de las sintaxis anteriores.Name,Value
)
findpeaks(___)
sin argumentos de salida representa la señal y superpone los valores máximos.
Ejemplos
Encontrar picos en un vector
Defina un vector con tres picos y represéntelo.
data = [25 8 15 5 6 10 10 3 1 20 7]; plot(data)
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)
Buscar picos y sus ubicaciones
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)
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))'))
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))'))
Prominencias de los picos
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)
Utilice findpeaks
para localizar y representar los picos que tienen una prominencia de al menos 4.
findpeaks(PeakSig,x,'MinPeakProminence',4,'Annotate','extents')
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
Buscar picos con una separación mínima
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)
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)
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')
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)
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
Limitar las características de los picos
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)
Busque los picos que tienen una amplitud de al menos 1 V.
findpeaks(select,Fs,'MinPeakHeight',1)
Busque los picos que son al menos 1 V más altos que sus muestras vecinas.
findpeaks(select,Fs,'Threshold',1)
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)
Picos de señal saturada
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)')
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')
Utilice el par nombre-valor 'Threshold'
para excluir los picos planos. Exija una diferencia de amplitud mínima de entre un pico y sus vecinos.
[pkt,lct] = findpeaks(s,t,'Threshold',1e-4); plot(lct,pkt,'o','MarkerSize',12)
Determinar la anchura de los picos
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
Mida la anchura de los picos utilizando la media prominencia como referencia.
findpeaks(PeakSig,x,'Annotate','extents')
Vuelva a medir las anchuras, esta vez utilizando la media altura como referencia.
findpeaks(PeakSig,x,'Annotate','extents','WidthReference','halfheight') title('Signal Peak Widths')
Argumentos de entrada
data
— Datos de entrada
vector
Datos de entrada, especificados como un vector. data
debe ser real y debe tener al menos tres elementos.
Tipos de datos: double
| single
x
— Ubicaciones
vector | arreglo datetime
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
Fs
— Tasa de muestreo
escalar positivo
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.
NPeaks
— Número máximo de picos
escalar entero positivo
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
SortStr
— Clasificación de picos
'none'
(predeterminado) | 'ascend'
| 'descend'
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.
MinPeakHeight
— Altura mínima del pico
-Inf
(predeterminado) | escalar real
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
MinPeakProminence
— Mínima prominencia del pico
0 (predeterminado) | escalar real
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
Threshold
— Diferencia mínima de altura
0 (predeterminado) | escalar real no negativo
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
MinPeakDistance
— Separación mínima de los picos
0 (predeterminado) | escalar real positivo
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 dex
. Six
es un arreglo dedatetime
, entonces especifique'MinPeakDistance'
como un escalar deduration
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
niFs
, 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
WidthReference
— Altura de referencia para la medición de la anchura
'halfprom'
(predeterminado) | 'halfheight'
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.
MinPeakWidth
— Anchura mínima del pico
0 (predeterminado) | escalar real positivo
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 dex
. Six
es un arreglo dedatetime
, entonces especifique'MinPeakWidth'
como un escalar deduration
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
niFs
, entonces debe expresarse'MinPeakWidth'
en unidades de muestras.
Tipos de datos: double
| single
| duration
MaxPeakWidth
— Anchura máxima del pico
Inf
(predeterminado) | escalar real positivo
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 dex
. Six
es un arreglo dedatetime
, entonces especifique'MaxPeakWidth'
como un escalar deduration
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
niFs
, entonces'MaxPeakWidth'
debe expresarse en unidades de muestras.
Tipos de datos: double
| single
| duration
Annotate
— Estilo de gráfica
'peaks'
(predeterminado) | 'extents'
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
pks
— Máximos locales
vector
Máximos locales, devueltos como un vector de valores de la señal. Si no hay máximos locales, entonces pks
está vacío.
locs
— Ubicaciones de los picos
vector
Ubicaciones de los picos, devueltas como un vector.
Si se especifica un vector de ubicación,
x
, entonceslocs
contiene los valores dex
en los índices de pico.Si se especifica una tasa de muestreo,
Fs
, entonceslocs
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
niFs
, entonceslocs
es un vector de índices enteros.
w
— Anchura de los picos
vector
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.
p
— Prominencias de los picos
vector
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
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:
Coloque un marcador en el pico.
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.
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.
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:
Número de pico | El intervalo izquierdo está entre el pico y el | El intervalo derecho está entre el pico y el | Punto más bajo del intervalo izquierdo | Punto más bajo del intervalo derecho | Nivel de referencia (mínimo más alto) |
---|---|---|---|---|---|
1 | Extremo izquierdo | Cruce debido al pico 2 | Punto final izquierdo | a | a |
2 | Extremo izquierdo | Extremo derecho | Punto final izquierdo | h | Punto final izquierdo |
3 | Cruce debido al pico 2 | Cruce debido al pico 4 | b | c | c |
4 | Cruce debido al pico 2 | Cruce debido al pico 6 | b | d | b |
5 | Cruce debido al pico 4 | Cruce debido al pico 6 | d | e | e |
6 | Cruce debido al pico 2 | Extremo derecho | d | h | d |
7 | Cruce debido al pico 6 | Cruce debido al pico 8 | f | g | g |
8 | Cruce debido al pico 6 | Extremo derecho | f | h | f |
9 | Cruce debido al pico 8 | Cruce debido al punto final derecho | h | i | i |
Capacidades ampliadas
Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.
Arreglos GPU
Acelere código mediante la ejecución en una unidad de procesamiento gráfico (GPU) mediante Parallel Computing Toolbox™.
Esta función es totalmente compatible con los arreglos de GPU. Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Historial de versiones
Introducido en R2007b
Consulte también
fminbnd
| fminsearch
| fzero
| islocalmax
| islocalmin
| max
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)