与返回的时间向量有关的问题s i g n a l 。s p e c t r o g r a msignal.spectrogram功能

信息处理 fft 离散信号 stft 时间序列 scipy
2022-02-04 20:09:51

我对建立频谱图的一些非常简单的概念感到困惑。

这是该问题的一个玩具示例:

import numpy as np
import scipy
from scipy import signal
import matplotlib.pyplot as plt

f0 = 5
t = 2 
fs = 250
N = t*fs
t = np.linspace(0, t, N, endpoint=False)
x = np.sin(2*scipy.pi*f0*t)
f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

我得到什么让我t困惑,我得到了[0.512,1.408]我希望得到一个从几秒开始的阵列0.0-2.0所以如果我想在 1.8 秒内看到功率谱密度,我可以很容易地做到这一点。

我可能会错过一些非常基本的东西,所以如果有人能对此有所了解,那就太好了。

麦克风。

1个回答

的默认参数为signal.spectrogram

nperseg = 256
noverlap = nperseg/8 = 32

这意味着:

  • 分析窗口的长度为个样本(秒)256256/250=1.024
  • 连续窗口之间的重叠是样本(秒)3232/250=0.128

返回的时间戳signal.spectrogram对应于窗口的中心。因此,在您的情况下,第一个时间戳应为样本,在采样频率为的情况下,这等于秒。256/2=1280.512250Hz

下一个窗口的开头将移动个样本(是重叠),因此其中心将位于样本(对应于秒)。第二个窗口的末尾有样本,因此没有足够的数据来处理更多帧。25632=22432224+128=3521.408480

这解释了为什么你的时间向量是[0.512, 1.408]

这是一个图形解释:

在此处输入图像描述

所以如果要实现特定的频率间隔,就必须修改npersegnoverlap参数。