简介:面向地震数据处理与SEED格式解析的科研与工程场景,这份rdseedv5.2.tar.gz是地球物理领域常用的工具包,主要服务于地震学家、数据管理人员及相关专业学生,帮助完成SEED数据的读取、格式转换、质量检查与时间序列特征提取。包内共246个文件,以C语言源码(210个.c)、头文件(11个.h)及makefile构建脚本为主,辅以可执行程序、PDF说明文档和变更记录,压缩包整体仅2.03MB,轻量且便于在Linux/Unix环境部署。资源目前已有403人学习使用,覆盖从数据提取、Mini-SEED/SAC格式转换到功率谱分析与数据归档的常见操作思路。通过阅读源码和编译脚本,使用者可深入理解rdseed对SEED数据流的解析逻辑,并针对特定台网或事件数据进行二次开发;随附的readme、changes与文档资料则有助于快速上手和排查问题,是开展地震数据处理与方法研究的实用参考。
1. rdseed v5.2 没有过气:处理 SEED 波形数据的老牌瑞士军刀
rdseed v5.2 看起来像是一个停在十年前的东西:一个 tar.gz 压缩包,里面是 C 和 Fortran 混编的源码,configure、make 那套老旧的构建流程。但如果你认真处理过 FDSN 网络下发的 SEED 波形文件,就会知道这个老工具依然是很多地震学流程里绕不开的黑匣子。它解决了最落地的一件事:把体积型 SEED 格式解开,变成 SAC、MiniSEED、AH 这些你真正能用来做震相拾取、定位和反演的文件。适合在 Linux 服务器上做批处理、被数据格式卡住的科研人员和数据处理工程师,尤其是那些需要反复处理台网归档数据的场景。
2. 编译 rdseed v5.2:从 tar.gz 到可执行文件的完整流程
2.1 为什么还要手动编译:一段老代码的生命线
很多人会问:现在 ObsPy 能读 MiniSEED,SAC 也能直接读 SEED,为什么还要费劲编译一个二十多年前的 rdseed?我给你的答案是:体积型 SEED 和 MiniSEED 是两个物种。FDSN 提供的 event 波形打包下载,往往是包含台站元数据、通道响应和波形数据的完整 SEED 体积文件。ObsPy 的obspy.read()面对这种体积型 SEED 时经常只读得到头段,或干脆说格式不认识,而 SAC 的r命令对体积型 SEED 的支持也远不如对 MiniSEED 那么顺滑。rdseed 在中间的定位是:把体积型 SEED 拆成大家都能吃的单通道文件。
另外一层原因在批处理。很多老的地震定位流程、震相拾取脚本、波形归档目录结构,当年就是按 rdseed 的输出文件命名规则搭起来的。你新进一个课题组,前面的人留下的流程里十有八九还挂着rdseed -f xxx -d -o 1这种命令。与其用别的库重写一遍流程,不如直接把这个 tar.gz 编出来,让你的脚本和老流程无缝衔接。
2.2 在 Linux 上完成 configure 与 make:最小步骤
v5.2 源码包解压后,你会拿到 configure 脚本、一批 C 源文件和 Fortran 源文件。编译工具链上,需要 gcc、gfortran 和 make。Debian/Ubuntu 系用apt install build-essential gfortran,CentOS/RHEL 用yum groupinstall "Development Tools"再补一个gcc-gfortran。这一步没做好的话,configure 可能过得去,但 make 百分百会在链接阶段翻车。
# 解压 tar.gz,进入源码目录 $ tar -xzf rdseedv5.2.tar.gz $ cd rdseed5.2 # 生成 Makefile,多数情况下不带参数就行 $ ./configure # 编译,产出 rdseed 可执行文件 $ make # 放到用户根目录的 bin 下,避免污染系统目录 $ mkdir -p ~/bin $ cp rdseed ~/bin/ $ echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc $ source ~/.bashrc # 验证:能打出 Usage 说明就算成功 $ rdseed -h 2>&1 | head -20configure 不加参数的做法在 Linux 上最常见,它默认会用系统编译器去探测 C 和 Fortran 运行时。make 过程中如果出现gfortran相关的未定义引用,说明前面没装 Fortran 编译器,回去补装之后make clean再重来,不要在缺依赖的状态下反复 make,那个错误信息会骗你以为是源码的问题。命令里最后一行验证用的是rdseed -h,这个命令同样会把编译器的日期和用法打印到终端,看到 Usage 信息就说明可执行文件已经能跑起来了。
2.3 编译后的路径规划与可用性验证
编译好的 rdseed 只有一个静态可执行文件,没有动态库依赖,这个特性在服务器环境里很省心。我一般会把它放进~/bin而不是/usr/local/bin,原因是这台机器可能同时服务多个数据处理项目,每个项目对 rdseed 版本的期待不一样。放进用户根目录的 bin,需要切版本时只要改 PATH 顺序即可,不需要动 root 权限。
路径放好之后,我会先找一个小体积的 SEED 文件做冒烟测试。验证时不看波形,先看在当前目录下生成了什么。一个正常的体积型 SEED 文件,rdseed 会生成名为rdseed.parameters的参数文件和一批以.SAC结尾的波形文件。如果一个分量文件都没出来,先检查你的输入文件是不是被别的前处理环节改成了 MiniSEED 或别的什么。rdseed 对文件头的校验非常严格,哪怕文件只是被截断了几百字节,它也会直接停止解压,而不是给你一个残缺的 SAC。
3. 把 SEED 变成 SAC 的第一次转换:rdseed 的命令行参数与选择文件
3.1 核心参数速查:先认得 -f、-d、-o、-R
rdseed 的参数风格偏老派,单字母为主,含义靠记。我把用得最频繁的七个参数整理成一张表,覆盖从解压到生成响应文件的完整链路。
| 参数 | 作用 | 我常用的写法 |
|---|---|---|
-f | 指定输入的 SEED 文件 | -f raw.seed |
-d | 解出波形数据文件 | -d |
-o | 设定输出格式,1 为 SAC,4 为 MiniSEED | -o 1 |
-p | 输出参数表,记录台站与事件信息 | -p |
-R | 输出 RESP 仪器响应文件 | -R 1 |
-q | 把读取到的 SEED 头段摘要打到终端 | -q |
-c | 指定选择文件,过滤台网、台站与通道 | -c my.select |
很多人第一次用 rdseed 会漏掉-d,结果运行后只生成了参数文件,没有波形。-d是触发波形解压的开关,不加它 rdseed 就只是个“SEED 头段阅读器”。-o的默认值在多数编译版本里是 SAC,但我在批处理脚本里始终显式写-o 1,这样换机器、换版本时不会因为默认值不同而输出一堆预料之外的文件。
3.2 最小可运行转换命令:读时间窗、解波形、写 SAC
先给一个最简单的命令,把单台站的 SEED 转成 SAC。下面的例子假设你从事件服务下载到了一个名为SEED.2024.001.ANMO.BH.Z的完整 SEED 文件。
# 最小转换:-f 指定输入,-d 解开波形,-o 1 输出 SAC,-q 打印头段摘要 $ rdseed -f SEED.2024.001.ANMO.BH.Z -d -o 1 -q这条命令跑完,你会在当前目录看到两个东西:一个rdseed.parameters文件,以及一个与通道对应的.SAC文件。-q会在终端打印出台站名、信道名、开始时间、采样率这些摘要信息,方便你第一时间确认头段解析是否正常。这里说的“正常”,重点看开始时间是不是你预期的事件时刻,采样率是不是对的。如果-q打印出来时间和采样率都没问题,那波形数据基本就解开了。
参数说明上,-f后面不能留空格再写路径,但路径本身可以带完整目录。-o 1的取值决定你用什么工具去读这些文件:SAC、GMT、大多数定位程序都以 SAC 格式为接口,所以这个值在绝大多数情况下不用改。
3.3 选择文件:只处理你要的台网、台站与信道
一旦站在台网角度做事,单条命令就不够了。比如你下载了一个包含几十个台站的 SEED,你只想解出 IU 台网 ANMO 台的三个宽频分量,就要用选择文件。我常用的选择文件写法是下面这个:
# 这是 rdseed 的选择文件 my.select NET 0,IU STA 0,ANMO CHA 1,BHE,BHN,BHZ第一列的三个缩写分别是 NET、STA、CHA,含义是台网、台站、通道。第二列的 0 或 1 表示“排除 / 包含”,配合后面的名字列表实现过滤。上面的例子意思是:只保留 IU 台网、ANMO 台站、三个宽频分量。使用方式是在命令里加-c my.select,rdseed 就会按这个条件去解压,其余台站一律不生成波形文件。
这个选型有一个容易被忽略的点:如果文件里还有 BH1、BH2 这种倾斜分量,而你只写了 BHE、BHN、BHZ,rdseed 会安静地跳过它们,不会在日志里报错。所以批处理前先拿-q跑一遍,看看文件里实际有哪些通道,再回头写选择文件的 CHA 行。用选择文件而不是硬编码通道名,还有个好处是你可以把同一套规则丢给不同日期的数据文件重复使用,整个流程的可复现性会好很多。
4. rdseed 输出的格式选择:SAC、MiniSEED 与 RESP 到底按什么标准挑
4.1 SAC 是默认答案:从数据格式到 SAC 头段
大多数地震学科研流程把 SAC 当作默认交换格式,这不是偶然。SAC 文件本身自带头段,里面能写台站坐标、事件坐标、开始时间、采样率、震中距,还能在后续用saclst一行命令批量提取这些字段。rdseed 转出来的 SAC 头段里,台站信息和事件信息基本都是从 SEED 头段的 Blockette 里带过来的,这比从回文文件里手写头段快好几个数量级。
我一般转完会马上验证头段的完整性,命令是:
# 用 saclst 检查 SAC 头段中的台网、台站、分量与起止时间 $ saclst knetwk kstnm kcmpnm b e f SEED.2024.001.ANMO.BH.Z.SAC看到输出里有一行IU ANMO BHZ 2024/001/00:00:00.000 ...之类的信息,就说明头段解析正确。SAC 头段里最容易缺失的是事件相关的evla、evlo、evdp字段。rdseed 只负责从 SEED 里搬东西,SEED 里没有事件坐标时它不会替你编一个,所以这批字段为零不代表 rdseed 出问题,你需要在后续流程里用事件目录补进去。这里建议你把事件信息从 FDSN 事件服务的text输出下载好,再写个小脚本回填 SAC 头段,这比手工逐个编辑靠谱得多。
4.2 MiniSEED 别当备份:什么场景下才值得用 -o 4
rdseed 的-o 4能输出 MiniSEED 格式。MiniSEED 去掉了大量台站元数据,只保留波形、时间戳和必要的通道标识,文件体积也小不少。但我不推荐你把 MiniSEED 当 SAC 的“轻量备份”。原因很直接:MiniSEED 文件里通常不包含仪器响应信息,你后续做去仪器响应时,还得回到原始 SEED 去拉 RESP 或极零点。数据链路一旦断了,后面补元数据的过程相当痛苦。
什么场景下值得用-o 4?最常见的是给数据中心归档或者跨机构交换。有些数据中心只接受 MiniSEED 作为交付格式,因为它的文件体积可控、时间戳标识清晰。如果你有这个需求,我在转换时会先转 SAC,再从 SAC 写一个管道输出 MiniSEED,而不是直接用 rdseed 的-o 4。原因是 rdseed 输出的 MiniSEED 文件名和块结构比较老,后续工具兼容性未必比得上用 SAC 重新写出来的版本。这个选择不是硬性规定,但能少踩不少坑。
4.3 做仪器校正别选错:RESP 与极零点(PZ)的边界
处理真实数据时,仪器响应移除几乎是逃不掉的一步。rdseed 提供两条路:-R 1生成 RESP 文件,-p生成的参数文件里则包含极零点(PZ)信息。两者看起来都在描述仪器响应,但后续读取它们的工具不一样。SAC 的transfer from zero-pole通道直接吃 PZ 文件,而一些反演软件则要求 RESP 格式。我在做实际项目时,通常两个都生成,让前处理脚本按需选择。
# 同时生成 SAC、RESP 与参数文件:-R1 产出 RESP,-p 产出 parameters $ rdseed -f SEED.2024.001.ANMO.BH.Z -d -o 1 -R 1 -p注意这里-R 1和-p是互补的。-p生成的rdseed.parameters是一个文本文件,里面包含台站坐标、通道方向、采样率以及极零点列表。而-R 1会为每个通道生成一个独立的.RESP文件,用更标准的 RESP 格式描述同一份仪器信息。做谱域分析时我优先用 RESP 文件,因为你直接把 RESP 丢给evalresp就能得到任意频点的幅频相频响应,而用 PZ 文件还需要自己在代码里做一次多项式求值,多一步计算就多一个出错的机会。
5. rdseed 常见问题与避坑:从编译失败到数据翻车的 5 个排查记录
5.1 编译阶段报 “undefined reference to gfortran_”
现象:./configure顺利通过,make进行到链接阶段突然中断,屏幕上出现一堆undefined reference to gfortran_runtime之类的错误。
原因:rdseed 的源码是 C 与 Fortran 混合编译的,C 代码在链接时需要 Fortran 运行库提供底层数学函数。你装的编译器工具链只包含 gcc,没有 gfortran,所以链接器找不到对应的符号库。
解决:先补装 Fortran 编译器。Debian 系执行apt install gfortran,RHEL 系执行yum install gcc-gfortran。装完之后,务必先make clean,再重新运行make。不要试图只make增量编译,因为你缺的是链接阶段的运行库,增量编译会把上一轮的错误状态带过去。
5.2 SEED 转出来了但波形全静默
现象:rdseed 正常退出,也生成了 SAC 文件,但用 SAC 看图或者用saclst DEPMIN DEPMAX查询,振幅全为零或极小。
原因:文件本身是体积型 SEED,但数据段里有部分记录的时间校正值不一致。rdseed 内部按 Blockette 1000 的时间基准做波形还原,如果原始文件在传输或截取过程中丢了一段记录,它会默认把那部分数据视为无效且不报错。
解决:回到原始 SEED 文件,检查它的完整性。FDSN 下载时如果客户端断了重连,产生的文件经常是残缺的。先用rdseed -q看解压记录的条数,再和事件服务页面上的预期条数比对。发现不一致,就重新下载。这个坑的隐蔽之处在于 rdseed 的退出码是 0,很多人看到“成功退出”就跳到下一步了,实际数据已经废了。
5.3 SAC 头段里事件参数全是 0
现象:转换完成,波形正常,但evla、evlo、evdp这几个头段值是 0。
原因:事件信息不在 SEED 文件里。体积型 SEED 可能只包含台站波形数据,事件位置保存在事件目录文件或 FDSN Event 服务的文本输出里。rdseed 只能从输入文件搬数据,输入里没有的字段它不会自己编造。
解决:分两步走。先从事件服务下载事件参数,再用一段脚本按事件时间把evla、evlo、evdp写进对应的 SAC 头段。我常用的做法是先把所有 SAC 文件按时间归组,再用sac命令批量更新头段。这里的要点是,不要让头段不全的数据进入定位流程,否则定位结果会在事件位置上多出一个莫名的系统偏差。
5.4 选择文件没匹配上,只解出一个台站
现象:加了-c my.select后,明明 SEED 里有几十个台站,最后只生成了少数几个 SAC 文件。
原因:选择文件里的台网、台站代码和 SEED 里实际写的不一致。比如 SEED 头段里台站名是ANMO,你却写了ANM0;或者通道列表写的是BH1,实际数据是BHZ。rdseed 对选择文件采取的是“未匹配就跳过”的策略,不会在日志里提示你没匹配上。
解决:先用-q不加选择文件跑一次,把打印出的台网台站通道列表和选择文件逐项对照,重点看第二列的 0/1 逻辑有没有写反。你写NET 0,IU表示排除非 IU 台网,但你若写成NET 1,IU,语义就变成“只保留非 IU 台网”。这种逻辑写反的报错不会弹出,你只会发现结果文件数不对,属于典型的“静默失败”。
5.5 批量任务跑了一夜没结束
现象:服务器上挂了 50 个 SEED 文件,rdseed 进程已经跑了几个小时,输出文件还在增长。
原因:rdseed 是单线程程序,处理一个包含几十个台站全通道数据的体积型 SEED 时,波形解压和响应文件生成都要花时间。你如果在一个循环里逐文件处理,还要写大量结构化日志,整个任务就会拖得非常长。
解决:把任务按“台站-通道”粒度拆开并行。一种常见做法是先用选择文件只保留单台站单分量,再开多个进程同时跑不同批次。我在批处理脚本里用xargs -P控制并行度,比如一次并行四个任务,既不会把服务器 CPU 吃满,也能把原本一夜的转换压缩到一两小时。并行之后,日志文件必须按批次分开写,否则多进程同时写同一个日志会让你没法定位失败任务。
6. 用脚本把 rdseed 封装成批处理流程:日志、校验与一处后悔药
6.1 一个跑完整个目录的循环脚本
当处理对象从一两个文件变成几十上百个文件时,我建议你写一个极简的批处理封装。下面这段脚本是我在 Linux 服务器上的常用套路,逻辑很简单:遍历原目录里的 SEED 文件,各自转换,再把 SAC 和 RESP 按文件名归档到独立目录。
#!/bin/bash shopt -s nullglob for seed in raw/*.seed; do base=$(basename "$seed" .seed) mkdir -p "sac/$base" # 转换:SAC + RESP + 参数表,日志单独落盘 rdseed -f "$seed" -d -o 1 -R 1 -p -q > "sac/$base/$base.log" 2>&1 # 把生成的 SAC 与 RESP 移动进归档目录 mv *.SAC "sac/$base/" 2>/dev/null mv *.RESP "sac/$base/" 2>/dev/null done脚本里两个关键点:一是把-q的输出同时重定向到日志文件,这样排查问题不用重跑;二是mv *.SAC前的2>/dev/null,因为某些目录可能只生成了 RESP 没生成 SAC,不加的话脚本会在没匹配到文件的 mv 上报错。shopt -s nullglob的作用是让 for 循环在没有匹配文件时直接跳过,而不是拿一串空通配符当文件名去执行 rdseed。
6.2 结果校验:抽检 3 个 SAC 文件再进下一步
批量跑完之后,先别急着进后续流程。我会在终端里抽 2~3 个归档目录,用 saclst 看每个 SAC 文件的台网、台站、分量和起止时间,确认没有因为上面第 5 章说的静默问题产出坏文件。
# 抽检:随机挑两个归档目录,检查头段四要素 $ for d in sac/*/; do saclst knetwk kstnm kcmpnm b e f $d/*.SAC; done如果输出里出现KCMPNM带空格或时间变成1234567之类的怪值,先不要删原始 SEED 文件,回到raw/目录重跑单个文件验证。这里我要说一个自己的习惯:保留原始 SEED 目录,直到抽检完成后再统一压缩归档。批处理转换这件事里,最贵的一次操作不是重新下载数据,而是“数据发现坏了,但原始文件已经被你删了”。给自己留一次后悔药,比省那一点磁盘空间实在得多。我在早期项目里就因为没做抽检,让一批头段不全的 SAC 一路跑进了叠加流程,最后回头排查花了整整一个下午。从那以后,我保留原始文件到最终结果核验通过才归档,这条习惯一直用到现在。希望帮到你。
本文还有配套的精品资源,点击获取