简介:地震数据处理中,标准地震数据交换格式(SEED)的解析与应用常依赖专业工具,这份打包好的工具集正是为此设计。它主要面向地震学研究人员、数据管理工程师以及高等院校相关专业学生,帮助用户从大型数据文件中提取指定时段与台站记录,完成格式转换、完整性检查和基础时间序列分析。该版本在早期功能基础上做了优化,能够将数据转换为 SAC、Mini-SEED 等下游常用格式,也保留了数据归档与质量修复能力。资源包共包含 246 个文件,以 210 个 C 语言源文件为核心,配合 11 个头文件与 8 个 makefile 编译脚本,便于研究者阅读源码、自行编译或修改功能;同时附带了 PDF 格式说明文档和可执行程序,压缩包整体约 2.03MB,重量轻、易部署。目前已有四百零三人学习使用过。通过随包附带的说明文件与更新日志,用户可以快速理解命令行调用方式和参数含义,掌握从原始数据到分析可用波形的工作流程,从而更高效地推进震相识别、震源机制计算或地震监测相关研究。
1. rdseed v5.2:把 SEED 地震数据转成 SAC 的必备工具
做地震数据处理的人,几乎都遇到过这种情况:从台网中心拷回来一堆 .seed 文件,头段信息完整,波形也在里面,但你的数据处理流程是围绕 SAC 搭的,直接读不进去。这时候 rdseed 就是那个绕不开的桥。rdseed 是 IRIS 出品的 SEED 格式解析工具,v5.2 这个 tar.gz 包虽然年头不短,但可靠、轻量,被无数处理脚本当底层依赖用。它负责把 SEED 里的控制头段拆开、把波形数据抽出来,输出成 SAC 等常见格式。如果你需要处理的是台站事件数据,或者想把 miniSEED 补上头段再转格式,rdseed 都能用。这篇笔记我会把安装、转换、参数设置、踩坑点一次说清楚,新手能照着跑通,熟手也能回来核对一些细节。
2. 为什么是 rdseed:SEED 格式的读取逻辑与选型理由
2.1 SEED 格式到底长什么样:波形与头段分离
SEED(Standard for the Exchange of Earthquake Data)本身不是一种简单的波形文件,它把元数据和波形数据分成两类记录:控制头段(Control Headers)和数据记录(Data Records)。控制头段里装着台网、台站、通道、经纬度、采样率、仪器响应、时间校正这些信息,数据记录则是按固定块大小存放的整型或浮点采样点。两者混合在一个文件里,靠特定的 Blockette 编号来区分。直接读这种文件,你得自己解析 Blockette,而 rdseed 的作用就是把这层解析封装成命令。
rdseed 读取 SEED 后,会先把控制头段里的关键信息提取出来,比如 Station、Channel、Start time、Sample rate,然后根据这些信息把数据记录拆成独立的连续波形段。如果你处理的是 miniSEED,那情况又不一样——它只有数据记录,没有控制头段,rdseed 需要配合-R等参数来忽略头段缺失,或者从外部提供台站信息。这是 rdseed 最容易被误解的地方:它不只是"转换格式",它是"解析 SEED 结构"。
理解了这一点,你就知道为什么处理 SEED 时不能图省事直接用二进制读取工具硬切。SEED 里一个文件可能包含多个台站、多个通道,通道之间还可能存在重叠或时间不连续,rdseed 会按时间连续性自动切分事件,并生成对应的 SAC 文件。这个切分逻辑在 v5.2 里已经非常成熟,比很多自写脚本靠谱得多。
2.2 对比:rdseed、SAC rseed、ObsPy,谁更合适
处理 SEED 数据,常见的方案还有 SAC 自带命令 rseed 和 Python 库 ObsPy。我列个对比,方便你在自己的环境里选:
| 对比项 | rdseed v5.2 | SAC rseed | ObsPy read |
|---|---|---|---|
| 运行方式 | 独立命令行 | SAC 内交互命令 | Python API |
| 批量处理 | 脚本友好 | 一般 | 灵活 |
| miniSEED 头段补全 | 支持较好 | 较弱 | 需配合 inventory |
| 依赖环境 | 只需 C 编译环境 | 需装 SAC | 需装 Python 环境 |
| 处理大文件稳定性 | 高 | 中等 | 中等 |
| 生成 SAC 命名可控性 | 强 | 弱 | 需自己重命名 |
如果你只处理几个文件,用 ObsPy 写三行代码也行。但如果你要批量处理几十 GB 的 SEED,rdseed 的稳定性和命名控制优势就出来了。而且它不会因为某个通道数据异常就抛异常终止整个流程——这一点在自动化脚本里特别值钱。SAC rseed 的问题在于它嵌在 SAC 环境里,不方便直接嵌入 shell 管道,而且对头段缺失的容错差点。所以我的做法是:标准化处理一律走 rdseed,需要复杂滤波或后续分析再进 SAC 或 ObsPy。
2.3 拿到 tar.gz 之后:解压、编译与安装
这份 rdseedv5.2.tar.gz 是源码包,需要自己编译。下载后先解压:
tar -xzvf rdseedv5.2.tar.gz cd rdseed5.2 ls解压后目录里一般会有src/、README、Makefile。打开 README 看一眼厂商要求的编译方式,常见做法是直接make。如果你的系统缺少 gcc,需要先装上。我一般会先跑一下./configure(如果提供),没有就直接make -f Makefile。
# 在解压目录内编译 make # 编译完成后,把生成的 rdseed 放到系统 PATH cp rdseed /usr/local/bin/编译过程参数很少,主要看系统架构。v5.2 的代码在 Linux 和 macOS 上都能编过,个别系统需要改一下 Makefile 里的CFLAGS,比如加-D_LARGEFILE64_SOURCE来支持 2GB 以上的大文件。这个坑后面我细说。装好后验证一下:
rdseed -h如果能看到帮助信息,说明环境就绪了。注意,rdseed 输出的是标准错误信息,很多新手会把-h的输出当成错误,其实这是正常提示。
2.4 把仪器响应也准备好:RESP 文件的价值
处理宽频带数据时,后续做去仪器响应是必经步骤。rdseed 可以把 SEED 里的仪器响应参数单独导出成 RESP 文件,这个文件比 SAC 头段里的 poles/zeros 更完整,包含归一化因子、灵敏度、A0 等细节。导出 RESP 的命令是:
rdseed -S -g -R -o out mydata.seed这里-R表示同时生成 RESP 文件。生成的文件名类似RESP.NM.CA.M.BHE,直接喂给 SAC 的readresp或者 ObsPy 的read_response都行。注意,-R需要 SEED 控制头段里包含 Blockette 53 等仪器响应模块,如果缺了这模块,rdseed 会警告但不影响波形导出。我的建议是转换时顺手加上-R,RESP 文件很小,留着不占地方,省得到时候要处理响应却找不到原始 SEED。
3. 核心实战:一条命令把 SEED 转成 SAC
3.1 准备工作:先弄清楚你的 SEED 是哪种
在执行转换前,我习惯用file命令先看一眼输入文件的真实类型:
file mydata.seed正常 SEED 文件会输出类似ASCII text或data,因为 SEED 本身是二进制和 ASCII 混合结构。如果显示gzip compressed,说明你拿到的是压缩包,得先解压。如果显示data且文件很小,那可能是 miniSEED。区分 SEED 和 miniSEED 最简单的方法是看文件头部是不是以000000或000001开头的 ASCII 控制头段块。rdseed 在处理时也会给你提示。
另外,建议在转换前先把台站信息拿到手。比如你想知道文件里到底有哪些台站和通道,可以先跑:
rdseed -p mydata.seed-p参数会打印 SEED 中所有台站摘要,包括台网、台站、通道、经纬度、采样率。这一步能帮你确认输入文件没有坏掉,也能让你提前规划输出文件名。我每次处理新数据源都会强制先跑一遍-p,相当于给数据做体检。
3.2 基本转换命令:-S -p -g 的搭配
最常用的转换命令是:
rdseed -S -p -g -o sac_output mydata.seed这条命令的含义是:-S输出 SAC 文件;-p同时打印台站信息到屏幕;-g使用全局命名规则,生成类似NM.CA.M.BHE.--.SAC的文件名,这样台网、台站、通道都在文件名里,不会混淆;-o sac_output指定输出目录,不写的话文件直接落在当前目录。
参数补充说明:
-S是必须的,没有它 rdseed 只会解析不输出 SAC。-p适合小批量验证,大批量时建议去掉,否则刷屏很严重。-g生成的名字带点分分隔,后续用 SAC 读取时,通配符*匹配比较方便。-o指定的目录必须提前存在,rdseed 不会自动递归创建。
rdseed还有很多用于控制切分行为的参数。比如-b可以指定开始时间,-e指定结束时间,-t指定时间窗口秒数。这些参数在处理连续记录时特别有用。比如你只需要某一天的数据,可以这样:
rdseed -S -g -b 2023:001:00:00:00.000 -e 2023:002:00:00:00.000 mydata.seed时间格式是年:年日:时:分:秒.毫秒。注意年日是第几天,不是月份。这个格式和 SEED 控制头段保持一致,用-p输出里的时间字段可以直接复制。
如果你想同时输出 SEED 格式的响应文件(仪器响应),可以加-R或单独指定响应输出参数。转换成功的标志是终端出现类似1 shm//BHZ这样的统计行,并且在输出目录出现.SAC文件。如果什么都没有,立刻回头检查上一步的-p输出。
3.3 检查生成结果:SAC 头段里有什么
转换完成后,用 SAC 自带的 read 命令或saclst检查头段:
saclst KNETWK KSTNM KCMPNM B date o sac_output/*.SAC如果输出中台网、台站、通道和开始时间都有值,说明转换成功。这里特别看两个字段:B是参考时刻,o是事件相对时刻。rdseed 会把 SEED 控制头段里的时间信息映射到 SAC 头段,但如果 SEED 本身没有事件时间,o可能为 0。这是正常的,别慌。
再看一个实际输出文件的例子。假设-p里看到台站JRSC的通道HHE和HHN各有两段不连续记录,-g会生成:
JRSC.HHE.--.2023.001.00.00.00.SAC JRSC.HHE.--.2023.001.00.05.00.SAC JRSC.HHN.--.2023.001.00.00.00.SAC文件名里时间部分是这段记录的开始时间。如果你需要把同一台站同一通道的多段数据合并,可以用 SAC 的merge命令。但注意,rdseed 切分是按时间连续性判断的,如果两个数据记录之间只有很短的间隙(默认小于采样间隔),它可能仍然合并成一段。这个阈值取决于 SEED 头段里的Record length,不是固定值。碰到边界情况,用-p的输出人工核对最稳妥。另外一个容易忽略的点:rdseed 生成的 SAC 文件里,IZTYPE(时间类型)默认可能是.5(unknown)。后续做到时序分析时,你可能需要根据实际波形事件类型重置IZTYPE,这一步建议在 SAC 里统一处理,而不是回头改 rdseed 参数。
3.4 常用参数组合速查表
| 参数 | 作用 | 说明 |
|---|---|---|
-S | 输出 SAC 文件 | 必选,否则只解析不输出 |
-p | 打印台站摘要 | 验证输入时必用 |
-g | 全局命名规则 | 生成NET.STA.LOC.CHA.Q.SAC格式 |
-R | 同时输出 RESP 文件 | 需要仪器响应时使用 |
-o | 指定输出目录 | 目录需提前存在 |
-b/-e | 指定起止时间 | 时间格式为年:年日:时:分:秒.毫秒 |
-v | 详细级别 0-2 | 0 只输出错误,2 最详细 |
这套组合是我平时最常用的。批量场景下我会去掉-p,加上-v 0,把输出交给重定向处理。单文件调试时则加-v 2,看它到底在哪一步停下。
4. 避坑指南:rdseed 使用中的 4 个高频踩坑点
4.1 现象:生成的 SAC 文件头段全是 0
常见情况是你跑了rdseed -S但没加-p之外的任何参数,结果 SAC 文件的 KNETWK、KSTNM 都是空或者 0。原因基本是 rdseed 没有从 SEED 里解析出控制头段。如果你处理的是 miniSEED,问题几乎肯定在这里。解决方法是先用-p看台站信息是否齐全;如果-p也是空的,那就得确认文件是不是完整的 SEED。对 miniSEED,可以用-R参数告诉 rdseed 这是 miniSEED,并配合台站响应文件补头段。我一般是这样处理的:
rdseed -S -g -R -q mydata.mini-q参数会尝试从文件名里解析台站信息,或者让 rdseed 使用默认值。但这样补出来的头段并不完整,真正的解决办法是在转换前用rdseed -p -R检查,如果它显示不了台站,就直接放弃这个文件,改用带完整头段的版本。
4.2 现象:报错 "Not a SEED file"
这个报错很唬人。有一次我拿到一个 .seed 文件,rdseed 直接拒绝处理,说不是 SEED 文件。后来发现这个文件其实是被 gzip 压缩过,扩展名没改。file命令一眼就能看出来。解决:先解压再喂给 rdseed,或者用管道:
gunzip -c mydata.seed.gz | rdseed -S -g -这里最后的-表示从标准输入读取。需要注意,如果输入文件是纯文本的 ASCII 编码(比如某些老台网导出的 SEED),rdseed 也能处理,但前提是控制头段格式正确。还有一种情况是文件本身是 SEED 但缺少某个 Blockette,rdseed 会给出更具体的错误码,比如No volume header。这种情况常见于只保存了数据记录片段的 miniSEED,解决方法和上面一样,用-R。
4.3 现象:批量转换到一半卡死
处理几百个文件时,rdseed 偶尔会在某个文件上卡住不动。原因有三:一是该文件数据记录损坏,rdseed 陷入死循环;二是输出目录满了;三是磁盘空间不足。我的经验是先看进程状态,用ps aux | grep rdseed确认 CPU 是否还在跳动,同时用df -h看磁盘。如果是文件损坏,可以在循环里给 rdseed 加超时限制。常见做法是用timeout命令包裹:
timeout 60 rdseed -S -g $file -o out/这样每个文件最多跑 60 秒,超时直接杀掉,脚本继续往后走。注意,timeout的退出码是 124,在 shell 里要单独判断,避免把超时误当成成功。
4.4 现象:文件名重复导致数据被覆盖
如果不用-g,rdseed 默认生成的文件名很随意,常见的是1.SAC、2.SAC这种,多通道、多台站情况下极易冲突。有一次我转换一个包含 5 个台站的文件,输出到同一个目录,结果后写的台站覆盖了前面的,数据全乱了。解决:强制加-g全局命名,再用-o指定独立目录。如果你需要更细的控制,rdseed 还支持通过-Q指定质量标记等。我在脚本里固定写了这么一行:
rdseed -S -p -g -o "${OUTDIR}" "${INFILE}"这样文件名至少包含台网、台站、通道和时间,重复概率极低。如果你还是担心,可以在命名模板里加入输出目录的哈希值,但这已经超出 rdseed 本身的能力,需要脚本层配合。
5. 进阶技巧:把 rdseed 变成批量处理流水线
5.1 写一个简单的 shell 循环处理整个目录
当你有一整个目录的 SEED 文件,可以这样批量转:
for f in *.seed; do timeout 120 rdseed -S -g -o out "$f" || echo "FAIL: $f" >> err.log done这段逻辑很直白:每个文件独立转换,失败信息写入err.log,不会中断整个循环。注意||前面如果 rdseed 返回非 0,就会记录。我在生产脚本里还会加上文件大小校验,转换后对比 SAC 文件的存在性。
5.2 静默模式与日志:让脚本自己跑自己
rdseed 默认会在终端刷大量输出,跑到几百个文件时影响性能。可以用-v 0静默:
rdseed -S -g -v 0 -o out mydata.seed-v后面的数字从 0 到 2,0 表示只输出错误;1 输出统计信息;2 输出包括块解析在内的详细信息。日志方面,rdseed 没有专门日志参数,但标准错误可以重定向:
rdseed -S -g mydata.seed > stdout.txt 2> stderr.txt我一般只保留 stderr,因为提示性信息都在里面。注意,-v 0模式下,-p的输出也受影响,所以验证时要用默认详细级别。
5.3 验证输出完整性:通道数量对不上怎么办
批量转换后最怕的就是某个通道少了一段。我的验证方法是先从前面的-p输出里数出总通道段数,再和输出目录里的.SAC文件数量对比。用一个简单的组合命令:
rdseed -p mydata.seed | grep -c "Channel" ls -1 out/*.SAC | wc -l两者应该相等。如果不相等,就用err.log和stderr.txt定位是哪个文件的问题。rdseed v5.2 对某些通道的数据长度有限制,超过 2GB 时会报错,这种文件需要先拆分。从那以后,我每次批量处理 SEED 数据,都会强制走一遍「先-p数段数,再-R补响应,最后批量转」这个流程,再也没出现过数据莫名丢失的情况。希望帮到你。
本文还有配套的精品资源,点击获取