una tiempo studio sacar saber pulso online musica medidor los con como cancion audition algorithm audio signal-processing beat-detection

algorithm - tiempo - Cómo detectar el BPM de una canción en php



medidor de bpm musica (12)

¿Cómo se puede determinar el tempo / BPM de una canción mediante programación? ¿Qué algoritmos se usan comúnmente y qué consideraciones se deben tomar?


Aquí hay un programa gratuito que analizará y escribirá BPM en la etiqueta ID3V2. No tengo idea de lo bueno


Esto es difícil de explicar en una sola publicación de . En general, los algoritmos de detección de tiempos más simples funcionan al ubicar los picos en la energía del sonido, que es fácil de detectar. Los métodos más sofisticados usan filtros de peine y otros métodos estadísticos / de forma de onda. Para obtener una explicación detallada que incluya muestras de código, consulte este artículo de GameDev .


Existen varios métodos para obtener el BPM, pero el que encuentro más efectivo es el "espectro de pulsaciones" (descrito here ). Este algoritmo calcula una matriz de similitud comparando cada muestra corta de la música con las demás. Una vez que se ha calculado la matriz de similitud, es posible obtener una similitud promedio entre cada par de muestras {S (T); S (T + 1)} para cada intervalo de tiempo T: este es el espectro de tiempos. El primer pico alto en el espectro de latido es la mayor parte del tiempo la duración del latido. La mejor parte es que también puedes hacer cosas como estructura musical o análisis de ritmo.



La extracción de latidos implica la identificación de estructuras métricas cognitivas en la música. Muy a menudo, estos no corresponden a la energía del sonido físico; por ejemplo, en la mayoría de la música hay un nivel de síncopa, lo que significa que el ritmo de "pisada" que percibimos no se corresponde con la presencia de un sonido físico. Esto significa que se trata de un campo bastante diferente a la detección de inicio , que es la detección de los sonidos físicos, y se realiza de una manera diferente.

Podrías probar la biblioteca de Aubio , que es una biblioteca simple de C que ofrece herramientas de extracción tanto de inicio como de latido.

También existe la API Echonest en línea, aunque esto implica cargar un MP3 a un sitio web y recuperar XML, por lo que podría no ser tan adecuado.

EDITAR: Me encontré con esta última noche, una biblioteca C / C ++ de aspecto muy prometedor, aunque no la he usado yo misma. Complementos de Vamp


Las palabras clave para buscar son "Detección de ritmo", "Seguimiento de ritmo" y "Recuperación de información de música". Hay mucha información aquí: http://www.music-ir.org/

Hay un (quizás) concurso anual llamado MIREX en el que se prueban diferentes algoritmos en su rendimiento de detección de tiempos.

http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/

Eso debería darle una lista de algoritmos para probar.

Un algoritmo clásico es Beatroot (google it), que es agradable y fácil de entender. Funciona así:

  1. Corto tiempo FFT la música para obtener un sonograma.
  2. Suma los aumentos de magnitud en todas las frecuencias para cada paso de tiempo (ignora las disminuciones). Esto le proporciona una función 1D variable en el tiempo llamada "flujo espectral".
  3. Encuentra los picos usando cualquier algoritmo de detección de picos antiguo. Estos se llaman "inicios" y corresponden al inicio de los sonidos en la música (inicio de notas, éxitos de batería, etc.).
  4. Construya un histograma de intervalos entre sesiones (IOI). Esto se puede usar para encontrar tempos probables.
  5. Inicialice un conjunto de "agentes" o "hipótesis" para el resultado del seguimiento de tiempos. Alimente a estos agentes los inicios uno a la vez en orden. Cada agente rastrea la lista de inicios que también son tiempos, y la estimación de tempo actual. Los agentes pueden aceptar los inicios, si encajan estrechamente con su último ritmo y tempo seguido, ignorarlos si son muy diferentes, o generar un nuevo agente si están en el medio. No todos los tiempos requieren un comienzo: los agentes pueden interpolar.
  6. A cada agente se le asigna un puntaje según cuán clara sea su hipótesis: si todos sus tiempos de compás son fuertes, obtiene una puntuación más alta. Si todos son regulares, obtiene una puntuación más alta.
  7. El agente que puntúa más alto es la respuesta.

Desventajas de este algoritmo en mi experiencia:

  • La detección de picos es más bien ad-hoc y sensible a los parámetros de umbral y otras cosas.
  • Algo de música no tiene inicios obvios en los beats. Obviamente no funcionará con esos.
  • Es difícil saber cómo resolver el problema de 60bpm-vs-120bpm, ¡especialmente con el seguimiento en vivo!
  • Tira una gran cantidad de información usando solo un flujo espectral 1D. Creo que puedes hacer mucho mejor teniendo unos pocos flujos espectrales de banda limitada (y tal vez uno de banda ancha para los tambores).

