我正在从麦克风输入计算FFT。我注意到,低频似乎总是比高频具有更大的功率(更高的dB)。
我将数据切成24576字节(4096 * 6)的帧。
应用Hamming窗口:input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));

通过FFTW Process1D()运行它。
从复数转换:output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));

平均6个值以获得4096字节的完整FFT。
绘制漂亮的图片(颜色映射到调色板)。

进行平均(第5点)以降低FFT噪声。

由于图像显示声音和麦克风均关闭,因此在较低频率下会有更多的能量(和更多的噪声) 。这表明它不仅仅是一个麦克风/子问题。

我的问题:
1.这是预期的吗?为什么?
2.有什么标准方法可以解决此问题?几乎看起来像是Math.Tan()魔术可以将其提升到所属位置。

我的目标是能够确定前5个频率,而默认情况下不会赢得较低的频率。



评论

请先尝试使用正确的汉明窗,看看破窗碎片是否是造成这种低频噪声的原因。
@Tedd Hansen,您最终是如何“在没有较低频率的情况下识别出前5个频率的” –加权1/3倍频程频段中的前5个频率?

#1 楼

是的,这是非常期望的。您所看到的是“粉红色”频谱,即每个相对带宽的恒定能量,而“白色”频谱则是每个绝对带宽的恒定能量。对于粉红色信号,1-2kHz之间的能量与2-4kHz之间的能量相同(每个能量代表带宽加倍或“倍频”。)

大多数自然音频信号(语音,音乐,电影等。)具有类似粉红色的频谱,而且大多数声学背景噪音(麦克风噪音,HVAC噪音,气压波动,一般背景)也趋向于粉红色,甚至偏向低频。

人类听觉系统也是如此,在内耳中,音频信号被分解为恒定的相对带宽的频带(称为“临界频带”),该频带与第三个八度音阶频谱大致相同。

查看音频频谱数据的最佳方法是将其绘制在对数频率刻度上。

评论


$ \ begingroup $
“自然音频信号具有类似粉红色的频谱”的说法忽略了时间尺度的考虑。我同意很长一段时间(约10秒),并且肯定会在几分钟内使该陈述成为事实。但是这里的光谱是在0.55秒内计算得出的。如果输入是例如音乐,我希望音调结构更多。
$ \ endgroup $
–mtrw
2011年11月2日,下午5:23

$ \ begingroup $
“音调”会影响光谱的精细结构。总体形状(以每倍频程的能量来表示)对于音乐来说仍然大部分是粉红色的,除非它是“三角形和碰撞c的独奏”之类的东西
$ \ endgroup $
–希尔马
11年3月3日在16:41

$ \ begingroup $
@mtrw:方波肯定是一个音调,但是高频谐波仍然以1 / f的速率下降。
$ \ endgroup $
– Endolith
2012年9月28日16:09

#2 楼

在第2步中,公式应为input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));,其中N是缓冲区中的样本数,以您的情况为24576

在第4步和第5步中,我将对幅度值的平方,而不是dB​​值。假设您的平方幅度为[4,6]。他们的平均值是510*log10(5) ~= 6.9910*log10(4)10*log10(6)的平均值为6.90

第一个问题可能是导致偏向低频的原因,因为这会导致频谱泄漏,并且低频会受到DC的更多污染线(不可避免地是一个差的估计)。第二个问题可能不会对低频产生影响,但我认为这与您的测量意图更加接近。

评论


