FFT 中的低频更强?

信息处理 声音的 fft
2021-12-26 04:14:48

我正在根据麦克风输入计算 FFT。我注意到低频似乎总是比高频具有更大的功率(更高的 dB)。

  1. 我将数据切割成 24576 字节(4096*6)的帧。
  2. 应用汉明窗:input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. 通过 FFTW 运行它Process1D()
  4. 从复数转换:output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
  5. 平均 6 个值以获得 4096 字节的完整 FFT。
  6. 绘制漂亮的图片(颜色映射到调色板)。

进行平均 (pt. 5) 是为了降低 FFT 噪声。

如图所示,在声音和麦克风关闭的情况下,较低频率的能量(和噪音)更多。这表明它不仅仅是麦克风/子问题。

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

我的目标是能够识别前 5 个频率,而不会默认赢得较低的频率。

快速傅里叶变换

4个回答

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

大多数自然音频信号(语音、音乐、电影等)都有类似粉红色的频谱。此外,大多数声学背景噪声(麦克风噪声、HVAC 噪声、气压波动、通用背景)往往是粉红色的,甚至更偏向于较低频率。

人类的听觉系统也以这种方式工作。在内耳中,音频信号被分解成相对带宽恒定的频带(称为“临界频带”),这些频带与第三倍频程频谱大致相同。

查看音频频谱数据的最佳方法是将其绘制在对数频率范围内。

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

在第 4 步和第 5 步中,我将对平方幅度值进行二进制平均,而不是对 dB 值。假设你有平方大小[4,6]他们的平均值是5, 10*log10(5) ~= 6.9910*log10(4)的平均值10*log10(6)6.90

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

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

粉红和白噪声

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

这是预期的吗?为什么?

很多自然声音都有谐波,因此基频较低,而基频的高倍数则能量较少。可能存在直流偏置,这意味着在最左边有很多能量。另一个影响是您的窗口函数会扭曲频率响应。

有什么标准方法可以解决这个问题吗?几乎看起来像一些 Math.Tan() 魔法可以将它提升到它所属的位置。

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