2016-10-22 137 views

回答

0

我有点现在更明智,我觉得给出的答案是不完全正确的,所以我想我应该回答我的问题。

librosa.filters.mel返回形状为(n_mels,n_fft/2 +1)的矩阵。这意味着矩阵中的每一行都是一个mel。这些列是梅尔滤波器组的每个频率的权重。频率以循环次数n_fft为单位,由于混叠(nyquist定理),我们丢弃其中的一半。

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

plt.plot(mel.T)

这给下面的图片: enter image description here

需要注意的是这一套梅尔滤波器的银行仍然没有什么预期。这是因为Librosa使用归一化版本的mel滤波器组,这意味着每个mels的面积都是1,而不是传统的相等高度1.从librosa返回的矩阵可以转换为相等高度的mel-滤波器组方式:

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

然后剧情是这样的:enter image description here

0

你缺少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() 

Librosa Mfcc Filter bank

如果你喜欢别的绘制选择可以是一个for循环。

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

Mfcc librosa