我對MFCC的理解有點困惑。Librosa mel濾鏡組減少三角形
從我讀過的梅爾過濾器庫應該是一系列的三角形變得更寬,他們的峯位於相同的地方。像這樣...
然而,當我使用計算我librosa讓梅爾濾波器組...
代碼:
mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr/2)
plt.plot(mel_basis)
我對MFCC的理解有點困惑。Librosa mel濾鏡組減少三角形
從我讀過的梅爾過濾器庫應該是一系列的三角形變得更寬,他們的峯位於相同的地方。像這樣...
然而,當我使用計算我librosa讓梅爾濾波器組...
代碼:
mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr/2)
plt.plot(mel_basis)
我有點現在更明智,我覺得給出的答案是不完全正確的,所以我想我應該回答我的問題。
librosa.filters.mel返回形狀爲(n_mels,n_fft/2 +1)的矩陣。這意味着矩陣中的每一行都是一個mel。這些列是梅爾濾波器組的每個頻率的權重。頻率以循環次數n_fft爲單位,由於混疊(nyquist定理),我們丟棄其中的一半。
這意味着爲了正確繪製墨水,矩陣需要轉置。因爲我們有效地需要N個不同的地塊,其中N是單位數量。
plt.plot(mel.T)
需要注意的是這一套梅爾濾波器的銀行仍然沒有什麼預期。這是因爲Librosa使用歸一化版本的mel濾波器組,這意味着每個mels的面積都是1,而不是傳統的相等高度1.從librosa返回的矩陣可以轉換爲相等高度的mel-濾波器組方式:
mels /= np.max(mels, axis=-1)[:, None]
你缺少freq向量,每個過濾器都有nftt/2 +1個樣本,所以mel基礎是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()
如果你喜歡別的繪製選擇可以是一個for循環。
for i in range(n):
plt.plot(f,mel_basis[i])
plt.show()