
简介rdseedv5.3.1 是一款运行于 Linux 环境的地震数据格式转换工具面向地震学研究者与数据处理人员用于将标准 SEED 格式的地震观测数据转换为 SAC 软件可读取的格式解决不同分析平台间数据格式不兼容的问题。压缩包共 454 个文件约 2.72MB以 C 源码210 个 .c与编译目标文件209 个 .o为主体另含头文件、Makefile、说明文档及少量预编译可执行文件覆盖从源码编译到直接运行的多种使用方式。已有 337 人学习下载。资源内含 rdseed.c、output_sac.c、steim.c、summary.c 等核心模块便于读者理解 SEED 到 SAC 的转换流程与解压、编译、参数配置等关键环节适合具备一定 Linux 命令行基础、需要批量处理地震波形数据的研究者参考使用。1. rdseed 5.3.1 在 Linux 上到底解决什么问题从 SAC 波形到 SEED 归档的那条链路手里攒了几百个 SAC 文件想打包成 SEED 交给合作方或者上传数据中心结果发现 SAC 本身只是单台站的波形格式没有台站元数据、没有仪器响应、没有事件信息直接改后缀名是没用的。rdseed 就是干这件事的它由 IRIS 维护负责在 SEED 和 SAC 之间双向转换5.3.1 是这套工具里被大量地震数据处理流程长期使用的一个版本。你在 Linux 上拿到rdseedv5.3.1.tar这个包本质是要把 SEED 卷或从 SAC 反推里的波形、台站、响应、事件四类信息拆开或合起来。它适合做台网数据归档、响应文件提取、批量格式转换的运维和科研人员也适合刚接触地震数据、需要把观测数据喂进 SAC 做后续处理的新手。这条链路里 SEED 是容器SAC 是分析格式rdseed 是桥。2. 编译 rdseed 5.3.1源码包解压、依赖确认与三个平台差异2.1 先看清 tar 包里有什么别急着 make拿到rdseedv5.3.1.tar之后第一件事不是解压完就make而是先确认包结构和编译入口。rdseed 的源码包通常是自解压或普通 tar解压后目录里会有makefile、source或src子目录以及一份说明编译方式的文本文件。不同来源的包目录名可能带版本号也可能不带所以先tar -tf看一眼再决定解压路径能省掉后面找不到 makefile 的麻烦。# 先列出包内结构不实际解压 tar -tf rdseedv5.3.1.tar | head -40 # 确认是普通 tar 后解压到独立目录 mkdir -p ~/build/rdseed cd ~/build/rdseed tar -xf ~/rdseedv5.3.1.tar # 看解压出来的顶层目录 ls -la逻辑说明tar -tf只读目录不落盘用来判断这是普通归档还是自解压脚本。如果是自解压直接sh rdseedv5.3.1.tar会释放文件。参数上-xf是解压并保留权限-C可以指定目标目录我这里用先 cd 再解压的方式避免路径写错。解压后如果看到makefile和source目录说明是标准源码布局可以进入下一步。2.2 依赖与编译器gcc、make 和那几个容易缺的头文件rdseed 是 C 写的编译依赖 gcc 和 make这是最基本的。真正容易翻车的是它内部用到的一些库和头文件比如数学库、字符串处理相关的系统头。多数现代 Linux 发行版默认装了 gcc 和 make但如果你是在最小化安装的服务器或容器镜像里操作很可能连 gcc 都没有。先确认工具链再确认数学库链接能避免编译到一半报一堆 undefined reference。# 确认编译工具链 gcc --version make --version # Debian/Ubuntu 系补齐基础编译环境 sudo apt-get update sudo apt-get install -y build-essential # RHEL/CentOS/Rocky 系 sudo yum groupinstall -y Development Tools逻辑说明build-essential在 Debian 系里会带上 gcc、make、libc 开发头文件这是最省事的做法。RHEL 系用 groupinstall 装开发工具组。参数上-y是自动确认适合脚本化。装完之后再回到源码目录不要急着改 makefile先跑一次默认编译看报什么错报错信息比预先猜依赖更准。2.3 编译与安装make 目标怎么选装到哪不污染系统rdseed 的 makefile 通常提供几个目标常见的是直接make编译make install安装到某个默认路径。默认安装路径有时是/usr/local/bin有时是源码目录下的bin取决于包里的 makefile 写法。我一般先make看能不能过过了之后不直接 install而是把生成的二进制复制到自己管理的目录比如~/opt/rdseed/bin这样多版本共存和回退都方便。# 在源码目录内编译 make # 编译成功后确认二进制位置 find . -maxdepth 3 -type f -name rdseed -perm -ux # 不装系统路径复制到自管目录 mkdir -p ~/opt/rdseed/bin cp ./rdseed ~/opt/rdseed/bin/ 2/dev/null || cp ./bin/rdseed ~/opt/rdseed/bin/ # 加入 PATH写入当前 shell 配置 echo export PATH$HOME/opt/rdseed/bin:$PATH ~/.bashrc source ~/.bashrc rdseed -h逻辑说明make不带参数会走 makefile 的第一个目标通常是全量编译。find用来定位实际生成的二进制因为不同包放的位置不一样。复制到~/opt下是个人习惯避免make install覆盖系统里已有的 rdseed。rdseed -h能打印帮助就说明二进制可用。参数上-perm -ux过滤可执行文件2/dev/null是忽略第一条 cp 失败时的报错让第二条兜底。2.4 三个平台差异glibc 版本、大小端和 32 位遗留问题rdseed 5.3.1 这个年代的代码在一些新系统上编译会遇到 glibc 版本相关的警告甚至错误尤其是函数声明和隐式类型转换。另一个容易被忽略的是字节序SEED 是跨平台的rdseed 内部处理时会考虑大小端但如果你在 ARM 或某些嵌入式 Linux 上编译要确认 makefile 里没有硬编码 x86 假设。还有 32 位遗留问题老代码里可能有int和long混用在 64 位系统上编译时留意警告别直接忽略。# 看系统架构和 glibc 版本 uname -m ldd --version | head -1 # 编译时打开更多警告便于发现类型问题 make CFLAGS-O2 -Wall -Wno-unused-result逻辑说明uname -m确认是 x86_64 还是 aarch64ldd --version看 glibc 主版本。CFLAGS覆盖 makefile 里的编译选项-Wall打开常用警告-Wno-unused-result是压掉一些老代码里忽略返回值带来的噪音。这一步不是必须但在新系统上编译老代码时警告里往往藏着后面运行时的坑。3. 用 rdseed 做 SEED 到 SAC 的转换命令、参数和批量脚本3.1 最小可用命令把一个 SEED 卷拆成 SAC 文件rdseed 的交互式菜单是很多人第一次用的方式但真正做批量处理时命令行参数更可控。最基本的用法是给一个输入 SEED 文件指定输出目录让它把波形写成 SAC。这里要注意SEED 里可能包含多个台站、多个通道rdseed 会按台站和通道分别生成文件输出目录最好提前建好避免文件散落。# 建输出目录 mkdir -p ~/data/sac_out # 最小命令SEED 转 SAC rdseed -f ~/data/input.seed -d ~/data/sac_out -o 1 # 查看生成了什么 ls ~/data/sac_out | head逻辑说明-f指定输入 SEED 文件-d指定输出目录-o是输出选项不同版本里-o的含义可能对应输出波形、响应等具体以rdseed -h为准。执行后 SAC 文件会按NET_STA_CHA之类的前缀命名。参数上如果 SEED 文件很大这一步会花时间先拿一个小文件验证流程再上全量。3.2 关键参数响应文件、事件信息和通道选择只转波形往往不够做仪器响应校正需要 RESP 或 SAC PZ 文件做事件定位需要事件信息。rdseed 可以在转换时一并输出这些。常见做法是用-R输出响应用-e输出事件具体字母以你手上版本的帮助为准。通道选择上如果只关心某个通道可以在交互模式里筛但批量场景更推荐先全量输出再按文件名过滤逻辑简单不易错。# 输出波形 响应文件 rdseed -f ~/data/input.seed -d ~/data/sac_out -R -o 1 # 输出事件信息 rdseed -f ~/data/input.seed -d ~/data/sac_out -e # 只保留 BHZ 通道的 SAC按命名过滤 find ~/data/sac_out -name *BHZ* -type f逻辑说明-R让 rdseed 额外生成 RESP 文件后续用 SAC 的transfer命令做响应校正时要用。-e输出事件信息通常是 CSS 或类似格式。过滤这步用find按文件名匹配比在 rdseed 里写复杂筛选条件更直观。参数上注意-o和-R同时用时输出目录里会混着波形和响应建议分目录或转换后按后缀归类。3.3 批量转换脚本循环处理多个 SEED 并记录日志实际运维里很少只转一个文件通常是按台网或按年份一批一批来。写个 shell 循环把每个 SEED 文件单独输出到对应子目录同时把 rdseed 的输出重定向到日志出问题时能回溯。这里的关键是每个文件独立目录避免同名台站通道互相覆盖。#!/bin/bash # 批量 SEED 转 SAC每个文件一个输出目录 set -u SEED_DIR$HOME/data/seed OUT_ROOT$HOME/data/sac_batch LOG_DIR$HOME/data/logs mkdir -p $OUT_ROOT $LOG_DIR for seed in $SEED_DIR/*.seed; do base$(basename $seed .seed) out$OUT_ROOT/$base mkdir -p $out echo [$(date)] processing $base $LOG_DIR/rdseed.log rdseed -f $seed -d $out -R -o 1 $LOG_DIR/rdseed.log 21 if [ $? -ne 0 ]; then echo [$(date)] FAILED $base $LOG_DIR/rdseed.log fi done逻辑说明set -u让未定义变量报错避免路径为空时误操作。循环里对每个 seed 取 basename 建子目录-R -o 1按前面验证过的参数走。日志统一追加成功失败都记。参数上$?判断上一条命令退出码非零就记 FAILED。这个脚本可以直接抄改三个路径变量即可。3.4 转换结果自检SAC 头段和文件数量对不对转完之后不能只看文件生成了就完事要抽查 SAC 头段里的台站、通道、采样率、起始时间是否正确。用 SAC 自带的sac交互或者saclst命令可以快速看头段。文件数量上可以拿 SEED 里的通道数和输出 SAC 数量对一下差太多说明有通道被跳过或覆盖。# 用 saclst 看头段需已安装 SAC saclst kstnm kcmpnm delta npts f ~/data/sac_out/*.BHZ | head # 统计输出文件数 ls ~/data/sac_out | wc -l逻辑说明saclst后面跟要看的头段变量kstnm是台站名kcmpnm是通道名delta是采样间隔npts是点数f是文件名。输出能直观看到每个文件的元数据。参数上如果saclst不可用说明 SAC 没装或没进 PATH先解决环境再自检。文件数统计用来和预期对比数量对不上就回去看日志里有没有 FAILED。4. 从 SAC 反推 SEEDrdseed 的反向转换与元数据补齐4.1 反向转换的前提SAC 头段里必须有的字段rdseed 也支持从 SAC 生成 SEED但这条路比正向转换挑剔得多。SAC 头段里如果缺台站坐标、通道方位角、仪器响应这些信息生成的 SEED 就是残缺的后续别人拿去用会出问题。所以反向转换前先用saclst把关键头段过一遍确认stla、stlo、stel、cmpaz、cmpinc这些都有合理值。# 检查反向转换所需的关键头段 saclst stla stlo stel cmpaz cmpinc kstnm kcmpnm f ~/data/sac_out/*.BHZ逻辑说明stla/stlo/stel是台站纬经高cmpaz/cmpinc是通道方位角和倾角。这些字段缺失或为默认值时生成的 SEED 台站信息不可信。参数上如果输出里大量是 0 或 0.0说明原始 SAC 就没带这些信息需要先从其他来源补齐再转。4.2 生成 SEED 的命令与输出结构反向转换的命令行参数和正向类似但输入输出角色对调。常见做法是把一批 SAC 放在一个目录指定输出 SEED 文件名rdseed 会尝试合并。这里要注意SAC 文件的时间连续性、采样率一致性会影响合并结果不连续的数据可能被分成多个 SEED 卷或直接报错。# 从 SAC 目录生成 SEED mkdir -p ~/data/seed_out rdseed -f ~/data/sac_out -d ~/data/seed_out -o 2 # 看生成的 SEED 文件 ls -la ~/data/seed_out逻辑说明-f这里指向 SAC 目录而不是单个文件-o 2代表输出 SEED 模式具体编号以帮助为准。生成后检查文件大小如果只有几 KB多半是元数据不全导致内容很少。参数上不同版本对目录输入的支持不一样如果报错改成用文件列表或先合并再转。4.3 元数据补齐用 RESP 和 StationXML 补 SAC 缺的字段SAC 缺元数据是常态补齐的常见做法是从台网发布的 RESP 或 StationXML 里提取再写回 SAC 头段。SAC 有transfer和头段修改命令但批量改头段更适合用脚本或 ObsPy 这类工具。rdseed 本身不负责补元数据它只做格式转换所以这一步要在转换前完成。# 用 ObsPy 读 StationXML 并写 SAC 头段示例思路 from obspy import read_inventory, read inv read_inventory(network.xml) st read(BHZ.sac) # 按台站通道匹配响应并附加 for tr in st: tr.stats.response inv.get_response(tr.id, tr.stats.starttime) st.write(BHZ_with_resp.sac, formatSAC)逻辑说明这段是思路示例实际字段映射要看你的 SAC 头段需求。read_inventory读 StationXMLget_response按台站通道和时间为参数取响应。参数上tr.id是NET.STA.LOC.CHA格式和 StationXML 里的命名要一致不一致就先做映射。补完再走 rdseed 反向转换生成的 SEED 才完整。5. 避坑与排查rdseed 转换里最常见的五类翻车5.1 编译报 undefined reference现象是链接阶段一堆数学函数找不到现象make到最后链接时提示undefined reference to sin、pow之类。原因makefile 里链接数学库-lm的顺序或缺失老代码在新 gcc 下对库顺序更敏感。解决在 makefile 的链接行末尾补-lm或者用make LDFLAGS-lm覆盖。如果还不行看是不是 CFLAGS 和 LDFLAGS 被 makefile 内部变量覆盖直接编辑 makefile 对应行最稳。5.2 转换后 SAC 文件为空或只有头段现象是文件几十字节现象输出目录里 SAC 文件存在但极小saclst npts显示 0 或异常。原因SEED 里该通道没有实际波形数据或者 rdseed 的输出选项没选对只输出了头段。解决先用rdseed -h确认输出选项含义换用交互模式看 SEED 里到底有哪些通道和数据段。如果 SEED 本身就只有台站信息没有波形那转不出波形是正常的别在参数上死磕。5.3 台站名或通道名带特殊字符导致文件名异常现象生成的 SAC 文件名里有奇怪字符或者同名文件互相覆盖。原因SEED 里台站或通道命名不规范rdseed 按原名生成文件时带入了特殊字符。解决转换后统一重命名或者在 rdseed 里用输出命名选项控制。批量场景建议转换完立刻用脚本按NET.STA.LOC.CHA规范重命名避免后续处理时路径解析出错。5.4 大 SEED 文件转换中途卡死或内存暴涨现象处理几百 MB 到 GB 级 SEED 时rdseed 卡住不动或系统内存被吃满。原因老版本 rdseed 对超大卷的处理不是流式的会一次性读入较多数据。解决先用工具把大 SEED 按时间或台站拆成小卷再逐个转换。拆分可以用 rdseed 自身或 IRIS 的其他工具拆完再批量跑稳定得多。5.5 响应文件与波形时间不匹配后续校正结果离谱现象用-R输出的 RESP 做响应校正后波形幅度明显不对。原因RESP 的有效时间和 SAC 波形时间对不上或者台站通道在 SEED 里有多段响应rdseed 输出时选了错误的一段。解决校正前先核对 RESP 里的起止时间和波形时间多段响应的情况手动选对应段。这一步没有捷径只能逐个核对但核对一次之后可以写成检查脚本复用。6. 把 rdseed 接进自动化流程校验、版本管理和一个可复用的检查习惯rdseed 单独用不难难的是把它放进每天跑的自动化流程里还不出事。我自己的做法是三层第一层是转换前的输入校验第二层是转换后的输出校验第三层是版本和参数的可追溯。输入校验主要看 SEED 文件完整性可以用rdseed先跑一遍只列内容不输出确认台站通道数量符合预期。输出校验就是前面说的saclst抽查加文件计数重点看 npts 和 delta 是否合理。可追溯这块把 rdseed 的版本、编译参数、每次转换用的命令行都记进日志出问题时能复现。# 转换前只列 SEED 内容不输出文件 rdseed -f input.seed -l 21 | tee seed_content.txt # 转换后批量检查 npts 是否大于 0 for f in ~/data/sac_out/*; do npts$(saclst npts f $f | awk {print $2}) if [ ${npts:-0} -le 0 ]; then echo EMPTY: $f fi done逻辑说明-l是列内容模式具体字母以帮助为准目的是不落盘先看结构。tee同时输出到屏幕和文件留档。第二个循环用saclst取 nptsawk取第二列${npts:-0}处理空值小于等于 0 就报 EMPTY。参数上这个检查脚本可以挂到 cron 或 CI 里转换完自动跑。版本管理上我习惯把编译好的 rdseed 二进制按版本号放比如~/opt/rdseed/5.3.1/bin/rdseedPATH 里指向一个current软链。这样升级或回退只改软链不用动脚本。参数文件也按版本存因为不同版本对同一个选项的解释可能不同混用会出玄学问题。检查项命令/方法通过标准二进制可用rdseed -h正常打印帮助SEED 内容rdseed -f x.seed -l台站通道数与预期一致输出波形saclst npts f *.SACnpts 大于 0采样率saclst delta f *.SAC与台网标称一致响应时间对比 RESP 与 SAC 时间起止时间覆盖波形这张表我一般贴在流程文档里每次改参数或升级版本后过一遍。血泪经验是很多问题不是 rdseed 本身错而是输入数据或参数理解偏差把检查做在前面比事后排查省太多时间。希望帮到你。本文还有配套的精品资源点击获取