matlab spectrum returns FRAME 比预期的多

matlab spectrum returns more FRAME than expected

我正在使用以下代码从 np 数组中获取 specgram2D:

specgram2D, freq, time = mlab.specgram(samples, Fs=11025, NFFT=1024, window=mlab.window_hanning, noverlap=int(1024 * 0.5))

然后我打印出specgram2D喜欢

print len(specgram2D)  # returns 513

我得到了 513 而不是预期的 512,它是 window 大小的一半。

我做错了什么?

我可以忽略 specgram2D[512] 吗?

I got 513 instead of expected 512 which is half the window size.

What am I doing wrong?

对于实值信号,从Discrete Fourier Transform (DFT)获得的频谱是对称的,因此只需要一半的频谱来描述整个频谱(因为另一半可以从对称性中获得) .这可能就是为什么您期望大小恰好是输入 window 1024 大小的一半。

问题在于,对于均匀大小的输入,频谱的中点恰好落在频率仓上。因此,该频率仓是其自身的对称性。为了说明这一点,可以从下图中看出对称性:

frequency:  0   fs/N  ...       fs/2     ...       fs
bin number: 0    1    ...   511 512  513 ... 1023 1024
            ^    ^           ^  ^ ^   ^       ^    ^
            |    |           |  |-|   |       |    |
            |    |           |        |       |    |
            |    |           |--------|       |    |
            |    |                            |    |
            |    |----------------------------|    |
            |                                      |
            |--------------------------------------|

其中 N 是 FFT 的大小(由 NFFT=1024 参数确定),fs 是采样频率。如您所见,通过采用 bin 0 到 512 inclusive 完全指定了频谱。相应地,您应该期望大小为 floor(N/2)+1(简单地 N/2 + 1 进行整数除法,但我包括 floor 以强调向下舍入操作),或者在您的情况下为 513。

Can I just ignore specgram2D[512]?

如前所示,它是频谱的组成部分,但许多应用程序并不特别需要每个频率仓(即忽略该仓取决于您的应用程序是否对其他频率分量最感兴趣)。