Ricordiamo che le colonne di possono essere pensate come vettori "base" (o elementi di un dizionario - i mattoni di qualsiasi segnale) e gli elementi in ogni colonna in danno i pesi corrispondenti (che variare nel tempo). Questo ci consente di scomporre lo spettrogramma in base non solo alle componenti di frequenza ma anche alle informazioni di insorgenza temporale; quindi fa più di quello che farebbe un semplice filtro passa-banda o un filtro a pettine.WH
La fattorizzazione a matrice non negativa di uno spettrogramma non separerà magicamente un piano e un cantante che canta nella stessa tonalità. Tuttavia fornisce un'utile approssimazione in termini di una somma di vettori di base ponderati che (si spera) possono essere suddivisi in contributi da fonti diverse perché è improbabile che ciascuna sorgente occupi esattamente lo stesso bin di frequenza esattamente nello stesso istante.
Più concretamente, lasciate essere , essere e essere . Quindi abbiamo bin di frequenza , campioni di tempo e componenti decompostiSe sono le colonne di e sono le righe di possiamo scrivere:
VM× NWM× KHK× NMNKwioWhioH
V ≈Σi = 1KwiohTio.
Se sappiamo che ci sono solo due fonti nella registrazione (piano e cantante) possiamo provare a dividere i loro contributi scegliendo sottoinsiemi delle colonne di e corrispondenti sottogruppi delle righe di . Quindi, se la parte fornita dal piano può essere indicata da:
e la parte fornita dal cantante è:
WHS⊂ { 1 , ... , K}Vpianoforte=Σio ∈ SwiohTio
Vcantante=Σio ∈ { 1 , ... , K} ∖ SwiohTio
In realtà, probabilmente finiremo con una decomposizione che non raggiunge mai esattamente questa separazione. Cioè, ci saranno che avranno contributi sia dal cantante che dal piano rendendo difficile separare i due.wio
Ecco un notebook Python che mostra questa procedura per un mix di batteria e chitarra: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (O se non funziona, qui: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Si noti che l'algoritmo NMF genera solo una decomposizione. Non può selezionare sottoinsiemi di corrispondenti a ciascuna sorgente. Nell'esempio di Python, c'è un passaggio manuale per capire quale dei suoni di assomigli di più al tamburo della chitarra. Si può forse automatizzare questo passaggio osservando che i vettori del tamburo hanno più roba a frequenze più basse.{wio}wiowio
Analizzare ogni colonna (frame) dello spettrogramma usando un banco di filtri passa-banda è un altro modo di decomporre lo spettrogramma. Tuttavia, si noti che la decomposizione generata da NMF è di basso rango cioè parsimoniosa. Nell'esempio di Python, era molto più semplice selezionare manualmente sottoinsiemi di 16 colonne di corrispondenti alle due fonti. Con un banco di filtri passa-banda avremmo dovuto ruotare molte più manopole (# filtri, posizioni delle bande passanti per ciascun fotogramma) e il numero di combinazioni di parametri può aumentare molto rapidamente.W
Riferimenti:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html