我正在尝试使用以下代码从具有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. '
答案 0 :(得分:1)
MFCC基于梅尔频谱图,而梅尔频谱图通常又基于discrete Fourier transform (DFT)。傅立叶变换从时域获取信号并将其转换为频域。这意味着将N个时域样本转换为N个频域值(请注意对称性-您实际上只有N / 2个频率值)。就像时域样本在线性时标上一样,频域样本在线性时标上。相反,mel-scale不是线性的,而是(近似)对数的。
您需要了解以下有关傅里叶变换的知识。当您有一个F_s = 8000Hz且窗口长度为N的信号时:
- 对信号(窗口摘要)进行傅立叶变换。
- 使用三角形重叠窗口将以上获得的光谱功率映射到mel刻度上。
- 获取每个mel频率下的功率对数。
- 对梅尔对数幂列表进行离散余弦变换,就好像它是一个信号一样。
- MFCC是所得频谱的振幅。
在第2步中,您必须将DFT生成的任何内容映射到不同的比例(梅尔比例)。如果DFT分辨率Δf太低而无法将功率值映射到(可能)更精细的梅尔刻度,则此方法将不起作用。可以将其视为图像:当图像较粗糙时,无法通过将其映射到更高分辨率来提高质量。 这意味着,您必须确保DFT分辨率Δf对要使用的mel频段足够精细。</ p>
为确保这一点,您必须使用更长的窗口N或更少的梅尔带n_mfcc
。问题的根本在于,您不能同时拥有:高频分辨率和同时高时间分辨率。