FFT - 什么时候开窗?

Sko*_*der 5 audio fft sampling windowing audio-analysis

我在这里看过各种FFT问题,但我对部分实现感到困惑.我没有实时执行FFT,而是想离线执行.让我们说我有原始数据float[] audio.采样率为44100,因此audio[0] to audio[44099]将包含1秒的音频.如果我的FFT函数处理窗口(例如汉宁),我是否只需将整个audio缓冲区一次性放入函数中?或者,我是否必须将音频切换为4096(我的窗口大小)的块,然后将其输入FFT,然后在顶部执行窗口功能?

Pau*_*l R 2

您可能需要将输入数据复制到单独的缓冲区并以正确的格式获取它,例如,如果您的 FFT 就地,或者如果它需要交错的复杂数据(实数/虚数)。但是,如果您的 FFT 例程可以采用纯真实输入并且不是就地(即非破坏性),那么您可能只需传递指向原始样本数据的指针以及适当的大小参数即可。

通常,对于 1 秒的音频(例如语音或音乐),您会选择与相当稳定的音频块相对应的 FFT 大小,例如 10 毫秒或 20 毫秒。因此,在 44.1 kHz 时,您的 FFT 大小可能是 512 或 1024。然后,您可以通过在缓冲区中前进并在每个起点执行新的 FFT 来生成连续的频谱。请注意,通常的做法是重叠这些连续的缓冲区,通常重叠 50%。因此,如果 N = 1024,您的第一个 FFT 将针对样本 0..1023,第二个 FFT 将针对样本 512..1535,然后是 1024..2047,依此类推。

  • 如果函数名称以“ip”结尾,则它是就地的,例如“vDSP_fft_zrip”。所以是的,将输入数据的每个块复制到合适的 FFT 缓冲区,应用窗口函数(例如 Hann),应用 FFT,计算功率谱或任何您想要做的事情,存储和/或显示该块的功率谱,继续到下一个块... (2认同)