令人讨厌的频谱图ValueError重叠度必须小于n

问题描述

我使用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)  

*点是我数据中的任意点

*初始采样率为124.99

然后执行频谱图

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

我收到以下错误:

*** ValueError:noverlap必须小于n

为什么会这样?

解决方法

经过一番挖掘,我设法弄清了问题所在。内插地震波后,我遇到了FFT重叠长度的问题。通过查看scipy和obspy的频谱图文档:

scipy

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

obspy

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

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

这会引起source code

中的错误
if noverlap >= n:
    raise ValueError('noverlap must be less than n')

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

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

wlen = 10 解决了我的问题。因此,代码如下:

tr2.spectrogram(log=True,title='Spectrogram'),wlen=10)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...