在fft中应用窗口函数的正确方法

时间:2015-03-29 14:09:40

标签: android audio fft windowing

我理解为什么我需要在fft中使用窗口函数,我记录正弦波(16位pcm格式),我有正弦波音频记录,我想分析,我已将麦克风音频录制成一个字节数组,将其转换回代表正弦波的样本数组,其值为[-1,1] - 值除以32768.我是否需要在数组上应用具有值[-1,1]的窗口(除以一个)或者我是否需要将它应用于样品阵列而不将其除以32768?我在SO和google上查找了一些答案,无法找到正确方法的解释。

1 个答案:

答案 0 :(得分:1)

linear-time-invariant的一个属性是,多个线性时不变系统的级联结果是相同的,无论操作的顺序如何(至少在理论上,在实践中过滤器)并且这样可以具有小的非线性,这可以使结果根据顺序略微不同。)

从理论的角度来看,对所有样本应用恒定比例因子可以看作是一个线性时不变系统。对于特定的计算机实现,缩放也可以被认为是近似线性时不变的,只要缩放不会引入显着的精度损失(例如,通过将数字缩放到浮点最小可表示值附近的值),也不会导致失真。缩放支持范围之外的值。在你的情况下,简单地除以32768很可能不会引入显着的失真,因此可以被认为是一个(近似)线性时不变的系统。

类似地,应用一个窗口,将每个样本乘以不同的窗口值,也可以看作另一个线性时不变系统。

确定您拥有这样一系列线性时不变系统后,您可以在应用窗口之前或之后执行32768的缩放。

PS:正如Paul在评论中提到的那样,如果你要使用浮点运算,你可能想先执行从16位字到浮点(无论是否缩放)的转换之后的点值。尝试在定点算术中执行缩放可能比必要的更复杂,并且如果不仔细地进行,可能会导致我在上面提到的精度损失。