Matplotlib - 带有 Specgram 的频率箱数量错误

Matplotlib - Wrong number of Frequency bins with Specgram

据我所知,在 FFT 中,频率仓的数量恰好是样本数 / 2。

但是,matplotlib.specgram 给了我一箱太多。

fig, [ax1, ax2, ax3] = plt.subplots(nrows=3, ncols=1)    
Pxx, freqs, times, im = ax3.specgram(raw_normalized, NFFT=1024, Fs=sampleRate, noverlap=overlap, window=matplotlib.mlab.window_none, scale='linear')

Pxx 包含频谱图的数组,它应该有 512 个 bin(由于样本数设置为 1024),但它有 513 个。 我对 FFT 的理解有问题吗,或者 matplotlib 库中有什么东西 wrong/quirky?

只是一个大胆的猜测,但如果您将 NFFT 设置为 1024,它应该有 1024 个 bin。但是,如果您的输入是实数值,则这些值应该是对称的。第 0 个值应该是直流值,第 512 个值应该是频率最高的值。第 511 和 513 应该相同,因此频谱图可能会过滤掉对称值,因为它知道输入是实值。所以你得到 513 个值。 (因为隐藏了第 513 到第 1023 个值;当然从 #0 开始计数)

其背后的原因是 FFT 在您的数据之上折叠了一个 'rotating' 值。它开始缓慢旋转,#0 是直流值,然后是#1,这是整个数据的旋转一圈。 #2 是两次旋转,依此类推。

#512 是对 1024 点数据进行 512 次旋转,这意味着每 2 个样本进行一次完整旋转。这是您的数据的奈奎斯特频率,高于该频率的所有内容都会出现混叠。因此 #513 看起来与 #511 相同,只是 反向旋转 。 #1023 与#1 相同,只是单次旋转,但方向相反。

对于复数数据,顺时针旋转和逆时针旋转折叠有区别,但对于实值数据是一样的。 因此可以丢弃值 #513 到 #1023,为您留下 513 个有意义的桶。

另一个细节:从技术上讲,FFT 的输出值总是复数,即使是实值输入,并且包含幅度和相位信息,但您的库可能会过滤掉相位信息,只给出幅度,将其转换回实值输出值。