Pregunta

Estoy tratando de usar ANN para la detección de notas musicales. La red es una MLP simple de dos capas, cuyas entradas son básicamente un DFT (promedio y distribuido logarítmicamente), y 12 salidas corresponden a las 12 notas de una octava particular.

La red está entrenada con varias muestras de esas 12 notas tocadas por algún instrumento (una nota a la vez) y algunas muestras de "silencio".

Los resultados son realmente buenos. La red puede detectar esas notas tocadas por diferentes instrumentos antes de la precisión, es relativamente amune al ruido, e incluso no pierde su sanety por completo cuando se reproduce una canción.

El objetivo, sin embargo, es poder detectar el sonido polifónico. Para que cuando se jueguen dos o más notas juntas, las dos neuronas correspondientes dispararán. Lo sorprendente es que la red ya lo hace hasta cierto punto (solo se entrenando solo con muestras monofónicas), por menos consistente y menos precisa que para las notas monofónicas. Mi pregunta es ¿cómo puedo mejorar su capacidad para reconocer el sonido poliflico?

El problema es que no entiendo verdaderamente por qué ya funciona. Las diferentes notas (o sus DFT) son básicamente puntos diferentes en el espacio para los cuales la red está entrenada. Entonces veo por qué reconoce los sonidos similares (puntos cercanos), pero no cómo "concluye" el resultado para una combinación de notas (que forman un punto distante de cada uno de los ejemplos de entrenamiento). No se espera que la misma forma en que se entrene (0,0) (0,1) (1,0) = (0), "concluya" que (1,1) = (1).

La fuerza bruta a esto es entrenar la red con tantas muestras polifónicas como sea posible. Sin embargo, dado que la red parece de alguna manera comprender vagamente la idea de las muestras monofónicas, probablemente haya algo más fundamental aquí.

¿Algún consejo? (Perdón por la longitud, por cierto :).

¿Fue útil?

Solución

La razón por la que funciona ya es probablemente simplemente que no lo entrenaste para elegir una y solo una salida (al menos supongo que no lo hiciste). En el caso simple cuando la salida es solo un producto de puntos de la entrada y los pesos, los pesos se convertirían en filtros coincidentes para el tono correspondiente. Dado que todo es lineal, múltiples salidas se activarían simultáneamente si múltiples filtros coincidentes vieran buenos coincidencias (como es el caso de las notas polifónicas). Dado que su red probablemente incluye no linealidades, la imagen es un poco más compleja, pero la idea es probablemente la misma.

Con respecto a las formas de mejorarlo, el entrenamiento con muestras polifónicas es sin duda una posibilidad. Otra posibilidad es cambiar a un filtro lineal. El DFT de un sonido polifónico es básicamente la suma de los DFT de cada sonido individual. Desea que una combinación lineal de entradas se convierta en una combinación lineal correspondiente de salidas, por lo que un filtro lineal es apropiado.

Por cierto, ¿por qué usa una red neuronal para esto en primer lugar? Parece que solo mirar el DFT y, por ejemplo, tomar la frecuencia máxima le daría mejores resultados más fácilmente.

Otros consejos

Anssi Klapuri es un investigador de audio respetado que ha publicado un método para realizar la detección de tono en las grabaciones polifónicas utilizando redes neuronales.

Es posible que desee comparar el método de Klapuri con el suyo. Se describe completamente en la tesis de su maestro, Métodos de procesamiento de señal para la transcripción automática de la música. Puede encontrar sus muchos documentos en línea o comprar su libro que explique su algoritmo y resultados de pruebas. La tesis de su maestro está vinculada a continuación.

https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf

La detección de tono en las grabaciones polifónicas es un tema muy difícil y contiene muchas controversias: prepárese para leer mucho. El siguiente enlace contiene otro enfoque para la detección de tono en las grabaciones polifónicas que desarrollé para una aplicación gratuita llamada Jugador. Mi código fuente de C ++ está disponible en github.com y se hace referencia en el enlace a continuación. Una versión ejecutable gratuita de Jugador También está disponible en la web y se ejecuta en Windows.

Detección de tono en tiempo real

Experimenté con la evolución de un CTRNN (red neuronal recurrente de tiempo continuo) en la detección de la diferencia entre 2 ondas sinusoidales. Tuve un éxito moderado, pero nunca tuve tiempo de seguir con un banco de estas neuronas (es decir, en bandas similares a los cocleares).

Un enfoque posible sería emplear Programación genética (GP), para generar fragmentos cortos de código que detectan el tono. De esta manera, podría generar una regla sobre cómo funciona la detección de tono, que con suerte sería legible por humanos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top