【问题标题】:Matplotlib - Wrong number of Frequency bins with SpecgramMatplotlib - 带有 Specgram 的频率箱数错误
【发布时间】:2021-04-15 01:47:34
【问题描述】:

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

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

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 库中有什么问题/古怪?

【问题讨论】:

    标签: python matplotlib fft


    【解决方案1】:

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

    这背后的原因是 FFT 在您的数据之上折叠了一个“旋转”值。它开始缓慢旋转,#0 是 dc 值,然后是 #1,它是对整个数据进行一次旋转。 #2 是两次旋转,以此类推。

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

    对于复值数据,顺时针旋转和逆时针旋转折叠会有所不同,但对于实值数据则相同。 因此可以丢弃 #513 到 #1023 的值,留下 513 个有意义的桶。

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

    【讨论】:

    • 非常感谢您的详细回答。这对我加深对 FFT 的理解有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2016-12-05
    相关资源
    最近更新 更多