我正在尝试对流式音频数据进行快速频谱分析以捕获元音(类似于JLip-sync)。使用PyAudio以小块(1024)捕获语音数据的持续时间很短(0.0625秒)。使用numpy.fft进行分析,并使用numpy.hanning窗口消除泄漏。我使用4096 * 4作为采样率(不是44100或22050,也可以讨论; 4096 * 4最接近22050)。
考虑到我感兴趣的频率(范围从300 Hz到3000Hz),如何使用我想要的数据长度和最小/最大频率计算理想窗口大小?
感谢。
卡迪尔
答案 0 :(得分:5)
@Kadir:
在使用离散傅里叶变换(DFT或FFT)处理数据之前对数据进行窗口化的目的是最大限度地减少频谱泄漏,当您尝试对非循环数据进行傅里叶变换时会发生这种情况。
窗口化的工作原理是将数据在序列的开始和结束时平滑地强制为零,但不是之前。缩短窗口会不必要地破坏信息。
因此,您的窗口长度应与样本序列的长度相匹配。例如,对于1024个样本,您的窗口长度应为1024。
如果要分辨的最高频率为3 KHz,请以不同的采样率使用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
不要忘记在此处发布您的结果。
答案 1 :(得分:4)
关键因素是在频域中需要多少分辨率来区分不同的元音。分辨率为1 / T
,其中T
是FFT窗口的持续时间。因此,如果您采样62.5 ms,那么如果您的FFT与采样间隔(1024个采样)的大小相同,则最大分辨率为16 Hz(即每个FFT区间为16 Hz宽)。如果你去一个较小的FFT,那么显然你的分辨率会相应地恶化,例如512点FFT只有32 Hz的分辨率。