如何解决令人讨厌的频谱图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的频谱图文档:
- npersegint,可选每个段的长度。默认为无,但如果window是str或tuple,则设置为256,并且如果window是array_like, 设置为窗口的长度。
- noverlapint,可选 段之间重叠的点数。如果为None,则noverlap = nperseg // // 8.默认为None
- 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。