2016-10-22 17 views
0

私はMFCCを理解しています。Librosaメルフィルタバンク減少三角形

私がメルフィルタバンクを読んだのは、幅が広くピークが同じ場所にある一連の三角形である必要があります。この...

http://imgur.com/UCh5OjK

のようなしかし、私は私が手librosaを使用して、メルフィルタバンクを計算する際に...

http://imgur.com/ps3yizk

はコード:

mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr/2) 

plt.plot(mel_basis) 

答えて

0

私は今少しより多くの情報だと与えられた答えは完全に正確でないような気がしますので、私は、私は自分の質問に答えるべきだと思います。

librosa.filters.melは、形状(n_mels、n_fft/2 +1)の行列を返します。これは、行列の各行がメルであることを意味します。列はメルフィルタバンクの各周波数の重みです。周波数はn_fftまでのサイクル数であり、エイリアシング(ナイキスト定理)のためにそれらの半分を捨てます。

これは、正しくmelsをプロットするためには、行列を転置する必要があることを意味します。私たちが効果的にN個の異なるプロットを望むとき、Nはmelsの数です。

plt.plot(mel.T)

これは、次の画像を与える:メルフィルタバンクのこのセットが期待されているものはまだないことを enter image description here

注意を。これは、Librosaが正規化されたバージョンのメルフィルタバンクを使用しているためです。これは、各melsが従来の等高1ではなく1の面積を持つことを意味します。librosaから返された行列は、

mels /= np.max(mels, axis=-1)[:, None]

そしてプロットは、次のようになります:フィルタバンクによってenter image description here

0

あなたがしています周波数ベクトルが存在しない場合、各フィルタはnftt/2 + 1サンプルを有するので、メル基底は、librosaのn_mels x(nfft/2 +1)の行列です。

MFCCを計算するには、フレーム化された信号のパワースペクトルを後でフィルタバンクで乗算する必要があります。

import numpy.matlib 

sr = 22050 
n_fft = 512 
n = 10 
mel_basis = librosa.filters.mel(sr=sr, n_fft=n_fft, n_mels=n,fmin=0, fmax=sr/2) 
f = np.linspace(0,sr/2,(n_fft/2)+1) 
f_all = np.matlib.repmat(f, n,1) 
plt.plot(f_all,mel_basis) 
plt.show() 

Librosa Mfcc Filter bank

あなたが別のプロットオプションを希望する場合のためのループである可能性があります。

for i in range(n): 
    plt.plot(f,mel_basis[i]) 
    plt.show() 

Mfcc librosa