Audio FFT的窗口大小与数据长度

Audio FFT的窗口大小与数据长度,audio,window,size,fft,Audio,Window,Size,Fft,我正在尝试对流式音频数据进行快速频谱分析,以捕获元音(类似于JLip同步)。使用PyAudio在短时间(0.0625秒)内以小块(1024)的形式捕获语音数据。使用numpy.fft进行分析,并使用numpy.hanning窗口消除泄漏。我使用4096*4作为采样率(不是44100或22050,也可以讨论;4096*4最接近22050) 考虑到我感兴趣的频率(从300Hz到3000Hz),如何使用我所寻找的数据长度和最小/最大频率来计算理想的窗口大小 谢谢 Kadir关键因素是在频域中区分不同元

我正在尝试对流式音频数据进行快速频谱分析,以捕获元音(类似于JLip同步)。使用PyAudio在短时间(0.0625秒)内以小块(1024)的形式捕获语音数据。使用numpy.fft进行分析,并使用numpy.hanning窗口消除泄漏。我使用4096*4作为采样率(不是44100或22050,也可以讨论;4096*4最接近22050)

考虑到我感兴趣的频率(从300Hz到3000Hz),如何使用我所寻找的数据长度和最小/最大频率来计算理想的窗口大小

谢谢


Kadir

关键因素是在频域中区分不同元音所需的分辨率。分辨率为
1/T
,其中
T
是FFT窗口的持续时间。因此,如果采样时间为62.5 ms,那么如果FFT的大小与采样间隔(1024个采样)相同,则最大分辨率为16 Hz(即每个FFT单元的宽度为16 Hz)。如果使用较小的FFT,则分辨率显然会相应降低,例如,512点FFT的分辨率仅为32 Hz。

@Kadir:

在使用离散傅里叶变换(DFT或FFT)处理数据之前对数据加窗的目的是最大限度地减少频谱泄漏,这是在尝试对非周期数据进行傅里叶变换时发生的

窗口化的工作原理是,在序列的开始和结束处,而不是之前,将数据平滑地置零。缩短窗口会不必要地破坏信息

因此,窗口长度应该与样本序列的长度相匹配。例如,对于1024个样本,窗口长度应该是1024

如果要解析的最高频率为3 KHz,请在各种采样率下使用8192个或更多样本,例如16384或32768个样本

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

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

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

您可以使用Matlab执行此操作:

或使用此在线FFT频谱分析仪:


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

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