为什么在构建音频信号的功率谱时需要对样本应用窗函数?

22

我已经多次发现了获取音频信号功率谱的以下准则

  • 收集N个样本,其中N是2的幂
  • 对样本应用适当的窗口函数,例如Hanning
  • 将窗口化的样本传递给FFT例程-理想情况下,您需要一个实际到复杂的FFT,但如果您只有复杂到复杂的FFT,则将所有虚数输入部分传递为0
  • 计算FFT输出bin的平方幅度(re * re + im * im)
  • (可选)计算每个幅度平方输出bin的10 * log10以获得dB中的幅度值
  • 现在,您已经拥有功率谱,只需要识别峰值即可,如果您具有合理的S / N比,这应该非常简单。请注意,随着N的增大,频率分辨率会提高。对于上述44.1 kHz采样率和N = 32768的示例,每个bin的频率分辨率为44100/32768 = 1.35 Hz。

但是...为什么需要对样本应用窗口函数?这真正意味着什么?

功率谱呢?它是采样率范围内每个频率的功率吗?(例如:Windows Media Player音频可视化器)

4个回答

35
大多数真实世界的音频信号是非周期性的,这意味着真实的音频信号不会在任何给定时间段内完全重复。
然而,傅里叶变换的数学假设被傅里叶变换的信号在所涉及的时间跨度上是周期性的。
傅里叶的这种周期性假设与现实世界中音频信号通常是非周期性的事实之间存在不匹配,导致变换中出现错误。
这些错误称为“频谱泄漏”,通常表现为能量在信号功率谱上错误分布。
下图显示了一张原声吉他演奏A4音符的功率谱放大图。该谱是使用FFT(快速傅里叶变换)计算的,但在FFT之前未对信号进行窗口处理。
请注意-60 dB线以上的能量分布,以及大约440 Hz、880 Hz和1320 Hz处的三个明显的峰值。这种能量分布包含“频谱泄漏”误差。

Power spectrum of guitar playing an A4 note, no window was applied

为了在一定程度上减少“频谱泄漏”误差,您可以使用专门设计用于此目的的窗函数对信号进行预乘,例如汉宁窗函数。
下面的图显示了汉宁窗函数在时域中的形状。请注意,函数的尾部平滑地趋近于零,而函数的中心部分平滑地趋向于值1。

Hann window function

现在让我们将Hann窗口应用于吉他的音频数据,然后对结果信号进行FFT。
下面的图显示了同一信号(一个弹奏A4音符的木吉他)功率谱的近距离,但这次在FFT之前,信号被预乘以Hann窗函数。
请注意,-60 dB线以上能量的分布已经发生了显著变化,三个明显的峰值的形状和高度也已经改变。这种特定的频谱能量分布包含较少的“频谱泄漏”误差。

Power spectrum of guitar playing an A4 note, Hann window was applied

这份分析所使用的声学吉他A4音符以高品质麦克风在录音棚环境下以44.1 KHz采样,几乎没有背景噪音、其他乐器或人声,也没有后期处理。

参考文献:

快速傅里叶变换、频谱分析、Hann窗口函数和音频数据均在此处完成:

Fast Fourier Transform, spectral analysis, Hann window function, audio data


14

正如@cyco130所说,您的样本已经通过矩形函数进行了窗口处理。由于傅里叶变换假定具有周期性,最后一个样本和重复的第一个样本之间的任何不连续都会导致频谱中的伪影(例如峰值的“模糊”)。这被称为频谱泄漏。为了减少此效应,我们应用锥形窗口函数,例如汉宁窗,这样就可以平滑任何这样的不连续,并因此减少频谱中的伪影。


在计算了magnitues和db之后,我得到了大于0db的值。这正常吗?我知道这是个愚蠢的问题,但我真的不明白什么时候应该得到0db。我的输入信号和应用的汉宁函数如下:in [step] = 0.05f * sin ((2 * M_PI * step * 440) / 44100) + 0.1f * sin ((2 * M_PI * step * 880) / 44100) + 0.2f * sin ((2 * M_PI * step * 1760) / 44100);in [step] * = 0.5f *(1.0f- cos(float((2 * M_PI *步骤)/ float(NSAMPLES-1))))。 - Nuno Santos
@Nuno:不要过于担心绝对分贝值-0 dB只是一个任意的参考点,除非你基于一些已知的参考进行了校准并使用例如dBV或dBm。更重要的是,你的频谱中峰值所在的频率和峰值的幅度相对于你的噪声水平具有合理的值。 - Paul R

7
请注意,非矩形窗口既有利处也有成本。在时域中窗口的结果相当于窗口变换与信号频谱的卷积。例如一个typical window,如von Hann窗口,会减少任何非周期性谱内容的“泄漏”,这将导致频谱看起来不那么嘈杂;但是,作为回报,卷积将模糊几个相邻bin内的确切或接近周期性谱峰。例如所有谱峰都将变得更加圆润,这可能会降低频率估计精度。如果您事先知道没有非周期性内容(例如某些旋转同步采样系统的数据),那么非矩形窗口实际上可能会使FFT看起来更糟。
非矩形窗口也是一种信息丢失过程。假设在有限的精度算法下,窗口边缘附近的大量频谱信息将被抛弃。因此,最好在重叠窗口处理和/或可以假设感兴趣的频谱在整个窗口宽度内是稳定的或位于窗口中心时使用非矩形窗口。

迄今为止最好的答案。当你说“重叠窗口处理”时,你是指像这样的东西吗?https://dsp.stackexchange.com/a/19317/37360 我正在尝试重新创建原始数据并合成新数据,就好像它延续了我无法提供的部分(精确度高),因此一般的窗口函数都不太吸引人。我一直在尝试想出一些想法,比如计算某种STFT(我想是这样),然后在每次计算中对FFT数据进行平均处理或其他什么,以帮助边缘。有什么想法吗? - Andrew

6
如果您没有使用任何窗口函数,实际上您正在应用矩形窗口函数。不同的窗口函数具有不同的特性,取决于您想要的确切结果。

请问您能否详细说明一下这个问题?“如果您没有应用任何窗函数,实际上您正在应用一个矩形窗函数”。 - privetDruzia
将有限长度变换应用于更长的信号会在有限长度窗口之前和之后截断数据。这与应用矩形窗口相同。在时域中,该矩形窗口导致频域中的Sinc卷积,这就是一些人所谓的泄漏。 - hotpaw2

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