Librosa梅尔滤波器组减少三角形

时间:2016-10-22 21:07:01

标签: matplotlib mfcc librosa

我对MFCC的理解有点不了解。

根据我的阅读,梅尔滤波器组应该是一系列三角形,它们会变得更宽,它们的峰值位于同一个位置。像这样......

http://imgur.com/UCh5OjK

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

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)

4 个答案:

答案 0 :(得分:2)

我现在更加了解情况,我觉得给出的答案并不完全正确,所以我想我应该回答我自己的问题。

librosa.filters.mel返回一个形状为矩阵的矩阵(n_mels,n_fft / 2 +1)。这意味着矩阵中的每一行都是一个mel。列是梅尔滤波器组的每个频率的权重。频率是根据周期数达到n_fft的数量,由于混叠(nyquist定理),我们丢弃了一半。

这意味着为了正确绘制mels,矩阵需要转置。因为我们有效地需要N个不同的图,其中N是mels的数量。

plt.plot(mel.T)

这给出了以下图像: enter image description here

请注意,这组梅尔滤波器组仍未达到预期效果。这是因为Librosa使用标准化版本的mel-filter bank,这意味着每个mels的面积为1而不是传统的相等高度1.从librosa返回的矩阵可以转换为等高的mel-过滤银行:

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

然后情节如下:enter image description here

答案 1 :(得分:1)

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

Librosa Mfcc Filter bank

如果您更喜欢其他绘图选项,可以使用for循环。

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

Mfcc librosa

答案 2 :(得分:1)

好了一点,但是我希望这个答案对那些在不同的mel-filterbank实现中苦苦挣扎的人有所帮助:

mel-filterbanks有几种不同的实现;特别是librosa有2种不同:一种来自剑桥大学的Hidden Markov模型工具包(HTK),它是Slaney编写的默认语言,也是在Matlab的Auditory Toolbox中实现的:

HTK生成一个滤波器组,其中所有滤波器的中心设置为增益1 Slaney生成归一化的,可以按面积或带宽归一化。

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

请咨询this文件,以获取有关不同mel-filterbak实现的比较性能的更多信息

答案 3 :(得分:0)

您正在搜索“具有相同堤坝高度的过滤器堤坝”。我也在寻找这个。首先,应该对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()

mel picture