什么是警告“以mel频率检测到空过滤器。 ' 关于?

时间:2019-07-08 07:06:21

标签: feature-extraction mfcc librosa

我正在尝试使用以下代码从具有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. '

1 个答案:

答案 0 :(得分:1)

MFCC基于梅尔频谱图,而梅尔频谱图通常又基于discrete Fourier transform (DFT)。傅立叶变换从时域获取信号并将其转换为频域。这意味着将N个时域样本转换为N个频域值(请注意对称性-您实际上只有N / 2个频率值)。就像时域样本在线性时标上一样,频域样本在线性时标上。相反,mel-scale不是线性的,而是(近似)对数的。

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

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

现在考虑如何计算MFCCs(另请参见here):

  
      
  1. 对信号(窗口摘要)进行傅立叶变换。
  2.   
  3. 使用三角形重叠窗口将以上获得的光谱功率映射到mel刻度上。
  4.   
  5. 获取每个mel频率下的功率对数。
  6.   
  7. 对梅尔对数幂列表进行离散余弦变换,就好像它是一个信号一样。
  8.   
  9. MFCC是所得频谱的振幅。
  10.   

在第2步中,您必须将DFT生成的任何内容映射到不同的比例(梅尔比例)。如果DFT分辨率Δf太低而无法将功率值映射到(可能)更精细的梅尔刻度,则此方法将不起作用。可以将其视为图像:当图像较粗糙时,无法通过将其映射到更高分辨率来提高质量。 这意味着,您必须确保DFT分辨率Δf对要使用的mel频段足够精细。<​​/ p>

为确保这一点,您必须使用更长的窗口N或更少的梅尔带n_mfcc。问题的根本在于,您不能同时拥有:高频分辨率和同时高时间分辨率。

另请参阅IRCAM Intro on FFT parameters