声音频谱图

4
我制作了一个应用程序,可以实时将来自麦克风的FFT绘制到屏幕上。时间在x轴上,频率在y轴上,像素的颜色表示振幅(基本上是一个香草FFT频谱图)。
我的问题是,尽管我可以从音乐中看到一些模式,但也有很多噪声。通过Google搜索,我看到人们对振幅应用对数计算。我应该这样做吗?如果是这样,公式会是什么样子?(我正在使用C#,但我可以将数学转换为代码,所以任何示例都可以。)
我可以通过应用将较低值显示为较暗颜色的配色方案来避免这个问题。我只是不确定是否正确地表示了音频而没有对其进行对数计算。

你有当前输出的截图吗? - RQDQ
更好的做法是使用对数频率轴,更贴近耳朵的灵敏度。要了解差异,请参见http://wikidelia.net/wiki/Spectrogram上的示例。 - martinwguy
2个回答

8

在对数刻度上表示振幅,可以近似于人类听觉系统的灵敏度,因此与非对数刻度相比,可以更好地呈现你所听到的声音。从数学上讲,你只需要:

Alog = 20*log10 (abs (A))

其中A是FFT数据的振幅,Alog是输出结果。因子20只是一种惯例,并不影响图像,您可能会按比例缩放到一个颜色方案。

编辑

关于20因子的解释:dB(分贝)单位是一种对比率进行测量的对数单位:它代表了一个刻度,在这个刻度上,100和10之间的距离与1000和100之间的距离相同(因为它们具有相同的比率:1000/100 = 100/10)。如果您用dB来测量,您会得到:

10*log10 (1000/100) = 10*log10 (100/10) = 10
10的因素是因为deci意味着tenth,这意味着1贝尔等于10分贝(就像1千克等于1000克)。
由于人类听觉系统也(大约)测量比率,因此用对数刻度来测量声音级别是有意义的,即测量声级与某个参考值之间的比率。由于声音的级别与声波功率(以瓦特为单位)相关联,实际上测量的是功率P/Pref的比值。另外,功率与振幅的平方成正比,所以总体上你会得到:
10*log10 (P/Pref) = 10*log10 (A^2 / Aref^2) = 20*log10 (A/Aref)

按照日志规则来说,这就是“20”系数的起源 - 请记住,在计算机中,音频是通过声波瞬时振幅来表示的。

谢谢。你能再详细解释一下20吗? - Tedd Hansen

3
查看您的频谱图以对数方式显示,确实是查看音频信号的更好方法。请记住,在时间方向和频率方向上都需要良好的分辨率。如果一个方向上的桶太少,可能会看起来很奇怪。

另一个重要的观点是,在对数刻度下查看STFT不是一种去噪技术。你所看到的“噪音”可能是实际的噪声,也可能是谐波瞬变频谱泄漏和其他应该存在的东西。根据您的应用程序,如果需要对信号进行短时分析,则小波变换可能更适合您的需求。它消除了STFT的某些缺点,例如恒定的窗口大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接