我对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()