Denken Sie daran, dass die Spalten von als "Basis" -Vektoren (oder Elemente eines Wörterbuchs - die Bausteine eines beliebigen Signals) betrachtet werden können und Elemente in jeder Spalte in die entsprechenden Gewichte angeben (das im Laufe der Zeit variieren). Dies ermöglicht es uns, das Spektrogramm nicht nur anhand von Frequenzkomponenten, sondern auch anhand von Informationen zum zeitlichen Beginn zu zerlegen. Es ist also mehr als ein einfaches Bandpassfilter oder Kammfilter.H.W.H.
Die nicht negative Matrixfaktorisierung eines Spektrogramms trennt ein Klavier und einen Sänger, die in derselben Tonhöhe singen, nicht auf magische Weise. Es gibt jedoch eine nützliche Annäherung in Bezug auf eine Summe gewichteter Basisvektoren, die (hoffentlich) in Beiträge von verschiedenen Quellen aufgeteilt werden können, da es unwahrscheinlich ist, dass jede Quelle genau zum gleichen Zeitpunkt genau das gleiche Frequenzfach belegt.
Genauer gesagt, lassen seine , seine und seine . Wir haben also Frequenzbereiche, Zeitabtastwerte und zerlegte Komponenten. Wenn die Spalten von und die Zeilen von , können wir schreiben:
M × N W M × K H K × N M N K w i W.V.M.× N.W.M.× K.HK×NMNKwiWH V ≈ K ∑ i = 1 w i h T i . W H S⊂{1,…,K} V Klavier = ∑ i ∈ S w i h T i V Sänger =hiH
V≈∑i=1KwihTi.
Wenn wir wissen, dass die Aufnahme nur zwei Quellen enthält (Klavier und Sänger), können wir versuchen, ihre Beiträge aufzuteilen, indem wir Teilmengen der Spalten von und die entsprechende Teilmenge der Zeilen von auswählen . Wenn also der vom Klavier beigesteuerte Teil wie folgt bezeichnet werden:
und der Teil, den der Sänger beigesteuert hat, ist:
WHS⊂{1,…,K}Vpiano=∑i∈SwihTi
Vsinger=∑i∈{1,…,K}∖SwihTi
In Wirklichkeit werden wir wahrscheinlich eine Zersetzung haben, die diese Trennung nie genau erreicht. Das heißt, es wird 's geben, die Beiträge sowohl des Sängers als auch des Klaviers enthalten, was es schwierig macht, die beiden zu trennen.wi
Hier ist ein Python-Notizbuch, das dieses Verfahren für eine Mischung aus Schlagzeug und Gitarre zeigt: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (Oder wenn das nicht funktioniert, hier: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Beachten Sie, dass der NMF-Algorithmus nur eine Zerlegung generiert. Es können keine Teilmengen von , die jeder Quelle entsprechen. Im Python-Beispiel gibt es einen manuellen Schritt, um herauszufinden, welcher -Sound der Gitarre v / s-Trommel am ähnlichsten ist. Man kann diesen Schritt vielleicht automatisieren, indem man feststellt, dass die Vektoren der Trommel mehr Material in niedrigeren Frequenzen enthalten.w i w i{wi}wiwi
Die Analyse jeder Spalte (Rahmen) des Spektrogramms unter Verwendung einer Reihe von Bandpassfiltern ist eine weitere Möglichkeit, das Spektrogramm zu zerlegen. Es ist jedoch zu beachten, dass die durch NMF erzeugte Zersetzung einen niedrigen Rang hat, dh sparsam. Im Python-Beispiel war es viel einfacher, Teilmengen von 16 Spalten von , die den beiden Quellen entsprechen, manuell auszuwählen . Mit einer Reihe von Bandpassfiltern hätten wir viel mehr Regler drehen müssen (# Filter, Positionen der Durchlassbänder für jeden Frame), und die Anzahl der Parameterkombinationen kann sehr schnell zunehmen.W
Verweise:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html