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.