Recordemos que las columnas de W puede considerarse como vectores "básicos" (o elementos de un diccionario, los componentes básicos de cualquier señal) y elementos en cada columna en Hdar los pesos correspondientes (que varían con el tiempo). Esto nos permite descomponer el espectrograma basado no solo en componentes de frecuencia sino también en información de inicio temporal; por lo tanto, hace más de lo que haría un simple filtro de paso de banda o filtro de peine.
La factorización matricial no negativa de un espectrograma no separará mágicamente un piano y un cantante que cantan en el mismo tono. Sin embargo, proporciona una aproximación útil en términos de una suma de vectores base ponderados que (con suerte) se pueden dividir en contribuciones de diferentes fuentes porque es poco probable que cada fuente ocupe exactamente el mismo intervalo de frecuencia exactamente en el mismo instante de tiempo.
Más concretamente, dejemos V ser METRO× N, W ser METRO× K y H ser K× N. Entonces tenemosMETRO contenedores de frecuencia, norte muestras de tiempo y KComponentes descompuestos. Siwyo son las columnas de W y hyo son las filas de H podemos escribir:
V ≈∑i = 1KwyohTyo.
Si sabemos que solo hay dos fuentes en la grabación (piano y cantante), podemos intentar dividir sus contribuciones eligiendo subconjuntos de las columnas de
W y el subconjunto correspondiente de las filas de
H. Así que si
S⊂ { 1 , ... , K} entonces la parte aportada por el piano se puede denotar por:
Vpiano=∑i ∈ SwyohTyo
y la parte aportada por el cantante es:
Vcantante=∑i ∈ { 1 , ... , K} ∖ SwyohTyo
En realidad, es probable que terminemos con una descomposición que nunca logre esta separación exactamente. Es decir, habráwyoLos que tienen contribuciones tanto del cantante como del piano hacen que sea difícil separarlos.
Aquí hay un cuaderno de Python que muestra este procedimiento para una mezcla de batería y guitarra: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (O si eso no funciona, aquí: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Tenga en cuenta que el algoritmo NMF solo genera una descomposición. No puede seleccionar subconjuntos de{wyo}correspondiente a cada fuente. En el ejemplo de Python, hay un paso manual para descubrir quéwyoSuena más como el tambor de guitarra v / s. Tal vez se pueda automatizar este paso observando que el tamborwyo los vectores tienen más cosas en frecuencias más bajas.
Analizar cada columna (cuadro) del espectrograma utilizando un banco de filtros de paso de banda es otra forma de descomponer el espectrograma. Sin embargo, tenga en cuenta que la descomposición generada por NMF es de bajo rango, es decir, parsimoniosa. En el ejemplo de Python, fue mucho más fácil seleccionar manualmente subconjuntos de 16 columnas deWcorrespondiente a las dos fuentes. Con un banco de filtros de paso de banda habríamos tenido que girar muchos más mandos (# filtros, ubicaciones de bandas de paso para cada cuadro) y el número de combinaciones de parámetros puede crecer muy rápidamente.
Referencias
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html