ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

rdseed 5.3.1 Linux编译与SEED/SAC格式转换实战指南

2026/9/23 12:12:35 拓冰建站 浏览量
rdseed 5.3.1 Linux编译与SEED/SAC格式转换实战指南 简介rdseedv5.3.1 是一款运行于 Linux 环境的地震数据处理工具核心功能是将 SEED 格式的地震观测数据转换为 SAC 可识别的格式面向地震学研究者、台站数据处理人员及具备一定 Linux 命令行基础的科学计算用户。压缩包共 454 个文件约 2.72MB以 C 源码210 个 .c与编译中间文件209 个 .o为主体另含 11 个头文件、8 个 makefile 及 readme、changes、pdf 文档等属于典型的源码级发行包需自行编译后使用。内容预览可见 rdseed.c、output_sac.c、steim.c、ah_resp.c 等模块分别对应主流程、SAC 输出、Steim 压缩解码与仪器响应处理结构完整便于理解 SEED 到 SAC 的转换链路。目前已有 336 人学习下载。借助该工具读者可完成台站数据的格式转换为后续波形查看、滤波与事件定位等分析打好数据基础同时也能从源码中学习地震数据编解码与响应处理的实现思路。1. rdseed 5.3.1 在 Linux 上到底解决什么问题从 SAC 到 SEED 的那一步如果你手上有台跑着 Linux 的工作站硬盘里躺着一堆.seed或.mseed波形而下游同事只认 SAC 格式那你大概率绕不开 rdseed 这个工具。标题里的rdseedv5.3.1.tar_linux_sac_seed_拆开看就是四件事rdseed 这个转换程序、5.3.1 这个版本、Linux 运行环境、以及 SAC 与 SEED 两种地震数据格式之间的互转。它解决的不是“怎么读波形”这种上游问题而是“数据到手了怎么变成别人能用的格式”这种卡在中间的脏活。我见过太多人卡在这一步IRIS 下载下来是 SEED台阵记录是 miniSEED但处理脚本、绘图工具、老代码全按 SAC 写。rdseed 就是干这个的——把 SEED 家族格式拆成 SAC 的.sac头段加二进制数据或者反过来把 SAC 打包回 SEED。它适合做观测数据整理的人、跑台阵日常处理的人、以及需要把历史波形喂进老 SAC 流程的人。这一章先把“为什么是 rdseed 而不是别的”讲清楚后面再动手。2. 编译 rdseed 5.3.1从 tar 包到可执行文件的完整路径拿到rdseedv5.3.1.tar之后第一反应不该是直接tar -xvf然后./configure因为 rdseed 的构建体系和普通 GNU 项目不一样。它的源码包里通常带一个makefile或者Makefile依赖的是系统里的 C 编译器和几个基础库。下面按我实际在 Linux 上跑通的顺序来。2.1 先确认编译环境里缺什么rdseed 本身不依赖 SAC也不依赖 Python但它对 C 编译器和 make 有硬要求。先跑一遍检查# 检查编译器、make、以及常见的开发库 gcc --version make --version ldconfig -p | grep -E libm\.so|libc\.so如果gcc或make没装Debian/Ubuntu 系用sudo apt install build-essentialRHEL/CentOS 系用sudo yum groupinstall Development Tools。这里有个容易忽略的点rdseed 5.3.1 的源码里有些老式 C 写法用太新的 GCC 可能会报隐式声明警告但一般不影响生成可执行文件。如果编译中途报undefined reference to pow之类补-lm就行后面会讲怎么加。2.2 解包、看目录、找构建入口# 解包注意 tar 包可能不带顶层目录 mkdir -p ~/build/rdseed cd ~/build/rdseed tar -xvf /path/to/rdseedv5.3.1.tar # 看解出来的结构确认 makefile 位置 ls -la find . -maxdepth 2 -iname makefile* -o -iname *.c | head -20常见情况是解出来一堆.c和.h文件外加一个makefile。如果 tar 包直接铺在当前目录别慌先ls看清楚再决定要不要建子目录。我一般会单独建一个构建目录避免源码和编译产物混在一起但 rdseed 的老 makefile 有时写死了相对路径所以更稳妥的做法是直接在源码目录里编译。2.3 编译命令与参数调整# 进入源码目录后先看 makefile 里的 CC 和 CFLAGS grep -E ^CC|^CFLAGS|^LDFLAGS makefile # 直接编译如果报数学库缺失就手动补 make CCgcc CFLAGS-O2 -w LDFLAGS-lm这里-w是关掉警告因为老代码的警告会刷屏但不影响结果-O2是常规优化LDFLAGS-lm是链接数学库rdseed 里有些计算用到了pow、sqrt。如果 makefile 里已经写了-lm就不用重复加。编译成功后当前目录会出现rdseed可执行文件用./rdseed -h或./rdseed看是否打印用法。如果报cannot execute binary file说明架构不对检查是不是在 32 位环境编译后拿到 64 位机器上跑。2.4 把 rdseed 放进 PATH 并做一次空跑验证# 复制到本地 bin或者软链到 /usr/local/bin mkdir -p ~/bin cp rdseed ~/bin/ export PATH$HOME/bin:$PATH # 空跑看版本和用法 rdseed -h 21 | head -30rdseed 的-h不一定标准有些版本直接跑不带参数就会打印交互菜单。看到SEED to SAC或SAC to SEED字样就说明二进制没问题。这一步别跳过因为后面所有转换都依赖这个可执行文件能正常启动。3. 用 rdseed 做 SEED 转 SAC交互模式与命令行参数怎么选rdseed 有两种用法一种是直接带参数跑一种是不带参数进交互菜单。做批量处理时我强烈建议用命令行参数因为交互模式在脚本里没法自动化。这一章把两种方式都拆开重点放在参数含义和输出控制上。3.1 交互模式的操作顺序与适用场景直接运行rdseed会进入一个文本菜单依次问你输入文件、输出目录、要提取的台站/通道/时间窗。适合第一次上手时确认数据里到底有什么。典型流程是# 进入交互模式 rdseed # 菜单里依次输入 # 1. 输入 SEED 文件路径 # 2. 输出目录 # 3. 选择 Extract SAC data # 4. 按提示输入台站、通道、时间范围或直接回车全选交互模式的好处是能边看边选坏处是每次都要手敲。如果你只是偶尔转一两个文件这样最省事如果要处理几十个台站必须换命令行。3.2 命令行参数拆解-f、-d、-o、-s、-S、-Crdseed 的命令行参数在不同版本间略有差异但 5.3.1 常用的几个是参数含义典型用法-f指定输入 SEED 文件-f input.seed-d指定输出目录-d ./sac_out-o输出 SAC 格式-o-s按台站选择-s STA1,STA2-S按通道选择-S BHZ,BHN-C按时间窗选择-C 2020,01,01,00,00,00 2020,01,02,00,00,00一个完整的转换命令长这样# 把 input.seed 里所有台站的 BHZ 通道转成 SAC输出到 sac_out rdseed -f input.seed -d ./sac_out -o -S BHZ # 如果只要某个台站、某个时间段 rdseed -f input.seed -d ./sac_out -o -s WMQ -S BHZ \ -C 2021,06,01,00,00,00 2021,06,01,12,00,00参数顺序不严格但-f和-d最好放前面。-o是告诉 rdseed 输出 SAC如果不加它可能默认输出其他格式或只做列表。-C的时间格式是年,月,日,时,分,秒逗号分隔不能有空格。如果时间窗写错rdseed 可能不报错但输出空文件所以转完一定要ls看文件数。3.3 输出文件命名规则与 SAC 头段检查rdseed 输出的 SAC 文件命名通常是STA.CHN.NET.YYYY.DDD.HHMMSS.SAC这种风格具体取决于版本和输入 SEED 里的台站信息。转完之后别急着走用 SAC 或saclst检查头段# 用 saclst 看时间、台站、通道 saclst kstnm kcmpnm knetwk stla stlo b e f sac_out/*.SAC | head # 如果没有 saclst用 rdseed 自带的列表功能或直接看文件大小 ls -lh sac_out/重点看b和e是不是合理kstnm和kcmpnm有没有对。我遇到过 SEED 里台站名带空格转出来 SAC 头段被截断的情况这种只能回头改 SEED 或者转完后用 SAC 批量改头段。4. 反向操作与批量处理SAC 转 SEED、脚本化与常见报错实际工作中不只有 SEED 转 SAC有时要把处理过的 SAC 打包回 SEED 发给别人或者写脚本批量跑几百个文件。这一章讲反向转换和自动化顺带把几个高频报错的原因说清楚。4.1 SAC 转 SEED 的命令行写法rdseed 也支持从 SAC 转回 SEED但前提是你的 SAC 文件头段完整尤其是台站、通道、网络、时间这些字段。命令大致是# 把当前目录下所有 SAC 打包成一个 SEED rdseed -d ./seed_out -f sac_list.txt -o -R # 其中 sac_list.txt 每行一个 SAC 文件路径注意-R在不同版本里含义可能不同有的版本用-S表示 SAC 输入。更稳妥的做法是先跑rdseed进交互菜单选 “SAC to SEED” 看它提示的参数名再照着写命令行。转出来的 SEED 用rdseed -f output.seed空跑一遍能列出台站就说明打包成功。4.2 批量转换脚本for 循环与错误捕获批量处理的核心是把每个文件单独跑一次 rdseed并记录失败的文件。下面这个脚本我用了很久#!/bin/bash # 批量把 seed 目录下的 .seed 转成 SAC INPUT_DIR./seed_files OUTPUT_DIR./sac_files LOG./rdseed_batch.log mkdir -p $OUTPUT_DIR $LOG for seed in $INPUT_DIR/*.seed; do base$(basename $seed .seed) outdir$OUTPUT_DIR/$base mkdir -p $outdir # 跑 rdseed把标准输出和错误都记进日志 if rdseed -f $seed -d $outdir -o -S BHZ,BHN,BHE $LOG 21; then echo OK: $seed $LOG else echo FAIL: $seed $LOG fi done关键点是每个文件单独建输出目录避免不同台站的文件混在一起-S里列出你要的通道不要全转否则数据量爆炸。跑完看日志里有多少FAIL再针对失败文件单独排查。4.3 三个高频报错的排查路径报错一Cannot open input file。现象是 rdseed 启动后立刻退出。原因通常是路径写错或者文件权限不对。解决用ls -l确认文件存在且可读绝对路径比相对路径稳。报错二No data found for this channel。现象是命令跑完但输出目录为空。原因是-S里写的通道在 SEED 里不存在或者时间窗没覆盖到数据。解决先不带-S和-C跑一次看 rdseed 列出的通道和时间范围再照着填。报错三Segmentation fault。现象是编译出来的 rdseed 一跑就崩。原因可能是编译时优化过头或者源码和系统库不兼容。解决重新编译把CFLAGS改成-O0 -g再跑一次看是否还崩如果还崩换旧版 GCC 或换一台机器编译。5. 避坑与常见问题rdseed 在 Linux 上最容易翻车的五个地方这一章单独列坑因为 rdseed 的报错信息经常不直观很多问题不是命令写错而是环境或数据本身的问题。下面五条按「现象 → 原因 → 解决」写都是实际踩过的。坑一编译时提示undefined reference to pow。现象make到最后链接阶段报错说找不到数学函数。 原因makefile 里没链接libm或者LDFLAGS被覆盖了。 解决手动加LDFLAGS-lm重新make或者直接改 makefile 在链接行末尾加-lm。坑二转出来的 SAC 文件大小为 0。现象ls看到文件存在但大小是 0 字节。 原因时间窗写错、通道不存在、或者 SEED 文件本身那段数据就是空的。 解决先用rdseed -f input.seed不带输出参数跑一遍看它列出的可用通道和时间范围再重新指定-S和-C。坑三SAC 头段里的台站名变成乱码或截断。现象saclst kstnm看到的名字和 SEED 里不一致。 原因SEED 里的台站名包含非标准字符或超长rdseed 按固定长度截断。 解决转完后用 SAC 的ch命令批量改头段或者在上游用rdseed的交互模式手动指定输出名。坑四批量脚本跑一半卡住。现象for 循环到某个文件时不动了也没有报错。 原因rdseed 在交互模式下等待输入而脚本里没重定向标准输入。 解决在脚本里给 rdseed 加 /dev/null强制它不等待输入或者确保所有参数都通过命令行传进去。坑五换机器后 rdseed 报GLIBC版本不兼容。现象在一台机器编译的 rdseed 拷到另一台机器跑报version GLIBC_2.xx not found。 原因编译环境和运行环境的 C 库版本不一致。 解决在目标机器上重新编译或者用静态链接-static编译但静态链接可能遇到其他库缺失最稳的还是本地编译。6. 进阶用 rdseed 的列表输出做数据质检与时间窗裁剪rdseed 除了转格式还有一个很实用的功能不带输出参数跑的时候它会列出 SEED 文件里的台站、通道、时间范围。这个列表输出可以直接拿来做数据质检比转完再检查快得多。6.1 用列表输出快速核对台站和通道# 只列信息不转文件 rdseed -f input.seed 21 | tee seed_info.txt # 从输出里提取台站和通道行 grep -E Station|Channel|Time seed_info.txt | head -40这个列表会告诉你文件里到底有哪些台站、哪些通道、时间跨度是多少。如果列表里没有你要的通道后面怎么转都是白费。我一般拿到新数据先跑这一步确认数据完整再决定转换参数。6.2 按时间窗裁剪并验证裁剪结果rdseed 的-C参数可以做时间窗裁剪但裁剪后的文件是否真的落在窗口内需要验证。方法是用saclst看b和e# 裁剪一个特定时间窗 rdseed -f input.seed -d ./trim_out -o -S BHZ \ -C 2022,03,15,00,00,00 2022,03,15,06,00,00 # 验证每个文件的起始和结束时间 saclst b e f trim_out/*.SAC如果b和e对应的绝对时间不在你指定的窗口内说明 rdseed 的时间窗参数没生效可能是格式写错或者该通道在那个时间段没有数据。这一步做完你才能放心把数据交给下游。6.3 一个我常用的质检习惯我习惯在转换完成后做两件事一是统计输出文件数量和列表里的通道数对比二是随机抽三个文件用saclst看头段。如果数量对不上或者头段里的时间、台站有异常就回头查 SEED 文件本身。这个习惯帮我省过很多次返工——有一次批量转了 200 多个文件抽检时发现某个台站的通道名在 SEED 里就是错的如果没抽检错误会一直传到处理流程里。rdseed 这个工具不复杂但它的报错和输出经常需要你多看一眼。编译时把数学库链接对转换时把通道和时间窗写准批量时把日志记好基本就能稳定跑通。希望帮到你。本文还有配套的精品资源点击获取