Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 声谱图_Algorithm_Audio - Fatal编程技术网

Algorithm 声谱图

Algorithm 声谱图,algorithm,audio,Algorithm,Audio,我制作了一个应用程序,可以实时(从麦克风)在屏幕上绘制FFT。x轴上的时间、y轴上的频率和像素的颜色表示振幅(相当于普通的FFT频谱图) 我的问题是,即使我能从音乐中看到一种模式,也有很多噪音。我在谷歌上看到人们对振幅进行对数计算。我应该这样做吗?如果是这样的话,公式会是什么样子?(我使用的是C#,但我可以将数学转换为代码,所以任何示例都可以。) 我可以通过应用颜色方案来绕过这个问题,将较低的值显示为较暗的颜色。我只是不确定在没有对数计算的情况下音频是否正确表示。在对数尺度上表示振幅近似于人类听

我制作了一个应用程序,可以实时(从麦克风)在屏幕上绘制FFT。x轴上的时间、y轴上的频率和像素的颜色表示振幅(相当于普通的FFT频谱图)

我的问题是,即使我能从音乐中看到一种模式,也有很多噪音。我在谷歌上看到人们对振幅进行对数计算。我应该这样做吗?如果是这样的话,公式会是什么样子?(我使用的是C#,但我可以将数学转换为代码,所以任何示例都可以。)


我可以通过应用颜色方案来绕过这个问题,将较低的值显示为较暗的颜色。我只是不确定在没有对数计算的情况下音频是否正确表示。

在对数尺度上表示振幅近似于人类听觉系统的灵敏度,因此与非对数尺度相比,它能更好地表示您听到的声音。从数学上讲,你所要做的就是:

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
因子的来源-记住,在计算机中,音频由声波的瞬时振幅表示

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


另一个重要的观点是,在对数刻度上查看STFT并不是一种去噪技术。你所看到的“噪音”可能是真实的,也可能是类似的东西,以及其他预期会出现的东西。根据应用程序的不同,如果需要对信号进行短时分析,变换可能更适合您的需要。它消除了STFT的某些缺点,例如恒定的窗口大小。

您有当前输出的屏幕截图吗?更好的是,使用对数频率轴,更接近耳朵的灵敏度,以了解差异,例如,请参阅Hanks。你能再解释一下吗?