鉴于40 Hz非平稳信号,共有4800个样本,我想生成一个带有适当参数的频谱图,我想知道如何最好地在scipy.signal.spectrogram
中设置参数以使用一个窗口5秒和2.5秒重叠。
以下是否正确?
f, t, Sxx = signal.spectrogram(trace.data, fs=40, nperseg=200, window=('hamming'), noverlap=100)
如果我使用不同的窗口技术,即需要宽度的slepian
,我会感到有些困惑。与slepian
窗口一起使用的宽度与nperseg
参数之间有什么区别?此外,应用零填充(nfft
)会带来什么好处?
感谢。
答案 0 :(得分:1)
参数化似乎是正确的,假设 40 Hz信号表示信号以每秒40个样本的速率记录。
使用nfft
进行零填充的效果使得频谱更平滑,并且可以通过将FFT长度设置为良好的值(小的素数的倍数,例如2的幂通常很好)来帮助提高计算性能
窗口宽度与nperseg
之间的差异在于宽度决定窗口的形状,nperseg
是窗口包含的样本数。例如,您可以有一个包含许多样本的窗口,但如果它们中的大多数接近于零,那么有效窗口长度会更短。
我想这最好用图像说明:
使用相同数量的样本,您可以拥有更宽或更窄的窗口,而样本数量基本上只能解析窗口形状的精细度。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import windows as wnd
i = 0
for n in [10, 20]:
for width in [0.2, 0.9]:
i += 1
plt.subplot(2, 2, i)
plt.stem(wnd.slepian(n, width))
plt.title('n={}, width={}'.format(n, width))
plt.tight_layout()
plt.show()