Encontrar picos locales entre muestras

10

Tengo muestras discretas de una señal sísmica y [ n ] : ny[n]ingrese la descripción de la imagen aquí

Quiero encontrar máximos locales en la señal.

y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

i=4.25

y[n]

  • ¿Cómo encuentro máximos usando la interpolación?
  • ¿Qué forma de interpolación debo usar?

Como puede ver, mi señal no es muy ruidosa, sin embargo, sería bueno si el método también filtrara un poco para que los máximos excedan un umbral y tengan un cierto ancho (sin picos).

Sin embargo, mi mayor problema es encontrar picos entre muestras. ¿Alguna sugerencia para una buena manera de hacer esto?

Gracias de antemano por cualquier respuesta!

Andy
fuente
1
Quizás mire la pregunta 1 y la pregunta 2 .
Geerten
Varios métodos para espectros de frecuencia: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith
Ese segundo no tiene una respuesta @Geerten ;-)
Ivo Flipse
1
Oh ... jaja, buen punto. Bueno, me
referiré

Respuestas:

7

Obtener una resolución de submuestra

Una solución muy barata (en términos de tamaño de código) es simplemente muestrear su señal. En matlab, esto se puede hacer con interp(y ,ratio). Una solución un poco más complicada consiste en detectar picos ingenuamente; y para cada pico, ajustando una parábola a través de y [pico - 1], y [pico], y [pico + 1]; luego usando el punto en el cual esta parábola es máxima como la verdadera posición de pico.

En cuanto a la detección de picos

Un montón de técnicas que ayudan:

  • Según lo sugerido por Hilmar, convoluciona la señal por una ventana gaussiana o Hann, cuyo ancho es aproximadamente igual a la mitad del intervalo mínimo que desea ver entre los picos detectados. Sin embargo, como la precisión temporal parece esencial para su aplicación, asegúrese de tener en cuenta el retraso de tiempo introducido por el filtrado.
  • Reste a su señal una versión mediana filtrada de sí mismo (con una ventana de observación bastante grande); y dividir el resultado por una versión filtrada de desviación estándar de sí mismo. Esto elimina las tendencias y permite que los umbrales se expresen en unidades de desviaciones estándar.
  • Para la selección de picos, formulo eso usando un filtro de "sombrero de copa". Defina la versión filtrada de su sombrero como yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); y use como picos los puntos donde y [n] == yt [n] e y [n]> umbral.

Todo esto se puede implementar de manera muy eficiente en Matlab con unos pocos pasos de nlfilter.

pichenettes
fuente
La combinación de muestreo ascendente más interpolación parabólica puede funcionar mejor que cualquiera de los dos.
hotpaw2
3

Pruebe con un detector de pico con pérdida:

y[n] = max(abs(x[n]),a*y[n-1]);

donde "a" es un número menor que 1 que controla qué tan rápido se descompone el detector. Determina qué tan cerca pueden estar los picos vecinos sin suavizarse en uno solo. Luego haga una detección de umbral.

Hilmar
fuente
Tienes tanto ax [n] como y [n] en tu ecuación. ¿Es esto correcto o debería ser solo y [n]?
Andy
x [n] es la entrada, y [n] es la salida. Mala respuesta en general, hay un error tipográfico (corregido ahora) y no entendí la pregunta. Disculpas
Hilmar