Matplotlib Librosa mel滤波器组递减三角形

Matplotlib Librosa mel滤波器组递减三角形,matplotlib,mfcc,librosa,Matplotlib,Mfcc,Librosa,我对MFCC有点理解不通 据我所知,mel滤波器组应该是一系列变宽的三角形,它们的峰值在同一位置。像这样 然而,当我使用librosa计算mel滤波器组时,我得到 代码: 缺少频率向量,每个过滤器都有nftt/2+1样本,因此mel基是librosa中n_mels x(nfft/2+1)的矩阵 为了计算MFCC,必须得到帧信号的功率谱,然后将其乘以滤波器组 import numpy.matlib sr = 22050 n_fft = 512 n = 10 mel_basis = libro

我对MFCC有点理解不通

据我所知,mel滤波器组应该是一系列变宽的三角形,它们的峰值在同一位置。像这样

然而,当我使用librosa计算mel滤波器组时,我得到

代码:


缺少频率向量,每个过滤器都有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()

我现在有点见多识广,我觉得给出的答案不完全正确,所以我想我应该回答我自己的问题

librosa.filters.mel返回具有形状的矩阵(n_mels,n_fft/2+1)。这意味着矩阵中的每一行都是mel。这些列是mel滤波器组每个频率的权重。频率以n_fft的循环数表示,由于混叠(奈奎斯特定理),我们丢弃了其中的一半

这意味着为了正确绘制MEL,需要对矩阵进行转置。因为我们实际上想要N个不同的图,其中N是MEL的数量

plt.plot(mel.T)

这将显示以下图像:

请注意,这组mel过滤器组仍然不是预期的。这是因为Librosa使用标准化版本的mel过滤器组,这意味着每个mel的面积为1,而不是传统的等高1。从librosa返回的矩阵可以通过以下方式转换为等高mel滤波器组:

mels/=np.max(mels,轴=-1)[:,无]


然后情节看起来是这样的:

虽然有点晚了,但我希望这个答案对那些正在使用不同mel过滤器库实现的人有所帮助:

mel滤波器组有几种不同的实现方式;具体来说,librosa有两个不同的工具:一个来自剑桥大学的隐马尔可夫模型工具箱(HTK),它的默认值由Slaney编写,并在Matlab的听觉工具箱中实现:

HTK生成一个滤波器组,所有滤波器的中心设置为增益1 Slaney的实现生成了一个规范化的过滤器库,在这里可以按面积或带宽进行规范化

除了它们的效果非常相似之外,过滤器的值也不相同,所以我怀疑更改可视化是否有用

有关不同mel滤波器组实现的比较性能的更多信息,请参阅本文

您正在搜索“具有相同滤波器组高度的mel滤波器组”。我也在寻找这个。首先,应该对MEL进行转置,只需使用“norm”参数,并将其更改为None

mels = librosa.filters.mel(20000, 2048, n_mels=4, fmin=0.0, fmax=None, htk=False, norm=None)
plt.plot(mels.T)
plt.show()

mels = librosa.filters.mel(20000, 2048, n_mels=4, fmin=0.0, fmax=None, htk=False, norm=None)
plt.plot(mels.T)
plt.show()