STFT Window Size是2048,为什么输出是1025?

信息处理 fft Python stft
2022-02-18 11:04:09

我觉得我在这里有一个脑残,似乎不记得 STFT 输出发生了什么。

考虑 Python 库 Librosa 中的这两行代码:

# Window the time series.
y_frames = util.frame(y, frame_length=n_fft, hop_length=hop_length)

# Pre-allocate the STFT matrix
stft_matrix = np.empty((int(1 + n_fft // 2), y_frames.shape[1]),
                       dtype=dtype,
                       order='F')

在第一行中,我们有一个函数可以创建一个窗口长度为 n_fft (2048) 的矩阵。

然后在下一行,我们预先分配了我们的 STFT,但是我们的窗口长度现在是 1025 而不是 1+n_fft // 2? 这个额外的频率箱来自哪里?为什么不只是 1024?

1个回答

连续傅里叶变换在对实际信号进行计算时具有对称性(厄米对称性)。离散版本,FFT(偶数长度)具有轻微扭曲的对称性。

直流系数(F(0)) 是真实的,以及奈奎斯特 (F(N/2))。在这之间,你得到204822=1023“复杂”系数,在正频率和负频率中“重复”。

所以对于真实信号,每个 STFT 帧可以表示为1023+2频率箱,其余的 1023 由厄米特对称恢复。

您可以在纯实数序列的 FFT 获得补充信息

结果,我们可以看到,如果 N 是偶数,那么F(0)F(N/2)必须是真实的。给定这两个值和复数值F(1)...F(N/21), (IE N 总数) 序列完全表征。