【问题标题】:Librosa mel filter bank decreasing trianglesLibrosa mel 滤波器组递减三角形
【发布时间】:2017-03-04 23:16:54
【问题描述】:

我对 MFCC 的理解有点困惑。

根据我的阅读,mel 滤波器组应该是一系列变宽的三角形,并且它们的峰值在同一个位置。像这样……

但是,当我使用 librosa 计算 mel 滤波器组时,我得到...

代码:

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)

【问题讨论】:

    标签: matplotlib mfcc librosa


    【解决方案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()
    

    如果您更喜欢另一个绘图选项,可以使用 for 循环。

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

    【讨论】:

      【解决方案2】:

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

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

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

      plt.plot(mel.T)

      这给出了以下图像:

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

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

      然后剧情是这样的:

      【讨论】:

        【解决方案3】:

        嗯,有点晚了,但我希望这个答案对任何在不同的 mel-filterbank 实现中苦苦挣扎的人有所帮助:

        mel-filterbanks 有几种不同的实现方式;具体来说 librosa 有两种不同:一种来自 Cambridge 的 Hidden Markov Model Toolkit (HTK),另一种是由 Slaney 编写并在 Matlab 的 Auditory Toolbox 中实现的:

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

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

        查看this 论文以获取有关不同 mel-filterbak 实现的比较性能的更多信息

        【讨论】:

          【解决方案4】:

          您正在搜索“具有相同库高的梅尔滤波器库”。我也在寻找这个。首先,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

          【讨论】:

            猜你喜欢
            • 2020-03-03
            • 2017-08-01
            • 1970-01-01
            • 2019-08-13
            • 1970-01-01
            • 2021-11-20
            • 1970-01-01
            • 1970-01-01
            • 2021-02-12
            相关资源
            最近更新 更多