Matplotlib 声谱图与 STFT

Matplotlib spectrogram versus STFT

我目前正在使用 matplotlib 计算频谱图。我指定 NFFT=512,但生成的图像的高度为 257。然后我尝试只执行 STFT(短时傅里叶变换),它给我 512 维向量(如预期)。如果我绘制 STFT 的结果,我可以看到 512 个值中的一半只是镜像,所以实际上我只得到 257 个值(就像 matplotlib)。有人可以向我解释为什么会这样吗?我一直认为FT是基础变换,为什么会引入这种冗余?

谢谢。

冗余是因为您将严格实数的信号输入到您的 FFT,因此 DFT 结果是复共轭(厄米)对称的。这种冗余是由于严格实数输入的所有虚部都为零。但是这个 DFT 的输出可以包括非零虚部来指示相位。因此,这个 DFT 结果必须是共轭对称的,这样结果中的所有虚部都将在两个 DFT 结果的一半(幅度相同,但相位相反)之间抵消,表明严格的实数输入。此外,基础变换的较低 257 个 bin 将具有 512 个(缩放器)自由度,就像输入一样。但是,频谱图会丢弃所有相位信息,因此它只能显示 257 个唯一值(仅幅度)。

如果您将复数(例如正交)信号输入到 DFT,则可能不会有 Hermitian 冗余,并且您将从 512 长度的 DFT 获得 1024 个自由度。

如果您想要 512 的图像高度(给定真实输入),请尝试 1024 的 FFT 大小。