Lembre-se de que as colunas de W pode ser visto como vetores "básicos" (ou elementos de um dicionário - os blocos de construção de qualquer sinal) e elementos em cada coluna Hforneça os pesos correspondentes (que variam com o tempo). Isso nos permite decompor o espectrograma com base não apenas em componentes de frequência, mas também em informações de início temporal; portanto, faz mais do que o que um simples filtro passa-banda ou filtro pente faria.
A fatoração matricial não negativa de um espectrograma não separa magicamente um piano e um cantor cantando no mesmo tom. No entanto, fornece uma aproximação útil em termos de uma soma de vetores de base ponderada que (esperançosamente) podem ser divididos em contribuições de diferentes fontes, porque é improvável que cada fonte ocupe exatamente a mesma faixa de frequência exatamente no mesmo instante.
Mais concretamente, vamos V estar M×N, W estar M×K e H estar K×N. Então nós temosM caixas de frequência, N amostras de tempo e Kcomponentes decompostos. E sewi são as colunas de W e hi são as linhas de H nós podemos escrever:
V≈∑i=1KwihTi.
Se sabemos que existem apenas duas fontes na gravação (piano e cantor), podemos tentar dividir suas contribuições escolhendo subconjuntos das colunas de
W e subconjunto correspondente das linhas de
H. Então se
S⊂{1,…,K} então a parte contribuída pelo piano pode ser indicada por:
Vpiano=∑i∈SwihTi
e a parte contribuída pelo cantor é:
Vsinger=∑i∈{1,…,K}∖SwihTi
Na realidade, provavelmente acabaremos com uma decomposição que nunca atinge exatamente essa separação. Ou seja, haveráwique têm contribuições tanto do cantor quanto do piano, dificultando a separação dos dois.
Aqui está um caderno Python mostrando este procedimento para uma mistura de bateria e guitarra: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (ou, se isso não funcionar, aqui: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Observe que o algoritmo NMF gera apenas uma decomposição. Não pode selecionar subconjuntos de{wi}correspondente a cada fonte. No exemplo do Python, há uma etapa manual de descobrir quaiswiO som é mais parecido com a guitarra v / s drum. Pode-se talvez automatizar essa etapa observando que o tamborwi vetores têm mais coisas em frequências mais baixas.
Analisar cada coluna (quadro) do espectrograma usando um banco de filtros passa-banda é outra maneira de decompor o espectrograma. No entanto, observe que a decomposição gerada pelo NMF é baixa, ou seja, parcimoniosa. No exemplo do Python, era muito mais fácil selecionar manualmente subconjuntos de 16 colunas deWcorrespondente às duas fontes. Com um banco de filtros passa-banda, teríamos que girar muito mais botões (# filtros, localizações das faixas-passe para cada quadro) e o número de combinações de parâmetros pode crescer muito rapidamente.
Referências:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html