Librosa mel 滤波器组递减三角形
Librosa mel filter bank decreasing triangles
我对 MFCC 的理解有点卡住了。
据我所知,梅尔滤波器组应该是一系列变宽的三角形,它们的峰值位于同一位置。像这样...
然而,当我使用 librosa 计算梅尔滤波器组时,我得到...
代码:
import librosa
import matplotlib.pyplot as plt
sr = 16000
mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr / 2)
plt.plot(mel_basis)
您缺少频率向量,每个过滤器都有 nftt/2 +1 个样本,因此梅尔基础是 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 returns 形状为 (n_mels, n_fft/2 +1) 的矩阵。这意味着矩阵中的每一行都是一个梅尔。列是梅尔滤波器组每个频率的权重。频率以循环数表示,最多 n_fft,由于混叠(奈奎斯特定理),我们丢弃了其中的一半。
这意味着为了正确绘制 mels,需要转置矩阵。因为我们实际上想要 N 个不同的地块,其中 N 是梅尔的数量。
plt.plot(mel.T)
这给出了下图:
请注意,这组梅尔滤波器组仍然不是预期的。这是因为 Librosa 使用归一化版本的 mel-filter banks,这意味着每个 mel 的面积为 1 而不是传统的等高 1。从 librosa 返回的矩阵可以转换为等高 mel-过滤器组:
mels /= np.max(mels, axis=-1)[:, None]
然后剧情是这样的:
嗯,有点晚了,但我希望这个答案对那些在不同的 mel-filterbank 实现中苦苦挣扎的人有所帮助:
mel-filterbanks 有几种不同的实现方式;特别是 librosa 有 2 个不同:一个来自剑桥的隐马尔可夫模型工具包 (HTK),另一个由 Slaney 编写并在 Matlab 的听觉工具箱中实现:
HTK 生成一个滤波器组,所有滤波器的中心都设置为增益 1
Slaney 的实现生成了一个归一化滤波器组,其中可以按面积或按带宽进行归一化。
除了它们的有效性非常相似之外,过滤器值也不相同,所以我怀疑更改可视化是否有用。
查看 this 论文以获取有关不同 mel-filterbak 实现性能比较的更多信息
您正在搜索“Mel-filter 个银行高度相同的银行”。我也在找这个。首先要把mels转置,只用“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
我对 MFCC 的理解有点卡住了。
据我所知,梅尔滤波器组应该是一系列变宽的三角形,它们的峰值位于同一位置。像这样...
然而,当我使用 librosa 计算梅尔滤波器组时,我得到...
代码:
import librosa
import matplotlib.pyplot as plt
sr = 16000
mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr / 2)
plt.plot(mel_basis)
您缺少频率向量,每个过滤器都有 nftt/2 +1 个样本,因此梅尔基础是 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 returns 形状为 (n_mels, n_fft/2 +1) 的矩阵。这意味着矩阵中的每一行都是一个梅尔。列是梅尔滤波器组每个频率的权重。频率以循环数表示,最多 n_fft,由于混叠(奈奎斯特定理),我们丢弃了其中的一半。
这意味着为了正确绘制 mels,需要转置矩阵。因为我们实际上想要 N 个不同的地块,其中 N 是梅尔的数量。
plt.plot(mel.T)
这给出了下图:
请注意,这组梅尔滤波器组仍然不是预期的。这是因为 Librosa 使用归一化版本的 mel-filter banks,这意味着每个 mel 的面积为 1 而不是传统的等高 1。从 librosa 返回的矩阵可以转换为等高 mel-过滤器组:
mels /= np.max(mels, axis=-1)[:, None]
然后剧情是这样的:
嗯,有点晚了,但我希望这个答案对那些在不同的 mel-filterbank 实现中苦苦挣扎的人有所帮助:
mel-filterbanks 有几种不同的实现方式;特别是 librosa 有 2 个不同:一个来自剑桥的隐马尔可夫模型工具包 (HTK),另一个由 Slaney 编写并在 Matlab 的听觉工具箱中实现:
HTK 生成一个滤波器组,所有滤波器的中心都设置为增益 1 Slaney 的实现生成了一个归一化滤波器组,其中可以按面积或按带宽进行归一化。
除了它们的有效性非常相似之外,过滤器值也不相同,所以我怀疑更改可视化是否有用。
查看 this 论文以获取有关不同 mel-filterbak 实现性能比较的更多信息
您正在搜索“Mel-filter 个银行高度相同的银行”。我也在找这个。首先要把mels转置,只用“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