前陣子幫朋友看一份 2023 年花蓮近海的強震記錄,Steim2 壓縮的 miniSEED,總共 47 個檔案、約 1.2 GB,來自三站短週期與強震儀。用 ObsPy 讀進來後畫頻譜,發現 8 Hz 附近有一條很尖的突起,三站都有,但強震儀那站特別明顯。我原本以為是儀器雜訊,差點把那段資料整批標成壞軌。
做法是把每個 stream 的取樣率與實際時間戳印出來,先確認是不是重採樣造成的:
import obspy
st = obspy.read("*.mseed")
for tr in st:
print(tr.id, tr.stats.sampling_rate, tr.stats.starttime,
tr.stats.npts / tr.stats.sampling_rate)
st.merge(method=1, fill_value=0)
for tr in st:
tr.detrend("linear")
tr.taper(max_percentage=0.05, type="hann")
tr.filter("bandpass", freqmin=0.5, freqmax=20.0, corners=4, zerophase=True)
印出來才看到,檔案裡混了 100 Hz 與 200 Hz 兩種取樣率,同一站不同頻道也不一致。merge 不會幫你統一取樣率,只會把時間重疊的段接起來;頻譜上那條尖峰其實是 200 Hz 資料被當成 100 Hz 解讀後的鏡像。改成先 st.select(sampling_rate=100) 或明確 tr.resample(100, window="hann"),尖峰就消失了。
會這樣做是因為 miniSEED 檔頭只描述封包,不保證同批檔案的取樣率一致;工具預設信任檔頭,於是不一致的地方不會報錯,只會默默算錯。代價是每次多花幾秒掃一遍 stats,好處是不用等到頻譜圖出來才發現。
失效的地方在於:如果原始資料本來就是 200 Hz 且你要保留高頻,重採樣反而會把 20 Hz 以上的東西濾掉;另外儀器本身的 anti-alias 濾波器若沒補償,就算取樣率對了,8 Hz 附近仍可能有人造痕跡。我自己就曾經把換能器的共振當成地震信號,回頭比對才發現是取樣率搞錯。
你們在處理多站、多頻道的 miniSEED 時,是怎麼在讀取階段就擋掉取樣率不一致的?還是都等畫圖才發現?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。