Encuentra música similar usando espectros FFT

16

He estado experimentando algunas semanas para encontrar una manera de combinar / encontrar canciones similares en una biblioteca que contenga diferentes géneros de música.

Mi primer intento fue detectar características como Tempo o la cantidad de graves que hay en las canciones para formar grupos, pero no llegué lejos con este enfoque (detección de ritmos basada en cambios de volumen) ya que no es necesario contar alrededor del 20% de los ritmos de las canciones. siempre, a veces 1/2 o 1/3 de ellos y no pude implementar eso.

Después de algunas semanas de intentos fallidos, tuve una nueva idea que se describe más adelante en esta publicación. En pocas palabras, funciona tomando muestras de archivos de Spectrum, haciendo algo así como un "espectro promedio" de archivos para compararlos. La idea detrás era que, por ejemplo, Hardstyle tiene mucho más bajo que la música rock promedio, también verifiqué esto mirando algunos espectros en Audacity.

  • Archivo 1: Tome espectros FFT de archivo completo (2048 Tamaño de muestra atm, Amplitudes Log. Escalado)
  • Suma todas las matrices de espectro, toma promedios de cada contenedor
  • Haz lo mismo con otros archivos, almacena todos los resultados
  • Hacer una lista de las diferencias de valores FFT entre el archivo 1 y otros archivos
  • Hacer promedio de las diferencias entre el archivo 1 y el archivo X
  • Ordenar ascendente por estos promedios
  • Las canciones con el "valor de diferencia" más bajo se consideran similares.

¿Pueden algunos de ustedes que tienen buen conocimiento decirme si esta sería la forma correcta / buena de implementar mi Idea?

gfg
fuente
1
Si está tratando de detectar el tempo, puede intentar cuadrar la señal y luego tomar una transformación de Fourier. Las frecuencias del orden de 1 Hz no estarán presentes en un espectro FFT ordinario (no cuadrado), porque están filtradas. Una idea relacionada, utilizada para la detección de tono, se llama "cepstrum"; puedes averiguarlo buscando en Google. Para diferenciar el pop y el jazz de la música clásica, puede intentar detectar los sonidos de un kit de batería, que no están conectados. El vibrato debe ser detectable por máquina. Hay medidas de disonancia que pueden calcularse a máquina.
1
Tal vez debería pedirles a los moderadores que muevan esto a dsp.SE
Dilip Sarwate
Marqué mi pregunta con la solicitud de moverla a DSP of SE. ¿Quiere decir que podría detectar si hay un Drumkit Presente o No para clasificar la Entrada? ¿Puedes explicar cómo la señal cuadrada conduce a Tempo?
3
La música se graba y masteriza de tal manera que se maximiza su propagación espectral, especialmente en estos días. No creo que los espectros de longitud completa te den un buen criterio para clasificar la música.
Phonon
2
En lugar de espectros, debería mirar espectrogramas. Los espectros solo le muestran el contenido de frecuencia de toda la canción a la vez. Los espectrogramas muestran cómo el contenido de frecuencia cambia con el tiempo.
endolito el

Respuestas:

17

Cientos de investigadores han intentado una y otra vez lo que está tratando de hacer y hay mucho trabajo sobre esto. Consulte las actas de la conferencia ISMIR. Incluso si no está actualizado, lea la tesis de Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Para orientarte rápidamente en el camino correcto:

La música puede ser similar según muchas dimensiones: a) timbre / textura / género; b) patrón rítmico; c) melodía / progresión de acordes ... ¡y más! ¡De su mensaje no está claro lo que quiere medir!

  • Si está interesado en a), las características que tal vez desee considerar son MFCC (Coeficientes de Frecuencia de Cepstrum de Mel), ya que de alguna manera capturan la forma en que funciona la audición humana (deformación de frecuencia, escala logarítmica), ya que están relacionadas con la decoración (facilitando el modelado) , y dado que tienen menor dimensionalidad (13 coeficientes frente a 2048).
  • Si está interesado en b), mire una característica llamada "Patrones de fluctuación" (Pampalk, en breve autocorrelación de la señal en el rango de 0.1 .. 10 Hz en algunas bandas); o las características de "Penny" de Whitman (FFT del MFCC a lo largo del eje de tiempo).
  • Si estás interesado en c), mira los cromagramas. Comience con el código de cromagrama de Ellis (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) luego pase a la implementación de Mauch si necesita algo más robusto (http://isophonics.net/nnls-chroma )

Eso es por las características. Ahora tendrá que pensar en una mejor manera de comparar sus canciones una vez que se hayan representado como una secuencia de esas características. Calcular diferencias por pares entre secuencias no es muy inteligente, por ejemplo: ¡comparar una canción y el mismo desplazamiento de la canción con algo de silencio producirá una diferencia mientras sea exactamente la misma! Prefiere comparar la distribución de esas características; por ejemplo, calcule la desviación media / estándar de las características sobre la canción A y la desviación media / estándar de las características sobre la canción B y luego tome una distancia probabilística (KL, Bhattacharyya sobre esas).

Último punto, pero que importará más adelante: calcular la distancia entre una canción y el resto del corpus para encontrar las coincidencias más cercanas es bastante ineficiente. Cuando se trata de grandes colecciones, las técnicas como los árboles LSH o Ball permiten que las consultas de los vecinos más cercanos se realicen sin una comparación explícita con todo el corpus.

Por otro lado, la detección de tempo es un asunto completamente diferente. Si desea analizarlo, el mejor documento de rendimiento / accesibilidad sobre el tema es Ellis 'Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Es increíblemente simple pero está cerca de los algoritmos más modernos.

pichenettes
fuente
Gracias por su respuesta detallada, ya he oído hablar de MFCC varias veces en este contexto y parece razonable no utilizar resultados FFT desnudos. Parece bastante complejo de implementar con mi actual "estado de conocimiento" y entorno de desarrollo (C #, Resultados FFT de Bass Library) pero lo intentaré.
gfg