Python: optimización de parámetros para encontrar picos en una matriz 1D

CorePress2023-11-30  1

Necesito optimizar un método para encontrar el número de picos de datos en una matriz 1D. Los datos son una serie temporal de la amplitud de un archivo wav.

Ya tengo el código implementado:

from scipy.io.wavfile import read
from scipy.signal import find_peaks


_, amplitudes = read('audio1.wav')


indexes, _ = find_peaks(amplitudes, height=80)
print(f'Number of peaks: {len(indexes)}')

Cuando se trazan, los datos se ven así:

Escala general

Los 'picos' que me interesan son claros para el ojo humano: hay 23 en este conjunto de datos en particular.

Sin embargo, debido a que la matriz es tan grande, los datos son extremadamente variables dentro de los picos que son claros a escala general (de ahí los cientos de picos etiquetados con cruces azules):

Ampliado en vista de un pico

Ya me han hecho muchas veces preguntas para encontrar picos (¡he repasado muchas de ellas!), pero no puedo encontrar ninguna ayuda o explicación sobre optimizar el parámetro.ers por encontrar solo los picos que quiero. ¡Sé un poco sobre Python, pero estoy ciego cuando se trata de análisis matemático!

Analizar por ancho parece inútil porque, según la segunda imagen, los picos claros a gran escala en realidad están intercalados con rangos "silenciosos". La distancia no es útil porque no sé qué tan cerca estarán los picos en otros archivos wav. Se sugirió Prominence como el mejor método pero no pude obtener los resultados que necesitaba; umbral de la misma manera. También intenté diezmar la señal, suavizarla con un filtro Savitzky-Golay y diferentes combinaciones de parámetros y valores, todo con resultados inexactos.

La altura por sí sola ha sido útil porque puedo ver en los gráficos que los picos siempre superan los 80.



------------------------

Esta es una tarea común en el procesamiento de audio y existen varios enfoques que dependen totalmente de sus datos.

Sin embargo, existen implementaciones que se utilizan para encontrar picos en funciones novedosas (por ejemplo, la salida de un rastreador de ritmos). Prueba estos:

  • https://madmom.readthedocs.io/en/latest/modules/features/onsets.html#madmom.features.onsets.peak_picking
  • https://librosa.github.io/librosa/generated/librosa.util.peak_pick.html#librosa.util.peak_pick

Básicamente implementan el mismo método pero puede haber diferencias en los detalles. Además, podrías comprobarlo.Si realmente necesitas trabajar en esta alta frecuencia de muestreo. Intente reducir la resolución de la señal o utilice un filtro de media móvil.



------------------------

Observe la homología persistente 0d para encontrar una buena estrategia, donde el parámetro que puede optimizar sea la persistencia máxima. Una buena publicación de blog aquí explica los conceptos básicos.

Pero, en resumen, la idea es imaginar que su gráfico se llena con agua y luego drena el agua lentamente. Cada vez que una parte del gráfico sale del agua, nace una nueva isla. Cuando dos islas están una al lado de la otra, se fusionan, lo que hace que las más jóvenes iisla (con el pico más bajo) para morir. Luego, cada punto de datos tiene una hora de nacimiento y una hora de muerte. Los picos más significativos son los de mayor persistencia, que es muerte - nacimiento.

Si el nivel del agua cae a un ritmo continuo, entonces la persistencia se define en términos de altura máxima. Otra posibilidad es dejar caer el agua instantáneamente de un punto a otro a medida que pasa el tiempo desde el paso t al paso t+1, en cuyo caso la persistencia se define en el ancho del pico en términos de muestras de señal.

Para usted, parece que al usar la definición original en términos de altura de pico > 70 se encuentran todos los picos que le interesan, aunque posiblemente sean demasiados, agrupados. Puede limitar esto eligiendo el primer pico de cada grupo o el pico más alto de cada grupo o haciendo boº enfoques y eligiendo solo picos que tengan gran persistencia en altura y persistencia en ancho.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare