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()
给定一个 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()