Here hay una demostración de una versión en vivo de este algoritmo, que muestra el flujo espectral (línea negra en la parte inferior) y los inicios (círculos verdes). Vale la pena considerar el hecho de que el ritmo se extrae solo de los círculos verdes. He reproducido los inicios solo como clics, y para ser sincero, no creo poder escuchar el ritmo de ellos, por lo que de alguna manera este algoritmo es mejor que las personas en la detección de latidos. Creo que la reducción a una señal de tan baja dimensión es su paso débil.

Curiosamente encontré un sitio muy bueno con muchos algoritmos y códigos para la detección de latidos hace unos años. Sin embargo, no lo pude volver a encontrar.

Editar: ¡Lo encontré!

Aquí hay algunos excelentes enlaces que deberían ayudarlo a comenzar:

http://marsyasweb.appspot.com/

http://www.vamp-plugins.org/download.html


Me imagino que esto será más fácil en 4-4 música de baile, ya que debería haber un solo golpe de baja frecuencia de aproximadamente dos veces por segundo.


Otros ya han descrito algunos métodos de detección de latidos. Quiero agregar que hay algunas bibliotecas disponibles que proporcionan técnicas y algoritmos para este tipo de tareas.

Aubio es uno de ellos, tiene una buena reputación y está escrito en C con un contenedor C ++ para que pueda integrarlo fácilmente con una aplicación de cacao (todo el material de audio en los marcos de Apple también está escrito en C / C ++).


Para volver a publicar mi respuesta: la forma más fácil de hacerlo es hacer que el usuario toque un botón en ritmo con el ritmo y cuente el número de golpes divididos por el tiempo.


Realiza una transformada de Fourier y encuentra picos en el espectro de potencia. Está buscando picos por debajo del límite de 20 Hz para el oído humano. Supongo que típicamente en el rango de 0.1-5ish Hz es generoso.

ASI pregunta que podría ayudar: Biblioteca de detección de audio Bpm

Además, esta es una de varias preguntas de "búsqueda de picos" en SO: detección máxima de señal medida

Editar: No es que yo haga el procesamiento de audio. Es solo una suposición basada en el hecho de que estás buscando una propiedad de dominio de frecuencia del archivo ...

otra edición: vale la pena señalar que los formatos de compresión con pérdida como mp3 almacenan datos de dominio de Fourier en lugar de datos de dominio de tiempo en primer lugar. Con un poco de astucia, puede ahorrarse algunos cálculos pesados ​​... pero vea el comentario reflexivo de cobbal.


Si puede gestionar la interfaz con el código python en su proyecto, la API de Echo Nest Remix es una API bastante hábil para Python:

Hay un método analysis.tempo que te dará el BPM. Puede hacer mucho más que simples BPM, como se puede ver en los documentos API o en this tutorial.


El área general de investigación que le interesa se llama MUSIC INFORMATION RETRIEVAL

Hay muchos algoritmos diferentes que hacen esto, pero todos se centran fundamentalmente en la DETECCIÓN DE ONSET.

La detección de inicio mide el inicio de un evento, el evento en este caso es una nota que se está reproduciendo. Puede buscar cambios en la transformada de Fourier ponderada (contenido de alta frecuencia) puede buscar grandes cambios en el contenido espectral. (Diferencia espectral). (hay un par de documentos que le recomiendo que busque más abajo). Una vez que aplica un algoritmo de detección de inicio, elige dónde están los latidos mediante el umbral.

Hay varios algoritmos que puede usar una vez que haya obtenido esa localización de tiempo del ritmo. Puedes convertirlo en un tren de pulsos (crea una señal que sea cero para todo el tiempo y 1 solo cuando ocurra tu ritmo) luego aplica una FFT a eso y BAM ahora tienes una frecuencia de inicios en el pico más grande.

Aquí hay algunos documentos que lo guiarán en la dirección correcta:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

Aquí hay una extensión de lo que algunas personas están discutiendo:

Alguien mencionó observar la aplicación de un algoritmo de aprendizaje automático: básicamente recopilar una serie de características de las funciones de detección de inicio (mencionadas anteriormente) y combinarlas con la señal en bruto en una red neuronal / regresión logística y aprender qué es lo que hace latir un latido.

mira al Dr. Andrew Ng, tiene conferencias gratuitas de aprendizaje automático de la Universidad de Stanford en línea (no las conferencias de video prolongadas, en realidad hay un curso a distancia en línea)