问题描述
我正在使用librosa
库从音频数据中获取和过滤频谱图。
我最了解生成频谱图的数学原理:
- 获取信号
- 窗口信号
- 为每个窗口计算傅立叶变换
- 创建其列为变换的矩阵
- 绘制该矩阵的热图
使用librosa
真的很容易:
spec = np.abs(librosa.stft(signal,n_fft=len(window),window=window)
是的!我有FFT矩阵。现在我看到了这个功能librosa.amplitude_to_db
,我认为这就是我对信号处理的无知开始显现的地方。这是我在Medium上找到的摘录:
spec = np.abs(librosa.stft(y,hop_length=512))
spec = librosa.amplitude_to_db(spec,ref=np.max)
为什么作者使用此amplitude_to_db
函数?为什么不直接绘制STFT的输出?
解决方法
sound pressure的可感知范围非常宽,从20μPa(微帕斯卡)到20 Pa,比率为100万。此外,人类对声级的感知不是线性的,而是可以通过对数更好地近似。
通过转换为decibels(dB),刻度变成对数。这样会将数值范围限制为0-120 dB。绘制颜色的强度比使用线性刻度更接近我们所听到的颜色。
请注意,可以自由选择以分贝为单位的参考(0 dB)点。 librosa.amplitude_to_db
的默认值是计算numpy.max
,这意味着输入的最大值将映射为0 dB。所有其他值将为负。该功能还会在声音范围上应用阈值,默认为80 dB。因此,任何低于-80 dB的信号都会被削减-80 dB。