の列が W 「基本」ベクトル(またはディクショナリの要素-任意の信号のビルディングブロック)と考えることができ、各列の要素は H対応する重みを与える(それは時間とともに変化する)。これにより、周波数成分だけでなく時間的な開始情報にも基づいてスペクトログラムを分解できます。そのため、単純なバンドパスフィルターやくし型フィルターよりも多くのことができます。
スペクトログラムの非負の行列因数分解は、同じピッチで歌うピアノと歌手を魔法のように分離しません。ただし、(可能であれば)異なるソースからの寄与に分割できる重み付けされた基底ベクトルの合計に関して有用な近似を提供します。これは、各ソースがまったく同じ周波数ビンをまったく同じ瞬間に占める可能性が低いためです。
より具体的には、 V なる M× N、 W なる M× K そして H なる K× N。だから私たちはM 周波数ビン、 N 時間サンプルと K分解されたコンポーネント。もしw私 の列です W そして h私 の行です H 我々は書ける:
V ≈Σi = 1Kw私hT私。
レコーディングに2つのソース(ピアノと歌手)しかないことがわかっている場合は、
W および対応する行のサブセット
H。だから
S⊂ { 1 、… 、K} その場合、ピアノが寄与する部分は次のように表すことができます。
Vピアノ=ΣI ∈ Sw私hT私
そして、歌手によって貢献された部分は:
V歌手=ΣI ∈ { 1 、... 、K} ∖ Sw私hT私
実際には、この分離を正確に達成できない分解に終わる可能性があります。つまり、w私は、歌手とピアノの両方からの貢献があり、2つを分離することが困難です。
:ここではドラムやギターの混合物について、この手順を示すPythonのノートPCだhttp://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98fそれはここでは、動作しない場合(または:https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f)
NMFアルゴリズムは分解のみを生成することに注意してください。のサブセットを選択できません{w私}各ソースに対応。Pythonの例では、手動でステップを見つけ、w私のギターv / sドラムのような音です。おそらくドラムのw私 ベクトルは低周波数でより多くのものを持っています。
バンドパスフィルターのバンクを使用してスペクトログラムの各列(フレーム)を分析することは、スペクトログラムを分解するもう1つの方法です。ただし、NMFによって生成される分解は低ランク、つまり節約的であることに注意してください。Pythonの例では、16列のサブセットを手動で選択する方がはるかに簡単でした。W2つのソースに対応します。バンドパスフィルターのバンクを使用すると、さらに多くのノブ(#フィルター、各フレームのパスバンドの位置)を回さなければならず、パラメーターの組み合わせの数は非常に急速に増える可能性があります。
参照:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicinformationretrieval.com/nmf.html