Scipy 频谱图所需的参数

Parameters required for Scipy Spectrogram

给定一个 40 Hz 的非平稳信号,总共有 4800 个样本,我想生成一个具有适当参数的频谱图,我想知道如何最好地设置 scipy.signal.spectrogram 中的参数以使用window 5 秒和 2.5 秒重叠。

以下是否正确?

f, t, Sxx = signal.spectrogram(trace.data, fs=40, nperseg=200, window=('hamming'), noverlap=100)

如果我使用不同的 windowing 技术,即需要宽度的 slepian,我会感到有些困惑。 slepian window 和 nperseg 参数使用的宽度有什么区别?另外,应用零填充 (nfft) 有什么好处?

谢谢。

参数化似乎是正确的,假设使用 40 Hz 信号 你的意思是一个以每秒 40 个样本的速率记录的信号。

nfft 零填充的效果是使频谱更平滑,它可以通过使 FFT 长度达到一个好的值来帮助提高计算性能(小素数的倍数,例如 2 的幂通常有效嗯)。

宽度window和nperseg的区别在于,宽度决定了window的形状,nperseg是window的样本数包含。例如,您可以有一个包含许多样本的 window,但如果大多数样本接近于零,则 有效 window 长度 会更短。

我想这最好用图片来说明:

使用相同数量的样本,您可以得到更宽或更窄的 window,而样本数量基本上只决定 window 形状的分辨率。

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