MATLAB频谱返回的FRAME比预期的多。

3
我使用以下代码从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,这只有窗口大小的一半。

我做错了什么?

我可以忽略specgram2D [512]吗?

1个回答

1
我得到了513而不是期望的512,这是窗口大小的一半。 我做错了什么?
对于实值信号,从离散傅里叶变换(DFT)获得的频谱是对称的,因此只需要使用频谱的一半来描述整个频谱(因为可以通过对称性获得另一半)。这可能就是你预计大小应该正好是输入窗口大小1024的一半的原因。
问题在于,对于偶数大小的输入,频谱的中点恰好落在一个频率bin上。因此,该频率bin是其自身的对称。为了说明这一点,可以从以下图表中看到对称性:
frequency:  0   fs/N  ...       fs/2     ...       fs
bin number: 0    1    ...   511 512  513 ... 1023 1024
            ^    ^           ^  ^ ^   ^       ^    ^
            |    |           |  |-|   |       |    |
            |    |           |        |       |    |
            |    |           |--------|       |    |
            |    |                            |    |
            |    |----------------------------|    |
            |                                      |
            |--------------------------------------|

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

我可以忽略specgram2D[512]吗?

正如先前所示,它是频谱的一个重要组成部分,但许多应用程序并不特别需要每个单独的频率bin(即是否忽略该bin取决于您的应用程序主要关注其他频率成分)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接