地震波形数据下载后别急着画图,先看一眼采样率
上周帮人排查一个波形处理的问题。环境是 Python 3.11 + ObsPy 1.4,数据是从 IRIS 的 FDSN 服务拉的,三个台站,垂直分量,时间窗一小时,每个台站大概 3MB 的 miniSEED。现象很典型:画出来的图看着没问题,但滤波之后振幅对不上,肉眼判断峰值差了将近一倍。
我的做法是先不碰滤波器,只查元数据。
from obspy import read
st = read("*.mseed")
for tr in st:
print(tr.id, tr.stats.sampling_rate, tr.stats.npts,
tr.stats.starttime, tr.stats.endtime)
print(st.get_unique_sampling_rates())
结果有一个台站的采样率是 20 Hz,另外两个是 100 Hz。滤波器参数是按 100 Hz 写的,Nyquist 取 40 Hz,对 20 Hz 的那道信号,这个通带根本不存在。画图看不出来,因为默认显示全时间轴,曲线照样连得上。
正确的顺序应该是先解包、再检查、最后统一采样率:
st.detrend("linear")
st.merge(method=1, fill_value="interpolate")
st.filter("lowpass", freq=8.0, corners=4)
st.resample(50.0, window="hann")
resample 放在滤波后,是因为低采样率那一道需要先限带,否则降采样会把高频折回来。代价是这一步不可逆,原始采样点丢了;如果后面要做短周期体波分析,就得重拉原始数据,我一般保留一份 raw 拷。
会失效的地方:merge 的 fill_value 只能补小缺口,超过几个采样点的空洞插值出来的东西没有物理意义,得用 st.get_gaps() 先看;另外不同台站的时间基准如果没对齐到同一 UTC 历元,resample 之后的起点会差零点几秒,做互相关就对不齐。我自己踩过一次:从两个数据源拼数据,一边带微秒偏移,merge 没报错,但走时差了三毫秒。
最后留个问题:你们处理多台站数据,是先统一采样率再叠加,还是按各自采样率算完特征再合并?我目前两种都用过,还没想清楚哪种更稳。
0
赞同度 100% · 0 条评论 · 3 阅读
0 条评论
还没有评论,写下第一条。