2011-04-20 49 views
4

我已经做了一个应用程序,实时绘制FFT屏幕(从麦克风)。 x轴上的时间,y轴上的频率和像素的颜色代表幅度(几乎是一个香草FFT频谱图)。声谱图

我的问题是,即使我可以看到音乐模式也有很多噪音。使用Google搜索我看到人们对幅度应用对数计算。我应该这样做吗?如果是这样,公式会是什么样子? (我使用C#,但我可以因此任何样品是确定数学转换成代码。)

我可以通过施加表示作为较暗的颜色值越低颜色方案绕过这个问题。我只是不确定是否没有对数计算就能正确表示音频。

+0

你有输出目前的样子的截图吗? – RQDQ 2011-04-20 13:07:09

+0

更好的是,使用日志频率轴,更加贴近耳朵的灵敏度,要了解其差异,请参阅http://wikidelia.net/wiki/Spectrogram示例 – martinwguy 2015-09-04 22:16:17

回答

8

以对数刻度表示的振幅接近人类听觉系统的灵敏度,因此与非对数刻度相比,您可以更好地表示听到的内容。在数学上,所有你需要做的是:

Alog = 20*log10 (abs (A)) 

哪里A是FFT数据的幅度,Alog是输出。 20的因子只是一个约定,对图像没有影响,您可能会根据颜色方案进行缩放。

EDIT

关于20因子说明:分贝(分贝)单元是一个对数单元,测量比率:它代表一个尺度上100和10之间的距离,是相同的间1000和100(因为它们具有相同的比率:1000/100 = 100/10)。如果以dB为单位衡量它,你得到:

10*log10 (1000/100) = 10*log10 (100/10) = 10 

10的因素是因为deci意味着tenth,这意味着1倍儿为10个分贝,(如1公斤是千克)

由于人类听觉系统也是(近似)测量比率,在对数标度上测量声级是有意义的,即测量声级与某个参考值的比值。由于声音的级别与声波的功率(单位为瓦特)有关,所以实际上您可以测量功率比率P/Pref。另外,功率与幅度的平方成正比,所以总得到:

10*log10 (P/Pref) = 10*log10 (A^2/Aref^2) = 20*log10 (A/Aref) 

由日志规则。这是20因素的起源 - 请记住,在计算机中,音频由声波的瞬时振幅表示。

+0

谢谢。你能否进一步解释20? – 2011-04-20 13:14:47

+0

我编辑了我的答案 – 2011-04-20 14:11:01

3

以对数形式查看谱图确实是查看音频信号的更好方法。请记住,你需要在时间方向和频率方向都有好的resolution。如果你的箱子太少,可能看起来很奇怪。

另一个重要的问题是,在对数刻度上查看您的STFT是而不是降噪技术。你所看到的“噪音”可能是实际的noise或者它可能是诸如harmonics,transients,spectral leakage和其他预期会存在的东西。根据您的应用,如果您需要对信号进行短时分析,则wavelet转换可能更适合您的需求。它消除了STFT的某些缺点,例如恒定的窗口大小。