2012-04-24 20 views
14

Estaba tratando de comprender cómo detectar los dos picos del histograma. Puede haber múltiples pero necesito elegir los dos más altos. Básicamente, lo que necesito es que, aunque haré que estos picos se desplacen hacia la izquierda o hacia la derecha, necesito conseguirlos. Su propagación puede variar y sus valores PICO pueden cambiar, así que tengo que encontrar la manera de obtener estos dos picos en Matlab.Detecta los dos picos más altos del histograma

Lo que he hecho hasta ahora es crear una ventana de 5 valores. Esta ventana se completa con los valores del histograma y se realiza un escaneo. Cada vez que avanzo 5-pasos al siguiente valor y comparo el valor de ventana anterior con el actual. Lo que sea más grande se mantiene.

¿Hay una mejor manera de hacerlo?

enter image description here

+0

Creo que no se puede separar el procesamiento de señal de la programación en esta pregunta. Si a alguien se le ocurre una respuesta basada en estadísticas, ¿cuál sería? Procesamiento de señal o programación? –

Respuesta

5

datos de retorno de la función hist (o histc) a una variable (y = hist(x,bin);) y utilizan PEAKFINDER presentación FileExchange para encontrar máximos locales.

También he usado la función PEAKDET de Eli Billauer. Funciona genial. Puede consultar mi answer aquí con un ejemplo de código.

+1

Sugiero realizar una estimación de la densidad del núcleo antes de ejecutar un buscador de picos en él. Las figuras de muestra en la página de intercambio de archivos muestran varios falsos positivos. Además, ¿por qué esa otra pregunta se migró a dsp en primer lugar? o_O – abcd

+0

@Bringbackspy: Sí, puede usar la función 'ksdensity' en lugar de' hist'. En cuanto a la migración de preguntas a dsp, no tengo idea. Fue movido por la decisión de algún moderador mientras estaba trabajando en la respuesta. – yuk

+0

yuk, ¡simplemente genial! Gracias parece prometedor, así que voy a tener un PEEK :) –

6

La forma más simple de hacer esto sería primero suavizar los datos usando un núcleo gaussiano para eliminar las variaciones de alta frecuencia.

Luego use la función localmax para encontrar los máximos locales.

+2

+1 si sabes que tu histograma es 'intrínsecamente' bimodal, entonces lo suavizaré hasta que tenga solo dos máximos. – leonbloy

+0

@slayton, el histograma ya pasó por una fase de suavizado. –

+1

@Wajih, vale, pero si solo quieres aislar los picos, puedes suavizarlo más para filtrar las variaciones de alta frecuencia. Estas variaciones son las que dificultan la detección de picos porque tiene muchos máximos locales. Si los filtra, entonces es bastante trivial. – slayton

Cuestiones relacionadas