python - 什么是警告“在 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. '
解决方案
MFCC 基于梅尔谱图,而梅尔谱图又通常基于离散傅里叶变换 (DFT)。傅里叶变换从时域获取信号并将其转换为频域。这意味着 N 个时域样本被转换为 N 个频域值(注意对称性——实际上只有 N/2 个频率值)。就像时域样本在线性时间尺度上一样,频域样本也在线性频率尺度上。相比之下,梅尔尺度不是线性的,而是(大约)对数的。
您需要了解以下有关傅里叶变换的知识。当您有一个 F_s = 8000Hz 且窗口长度为 N 的信号时:
- 不同频段的数量为:SL = N/2
- 您可以编码的最高频率是: F_max = F_s/2 ( Nyquist-Shannon )
- 频率分辨率为:Δf = F_max/SL
- 对信号(窗口摘录)进行傅里叶变换。
- 使用三角形重叠窗口将上面获得的光谱的功率映射到梅尔标度上。
- 记录每个 mel 频率的功率对数。
- 对 mel 对数幂列表进行离散余弦变换,就好像它是一个信号一样。
- MFCC 是所得频谱的幅度。
在第 2 步中,您必须将 DFT 生成的任何内容映射到不同的比例,即 mel 比例。如果 DFT 分辨率 Δf 太低而无法将功率值映射到(可能)更精细的梅尔尺度,则这不起作用。把它想象成一个图像:当你有一个粗糙的图像时,你不能通过将它映射到更高的分辨率来提高质量。这意味着,您必须确保您的 DFT 分辨率 Δf 对于您想要使用的 mel 波段足够好。
为确保这一点,您必须使用更长的窗口 N 或更少的 mel 波段n_mfcc
。问题的核心是,你不能同时拥有高频率分辨率和高时间分辨率。
另请参阅有关 FFT 参数的 IRCAM 介绍。
推荐阅读
- json - 如何根据JQ中Json中元素的值过滤对象数组
- javascript - 未定义的查询函数
- mongodb - 将 csv 导入 mongodb 时大小增加
- c# - 如何对两个表使用相同的模型。或 db 最佳实践
- python - 如何将数据从 Web 表写入文件。数值变化很快
- scala - scala spark - 基于可变日期匹配数据帧
- java - 试图通过Tomcat内部的骆驼调用外部HTTP Post请求
- arduino - 几分钟后我的 NodeMCU 和我的 ESP01 都关闭了
- ssh - 从集群内部访问 Vagrant VM(运行 Centos/7 的 Vitualbox)
- java - python和java之间发送短信