$ \ begingroup $
虽然平均dB值很可能不是最好的做法,但对我来说并不立即显而易见,平均幅度要好得多。我建议取平均值的平方,我认为(如果我正确理解代码片段的话)已经通过fout [i * 2] * fout [i * 2])+(fout [i * 2 + 1] * fout [i * 2 +1]。我认为mtrw使用的$ 4 $和$ 6 $实际上是平方的幅度,因为他建议使用$ 10 \ log_ {10}(5)$的平均值而不是平均$(10 \ log_ {10}(4)+ 10 \ log_ {10}(6))/ 2 $就像OP一样
$ \ endgroup $
– Dilip Sarwate
2011年10月31日13:54

$ \ begingroup $
在上面的说明中,我相信您希望窗口宽度(N)为4096,因为这是应用的FFT的宽度。在每个fft之前,需要将此窗口应用于要转换的4096个样本。
$ \ endgroup $
–雅各布
2011年11月14日下午16:47

$ \ begingroup $
@Jacob-OP正在计算6 * 4096点的FFT,然后平均6个相邻的bin,以减少到4096点。
$ \ endgroup $
–mtrw
2011年11月14日在21:39

#3 楼

1 / f噪声发生在许多物理,生物和经济系统中。一些研究人员将其描述为无处不在。



具有线性频率垂直轴的FFT频谱图上的粉红噪声(左)和白噪声(右)(在典型音频上)或类似的频谱分析仪,粉红噪声将保持平坦,不会向下倾斜,而白噪声会上升)

评论


$ \ begingroup $
左边的声音肯定是粉红色的,但右边的声音看起来有点橙色:-)
$ \ endgroup $
– Guy Sirton
11年10月29日在22:32

$ \ begingroup $
虽然1 / f噪声无处不在,但设计良好的音频模拟前端通常具有较高的1 / f噪声水平,例如10 Hz。白噪声在感兴趣的频带中占主导地位。
$ \ endgroup $
–mtrw
2011年10月30日,下午3:39

#4 楼


这是预期的吗?为什么?


许多自然声音具有谐波,因此基频较低,而基频较高的倍数处的能量较少。可能存在直流偏置,这将在最左侧表示大量能量。另一个影响是您的开窗功能会扭曲频率响应。


有任何标准的方法可以解决此问题?几乎看起来像是Math.Tan()魔术可以将其提升到所属位置。


您可以使用高通滤波器来处理DC偏置。一种简单的实现是从每个样本中减去长期平均值(编辑:或更简单的是,从FFT结果中舍弃较低的频率,例如<50Hz)。您也可以尝试使用不同的窗口功能。确保(如@mtrw所指出的)您正确地应用了窗口。可以通过测量一些理想输入并将该曲线归一化来校正响应中的任何其他非线性。

评论


$ \ begingroup $
窗口功能不应影响频率响应,对吗?
$ \ endgroup $
– Endolith
2012年9月28日16:18

$ \ begingroup $
@endolith:它确实-您将数据与开窗函数相乘,并且合并后的函数具有不同的响应。阅读链接的Wikipedia文章,其中将对此进行更深入的讨论。处理现实世界样本的现实是通常存在一些窗口(例如矩形),因此您只能近似(无限)源信号的频率响应。
$ \ endgroup $
– Guy Sirton
2012年10月2日在6:23



$ \ begingroup $
也许我们对“频率响应”的看法有所不同。如果信号是固定的,并且您对其应用了窗函数,则无论您使用哪种窗函数,频谱都应在相同频率处具有相同的振幅,其区别仅在于会平等地影响所有频率的比例因子。每个频率尖峰的宽度将有所不同,但尖峰的高度彼此之间将相同。窗口功能不像一个滤波器,它对某些频率的衰减比其他频率更大。
$ \ endgroup $
– Endolith
2012年10月2日14:45

$ \ begingroup $
@endolith:想象一个无限的正弦波,现在乘以一个cos ^ 2窗口。您仍将具有原始频率的分量,但是其幅度将为“ off”,并且您将有来自窗口的新频率分量。请参阅此处的第一段:en.wikipedia.org/wiki/Spectral_leakage
$ \ endgroup $
– Guy Sirton
2012年10月2日于20:02

$ \ begingroup $
是的,但是无论无限正弦波的频率如何,“关闭”幅度都将相同,不是吗?
$ \ endgroup $
– Endolith
2012年10月2日21:39