2

我使用 obspy 处理地震数据,我想为我的数据获取频谱图。当我将频谱图函数应用于初始数据时,一切正常。

st.spectrogram(log=True, title='BW.RJOB ' + str(st[0].stats.starttime))

但是,当我对数据进行切片和插值时

tr = st[0]
sr=4.9999
tr2 = tr.slice(point - 20, point + 180)

tr2.interpolate(sampling_rate=sr)  

*point 是我数据中的任意点

*初始采样率为 124.99

然后执行频谱图

tr2.spectrogram(log=True, title='BW.RJOB ' + str(tr2.stats.starttime))

我收到以下错误:

*** ValueError:noverlap 必须小于 n

为什么会这样?

4

1 回答 1

2

经过一番挖掘,我设法找出问题所在。在对地震波进行插值后,我遇到了 FFT 中重叠长度的问题。通过查看来自 scipy 和 obspy 的频谱图文档:

scipy

  • npersegint,可选 每个段的长度。默认为 None,但如果 window 是 str 或 tuple,则设置为 256,如果 window 是 array_like,则设置为窗口的长度。
  • noverlapint, 可选 段之间重叠的点数。如果没有,noverlap = nperseg // 8. 默认为无

狡猾的

  • wlen:fft 的窗口长度,以秒为单位。如果此参数太小,则计算将永远进行。如果没有,则默认为 (samp_rate/100.0)

我的地震轨迹的 1000 npts 和 FFT 的 256/8=32 窗口导致了这个问题。

这会引发源代码中的错误

if noverlap >= n:
    raise ValueError('noverlap must be less than n')

其中 n 是每个窗口中的数据点数。

因此每个窗口中的数据点数大于相邻窗口之间的重叠数。

wlen =10解决了我的问题。所以现在的代码如下:

tr2.spectrogram(log=True, title='Spectrogram'),wlen=10)
于 2020-11-05T11:03:59.933 回答