Rappelons que les colonnes de W peuvent être considérés comme des vecteurs "de base" (ou des éléments d'un dictionnaire - les éléments constitutifs de tout signal) et des éléments dans chaque colonne de Hdonner les poids correspondants (qui varient dans le temps). Cela nous permet de décomposer le spectrogramme sur la base non seulement des composantes de fréquence mais aussi des informations de début temporel; il fait donc plus que ce qu'un simple filtre passe-bande ou filtre en peigne ferait.
La factorisation matricielle non négative d'un spectrogramme ne séparera pas comme par magie un piano et un chanteur chantant dans la même hauteur. Cependant, il donne une approximation utile en termes de somme de vecteurs de base pondérés qui (espérons-le) peuvent être divisés en contributions de différentes sources car il est peu probable que chaque source occupe exactement la même tranche de fréquence au même instant.
Plus concrètement, laissez V être M× N, W être M× K et H être K× N. Donc nous avonsM bacs de fréquence, N échantillons de temps et Kcomposants décomposés. Siwje sont les colonnes de W et hje sont les rangées de H nous pouvons écrire:
V ≈∑i = 1KwjehTje.
Si nous savons qu'il n'y a que deux sources dans l'enregistrement (piano et chanteur), nous pouvons essayer de répartir leurs contributions en choisissant des sous-ensembles des colonnes de
W et sous-ensemble correspondant des rangées de
H. Donc si
S⊂ { 1 , … , K} alors la partie apportée par le piano peut être désignée par:
Vpiano=∑i ∈ SwjehTje
et la contribution du chanteur est:
Vchanteur=∑i ∈ { 1 , … , K} ∖ SwjehTje
En réalité, nous finirons probablement par une décomposition qui n'atteindra jamais exactement cette séparation. Autrement dit, il y aurawjequi ont des contributions à la fois du chanteur et du piano, ce qui rend difficile la séparation des deux.
Voici un cahier Python montrant cette procédure pour un mélange de batterie et de guitare: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (ou si cela ne fonctionne pas, ici: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Notez que l'algorithme NMF ne génère qu'une décomposition. Il ne peut pas sélectionner de sous-ensembles de{wje}correspondant à chaque source. Dans l'exemple Python, il y a une étape manuelle pour déterminer quelswjeLe son ressemble le plus au tambour de guitare v / s. On peut peut-être automatiser cette étape en notant que le tambourwje les vecteurs ont plus de choses dans les basses fréquences.
L'analyse de chaque colonne (trame) du spectrogramme à l'aide d'une banque de filtres passe-bande est une autre façon de décomposer le spectrogramme. Cependant, notez que la décomposition générée par le NMF est de faible rang, c'est-à-dire parcimonieuse. Dans l'exemple Python, il était beaucoup plus facile de sélectionner manuellement des sous-ensembles de 16 colonnes deWcorrespondant aux deux sources. Avec une banque de filtres passe-bande, nous aurions dû tourner beaucoup plus de boutons (# filtres, emplacements des bandes passantes pour chaque trame) et le nombre de combinaisons de paramètres peut augmenter très rapidement.
Références:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html