窗口大小和数据长度对FFT的影响

5
我正在尝试对流式音频数据进行快速谱分析,以捕捉元音(类似于JLip-sync)。使用PyAudio以小块(1024)的方式捕获声音数据,持续时间很短(0.0625秒)。使用numpy.fft进行分析,并使用numpy.hanning窗口消除泄漏。我使用4096 * 4作为采样率(不是44100或22050,也可以讨论;4096 * 4最接近22050)。
考虑到我感兴趣的频率范围(从300 Hz到3000 Hz),如何使用数据长度和我寻找的最小/最大频率来计算理想的窗口大小?
谢谢。
Kadir
2个回答

12

@Kadir:

在进行离散傅里叶变换(DFT或FFT)之前,窗口化数据的目的是最小化泄漏谱,这种情况发生在您尝试对非周期性数据进行傅里叶变换时。

窗口化通过强制在序列的开始和结束处平滑地将数据强制为零,但不是在它们之前。缩短窗口会不必要地破坏信息。

因此,您的窗口长度应与样本序列的长度相匹配。例如,如果有1024个样本,则窗口长度应为1024。

如果您想要分辨率最高的频率为3千赫兹,请使用8192个或更多的样本,例如16384或32768个样本,在各种采样率下都可用。

此外,尝试不同的FFT算法、不同的采样长度和不同的窗口,包括Hann(Hanning),但也包括具有更好的旁瓣衰减的其他窗口,例如Blackman-Harris系列和Kaiser-Bessel系列等。

如果您的应用程序存在噪音,则可能需要在更好的噪声抑制窗口和更高的频谱分辨率窗口之间进行选择。因此,尝试不同的窗口是一个好主意,这样您就可以找到最适合您应用程序的窗口。

现在,使用每个设置(即每个窗口、采样长度、采样率等)写下您的结果,并寻找跨多个设置一致的结果。您将了解有关数据的许多信息,并且很可能找到解决问题的答案。

您可以使用Matlab进行此操作:http://www.mathworks.com/help/techdoc/ref/fft.html

或者使用此在线FFT频谱分析仪:http://www.sooeet.com/math/fft.php

别忘了在这里发布您的结果。


6

关键因素是在频率域中需要多少分辨率才能区分不同的元音。

分辨率为1 / T,其中T是FFT窗口的持续时间。

如果您采样了62.5毫秒,则如果您的FFT与采样间隔(1024个样本)相同,则最大分辨率为16 Hz(即每个FFT bin宽16 Hz)。

如果您使用更小的FFT,则分辨率显然会按比例变差。
例如,512点FFT只有32 Hz的分辨率。


感谢您的回复。通常所谓的“共振峰”之间有大约100赫兹的分离。尽管有时会重叠,但它们的第二个共振峰在1000赫兹水平上是非常不同的。因此,我可能会降到128。如果我使用数据长度相等的窗口大小(1024:1024),是否会失去任何东西? - Kadir Haldenbilen
@Kadir:我认为16 Hz的分辨率对于这个问题已经足够了——只要你能够识别出单独的谐波并使用这些信息来确定共振峰,那么你应该没问题。 - Paul R
再次感谢,保罗。那就是问题所在。所有的“能量”似乎都集中在高端。理论上,我应该看到单独的谐波,然后我才能识别共振峰,但我没有看到。既然我对300-3000赫兹频段感兴趣,而这大约是频谱的一半,我是否应该使用类似256p移动平均线的东西? - Kadir Haldenbilen
1
@Kadir:首先,您需要确保FFT正常工作。此外,在进行FFT之前,您需要应用适当的窗口函数(例如Hanning)。对于FFT的输出,您应该计算对数幅度(10*log10(re*re+im*im))- 这应该会给您一个看起来不错的功率谱,具有分贝幅度刻度。 - Paul R

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