首页 > 解决方案 > 什么是警告“在 mel 频率基础上检测到空过滤器”。' 关于?

问题描述

我正在尝试使用以下代码从具有 13 个 MFCC 的音频文件中提取 MFCC 功能:

import librosa as l

x, sr = l.load('/home/user/Data/Audio/Tracks/Dev/FS_P01_dev_001.wav', sr = 8000)
n_fft = int(sr * 0.02)   
hop_length = n_fft // 2  
mfccs = l.feature.mfcc(x, sr=sr, n_mfcc=13, hop_length=hop_length,  n_fft=n_fft)

但它显示了这个警告。这是什么意思,我该如何摆脱它?

UserWarning: Empty filters detected in mel frequency basis. Some channels will produce empty responses. Try increasing your sampling rate (and fmax) or reducing n_mels.
  warnings.warn('Empty filters detected in mel frequency basis. '

标签: pythonaudiofeature-extractionlibrosamfcc

解决方案


MFCC 基于梅尔谱图,而梅尔谱图又通常基于离散傅里叶变换 (DFT)。傅里叶变换从时域获取信号并将其转换为频域。这意味着 N 个时域样本被转换为 N 个频域值(注意对称性——实际上只有 N/2 个频率值)。就像时域样本在线性时间尺度上一样,频域样本也在线性频率尺度上。相比之下,梅尔尺度不是线性的,而是(大约)对数的。

您需要了解以下有关傅里叶变换的知识。当您有一个 F_s = 8000Hz 且窗口长度为 N 的信号时:

  • 不同频段的数量为:SL = N/2
  • 您可以编码的最高频率是: F_max = F_s/2 ( Nyquist-Shannon )
  • 频率分辨率为:Δf = F_max/SL

现在考虑如何计算MFCC(另请参见此处):

  1. 对信号(窗口摘录)进行傅里叶变换。
  2. 使用三角形重叠窗口将上面获得的光谱的功率映射到梅尔标度上。
  3. 记录每个 mel 频率的功率对数。
  4. 对 mel 对数幂列表进行离散余弦变换,就好像它是一个信号一样。
  5. MFCC 是所得频谱的幅度。

在第 2 步中,您必须将 DFT 生成的任何内容映射到不同的比例,即 mel 比例。如果 DFT 分辨率 Δf 太低而无法将功率值映射到(可能)更精细的梅尔尺度,则这不起作用。把它想象成一个图像:当你有一个粗糙的图像时,你不能通过将它映射到更高的分辨率来提高质量。这意味着,您必须确保您的 DFT 分辨率 Δf 对于您想要使用的 mel 波段足够好。

为确保这一点,您必须使用更长的窗口 N 或更少的 mel 波段n_mfcc。问题的核心是,你不能同时拥有高频率分辨率高时间分辨率。

另请参阅有关 FFT 参数的 IRCAM 介绍


推荐阅读