scipy.signal.spectrogram和scipy.signal.stft有什么区别?

15
1个回答

20

简而言之: 如果我按照SciPy文档中给出的输出编写代码: Sxx = Zxx ** 2

解释: 频谱图和短时傅里叶变换是两个不同的对象,但它们非常相似。

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

另一方面,

谱图是一个信号频率谱随时间变化的可视化表示形式。维基百科

谱图基本上将您的信号切成小窗口,并显示一系列颜色,显示这种或那种特定频率的强度。正如STFT所做的那样。实际上它使用了STFT。

现在,区别是什么,按定义,谱图是信号s(t)的短时傅里叶变换(STFT)的平方幅值:

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

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

>>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp)

这是一个工作中的例子,你可以看到一个颜色刻度。但由于abs操作的缘故,它是一个线性的刻度。

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

>>> plt.pcolormesh(t, f, Zxx ** 2, vmin=0, vmax=amp)

1
小问题,但是最后一项不应该是平方,而应该是模长的平方吗? - Eric C.
我不确定我完全理解你的问题,但在L2范数的情况下,如果我将X = [x1,x2,x3,...]写成向量,X ^ 2 = X.X(点积)= | x1 | * | x1 | + | x2 | * | x2 | + | x3 | * | x3 | + ... = | x1 | ^ 2 + | x2 | ^ 2 + | x3 | ^ 2 + ... = | X | ^ 2 所以最终结果是相同的! - ggrelet
2
我的问题是数据是否复杂。您提到谱图是STFT的幅度平方,但在pcolormesh命令中只显示了Zxx ** 2,而我认为可能应该是np.abs(Zxx)** 2? - Eric C.
1
两个函数都有一个可选参数来选择输出内容,对于spectrogramscaling{‘density’,‘spectrum’},对于stftscaling: {‘spectrum’,‘psd’},因此两个函数都可以直接获得振幅和功率。我认为spectrogram没有逆函数来重构信号,而stftistft。原因可能是如何管理重叠 - mins

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