2009-03-18 12 views

Respuesta

7

Realice un Fourier transform y encuentre 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.

cuestión de forma que pueda ayudar: Bpm audio detection Library

Además, aquí es una de las varias preguntas "pico" en la búsqueda del SO: Peak detection of measured signal


Editar: No es que el procesamiento de audio. Es sólo una conjetura basada en el hecho de que usted está buscando una propiedad de dominio de la frecuencia del archivo ...


otra edición: Vale la pena señalar que los formatos de compresión con pérdida como MP3, tienda de dominio de Fourier datos 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.

+1

sin embargo, mp3 logra la compresión es cortándoles las frecuencias fuera del oído humano. Fourier puede no ser la herramienta adecuada aquí. – cobbal

+0

AH. Buen punto, eso. – dmckee

+1

El MP3 no "corta" frecuencias fuera del oído humano y realiza transformaciones de coseno (relacionadas con Fourier) individualmente en ventanas con cerca de 1 ms de ancho cada una. Probé con la primera sugerencia de dmckee en las ventanas largas de 10 s y veo lo que sale. – TrayMan

42

Esto es difícil de explicar en una sola publicación de StackOverflow. 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 comb filters y otros métodos estadísticos/de forma de onda. Para una explicación detallada que incluye muestras de código, marque this GameDev article.

+9

FYI, sé que es una publicación anterior, pero el artículo del juego dev da un 404 – avanderw

+8

Lo tendré en cuenta, lo siento, no lo pensé y estaba tratando de ser más informativo que criticar. – avanderw

+0

5 años después, el artículo de GameDev no incluye 404 ツ (Además, a menudo puede usar webarchive.org, según http://web.archive.org/web/20120525085210/http://archive.gamedev.net/archive/reference /programming/features/beatdetection/index.html) – earcam

0

Aquí está un free program analizará y escribirá BPM a la etiqueta ID3V2. Idea de lo bien

+0

ahora es 2015, ¿hay algo nuevo en esto? cualquier aplicación de código abierto/libs que lo hacen mejor? – user63898

9

Si usted puede manejar para interactuar con el código Python en su proyecto, Echo Nest Remix API es una API bastante resbaladiza para Python:

Hay un método analysis.tempo que le dará el BPM. Se puede hacer mucho más que la simple BPM, como se puede ver a partir de los documentos de la API o this tutorial

-2

Me imagino que esto será más fácil 4-4 música de baile, ya que debe ser una sola baja golpe de frecuencia aproximadamente dos veces por segundo.

22

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 este es un campo bastante diferente a detección de inicio, que es la detección de los sonidos físicos, y se realiza de una manera diferente.

Puede probar la biblioteca Aubio, que es una biblioteca C simple que ofrece herramientas de extracción de inicio y de latido.

También está el Echonest API 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.

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

+0

¿Has decidido cuál utilizar? –

2

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.

2

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.

2

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 una de ellas, tiene una buena reputación y está escrita en C con un contenedor C++ para que pueda integrarse fácilmente con una aplicación cocoa (todo el material de audio en los marcos de Apple también está escrito en C/C++) .

9

La línea general de trabajo está interesado en que se llama información musical RECUPERACIÓN

Hay muchos algoritmos diferentes que hacen esto, pero todos ellos se centran fundamentalmente en torno a la detección de comienzo.

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.

Existen varios algoritmos que puede usar una vez que haya obtenido la localización temporal del tiempo. 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.

Éstos son algunos papeles que le dirija 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í es una extensión de lo que algunas personas están discutiendo:

Alguien mencionó mirando en la aplicación de un algoritmo de aprendizaje automático: básicamente, recopile un conjunto de características de las funciones de detección de inicio (mencionadas anteriormente) y combínelos con la señal en bruto en una red neuronal/regresión logística y descubra qué hace latir un latido.

mirada en el doctor Andrew Ng, que tiene clases de aprendizaje automático libre de la Universidad de Stanford en línea (no las video conferencias de largo aliento, no es en realidad un curso a distancia en línea)

30

Las palabras clave para buscar son "Beat de detección" , "Beat Tracking" y "Music Information Retrieval". Hay mucha información aquí: http://www.music-ir.org/

Hay un (tal vez) concurso anual llamado MIREX donde se prueban diferentes algoritmos en su rendimiento de detección de tiempos.

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

que debe 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. FFT a corto plazo la música para obtener un sonograma.
  2. Suma aumenta en magnitud sobre todas las frecuencias para cada paso de tiempo (ignore 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. Inicializa 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 una puntuación de acuerdo con la precisión de 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:

  • El pico de detección es más bien ad hoc y sensible a los parámetros de umbral y otras cosas.
  • Algunas canciones no tienen un inicio obvio en los tiempos. Obviamente no funcionará con esos.
  • Difícil saber cómo resolver el problema de 60bpm-vs-120bpm, ¡especialmente con el seguimiento en tiempo real!
  • Tira un lote 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 es 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 de solo 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.

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

Editar: Found it!

Aquí hay algunos enlaces que debería empezar:

http://marsyasweb.appspot.com/

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

+0

Plugin de Vamp difícil de construir para el objetivo OSX. No probem con dependencias, pero con los tipos typedefs para darwin. Pruebe make -f build/Makefile.osx después de cambiar el sdk a .../Developer/SDKs/iPhoneOS7.0.sdk para ver a qué me refiero. – loretoparisi

Cuestiones relacionadas