Scipy频谱图所需的参数

时间:2018-01-03 15:50:13

标签: python scipy spectrogram

鉴于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)会带来什么好处?

感谢。

1 个答案:

答案 0 :(得分:1)

参数化似乎是正确的,假设 40 Hz信号表示信号以每秒40个样本的速率记录。

使用nfft进行零填充的效果使得频谱更平滑,并且可以通过将FFT长度设置为良好的值(小的素数的倍数,例如2的幂通常很好)来帮助提高计算性能

窗口宽度与nperseg之间的差异在于宽度决定窗口的形状,nperseg是窗口包含的样本数。例如,您可以有一个包含许多样本的窗口,但如果它们中的大多数接近于零,那么有效窗口长度会更短。

我想这最好用图像说明:

enter image description here

使用相同数量的样本,您可以拥有更宽或更窄的窗口,而样本数量基本上只能解析窗口形状的精细度。

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()