小智 16

Tl; dr:如果我用 SciPy 文档给出的输出写它:Sxx = Zxx ** 2

说明:频谱图和短时傅立叶变换是两个不同的对象,但它们却非常接近。

短时傅里叶变换 (STFT) 是一种傅里叶相关变换,用于确定信号局部部分的正弦频率和相位内容,因为它随时间变化。在实践中,计算 STFT 的过程是将较长时间的信号分成相等长度的较短段,然后在每个较短的段上分别计算傅立叶变换。这揭示了每个较短段的傅立叶频谱。然后通常将变化的光谱绘制为时间的函数。维基百科

另一方面,

频谱图是信号频率随时间变化的频谱的直观表示。维基百科

频谱图基本上在小窗口中切割您的信号,并显示一系列颜色,显示该特定频率的强度。与 STFT 完全一样。事实上,它正在使用 STFT。

现在,对于差异,根据定义,频谱图是信号的短时傅立叶变换 (STFT) 的平方幅度s(t)

spectrogram(t, w) = |STFT(t, w)|^2

scipy.signal.stft页面底部显示的示例显示:

>>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp)
Run Code Online (Sandbox Code Playgroud)

它正在工作,您可以看到色标。但由于abs操作,它是线性的。

实际上,要获得真正的频谱图,应该这样写:

>>> plt.pcolormesh(t, f, Zxx ** 2, vmin=0, vmax=amp)
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是数据是否复杂。您提到频谱图是 STFT 幅度的平方,但随后在 pcolormesh 命令中显示,仅采用 Zxx ** 2,而我认为也许应该是 np.abs(Zxx)**2? (2认同)