简介:rdseedv5.3.1是一款面向Linux平台的地震数据格式转换工具,主要完成SEED标准格式到SAC分析格式的转换,核心服务对象是地震台网数据处理人员、科研院所研究者以及需要批量转换波形数据的工程技术人员。该压缩包共含454个文件,整体大小约2.72MB,内部以C语言源码(210个.c)、编译目标文件(209个.o)和头文件(11个.h)为主体,同时提供makefile构建脚本、已编译可执行程序、PDF说明文档,还包含分别针对x86_64与sparc_64架构的可执行文件,便于在不同Linux环境下直接调用或重新编译。源码覆盖SEED数据解包、SAC格式输出、Steim压缩算法等关键环节,借助readme与changes文件还能了解版本更新和编译注意事项,适合想深入理解地震数据格式转换机制的用户参考。目前已有335人学习下载,对需要在Linux下快速将地震数据转为SAC文件的研究者与工程师而言,这套资源兼具较高的实用价值。
1. 为什么地震数据处理离不开 rdseed:SEED 与 SAC 之间的格式鸿沟
拿到一批野外台站回传的.seed文件时,很多人第一反应是直接用 SAC 去读,然后被一串no data and no header卡住。SEED 是面向交换和归档的二进制容器,存储波形、标定、响应和注释;SAC 则是面向分析的内存模型,两者结构并不兼容。rdseed v5.3.1 正是连接这两端的经典转换器,在 Linux 下把 SEED 完整解析成 SAC 文件。它不仅还原波形,还会把台站标识、采样率、信道位置写进 SAC 头段。对于地震学研究、测震运维和应急数据处理人员,这是实实在在的基础工具。下面从 tar 包解压讲起,覆盖编译、参数选择、头段验证和批量处理,让手里这包源码真正跑起来。
2. 从 tar 包到可执行文件:rdseed 的源码结构、编译与依赖处理
2.1 解压与文件清单解读
先从最基础的解压开始。你拿到的压缩包文件名是rdseedv5.3.1.tar,这是一个普通的 tar 归档,不是 gzip 压缩的。在 Linux 终端执行:
tar -xvf rdseedv5.3.1.tar-x表示解压,-v打印处理过的文件列表,-f指定归档文件名。如果以后拿到的是.tar.gz或.tgz,则要用tar -zxvf,多了的-z是告诉 tar 先经 gzip 解压。解压后立刻用ls检查内容:
ls -l rdseedv5.3.1/此时能看到一组.c源码文件,包括rdseed.c(主控制逻辑)、output_sac.c(生成 SAC 文件的入口)、process_data.c(数据帧解析)、output_seed.c(回写 SEED 格式)、summary.c(输出统计摘要)、ah_resp.c(用于提取 AH 格式响应)、steim.c(解压 STEIM 压缩样本)以及ioroutin.c(底层读写)。看到这些文件就能判断,这个版本需要自己编译,没有现成二进制。
2.2 编译依赖与 Makefile 调整
rdseed 是标准 C 语言工程,依赖很少。通常只需要 gcc、make 和系统自带的 libc 数学库。最简单的方式是直接一条 gcc 命令把全部源文件编到一起:
gcc -O2 -o rdseed rdseed.c output_seed.c process_data.c output_sac.c summary.c ah_resp.c steim.c ioroutin.c output_mini.c -lm其中-O2开启二级优化,-o rdseed指定输出可执行文件名,-lm链接 libm 数学库。output_mini.c是编译时不可省略的依赖,缺了它会报未定义符号。最后生成的rdseed就是转换主程序。
如果后续需要反复修改,建议写成 Makefile 管理编译流程。常见做法是:
CC = gcc CFLAGS = -O2 -Wall OBJS = rdseed.o output_seed.o process_data.o output_sac.o \ summary.o ah_resp.o steim.o ioroutin.o output_mini.o rdseed: $(OBJS) $(CC) -o rdseed $(OBJS) -lm %.o: %.c $(CC) $(CFLAGS) -c $< clean: rm -f *.o rdseedMakefile 的关键在于把每个.c先编译成.o,最后链接,这样改output_sac.c时不需要重新编译全部源码。
2.3 编译失败时的常见排查
不同 Linux 发行版、不同 gcc 版本会遇到若干典型问题,按经验列出最常见的几项:
| 错误信息 | 原因 | 处理方式 |
|---|---|---|
undefined reference to 'pow' | 缺少数学库链接 | 编译命令末尾加-lm |
stdio.h: No such file or directory | 未装基础开发包 | Debian/Ubuntu 执行sudo apt install build-essential |
'for' loop initial declarations... C99 | 源码用了 C99 语法而 gcc 默认模式偏旧 | CFLAGS 加-std=c99 |
file too short | tar 包下载不完整 | 重新下载后用tar -tvf验证文件大小 |
编译出来后,在当前目录执行./rdseed,不带参数时正常会打印一屏 usage 说明,这时就能确认主程序可运行。如果提示error while loading shared libraries: libX,再去补对应运行库。
3. 命令行转换核心参数:-R、-d、-o 与通道筛选
3.1 rdseed 的核心参数组合
rdseed 的命令行选项很多,但日常转换最核心的是三个:-R强制输出 SAC 格式;-d从 SEED 数据帧中读波形;-o控制输出文件的命名方式。一个最保底、可复现的转换命令是:
./rdseed -f example.seed -R -d -o 1-f指定输入的 SEED 文件。-d告诉程序数据部分在输入文件里,让解码器进入数据模式。-R表示要 SAC,程序会调用output_sac.c里的写文件逻辑。-o 1让每个通道独立输出为一个文件,文件名带台站与信道信息,便于后续批量处理。执行成功后,目录下会出现若干.SAC文件。
建议把-o的不同取值记牢,它们决定后续脚本是否顺畅:
-o值 | 输出行为 | 适用场景 |
|---|---|---|
| 0 | 默认命名,SAC 文件名直接从 SEED 记录标识生成 | 单通道测试 |
| 1 | 每个通道独立文件,文件名含台站-信道 | 批量分析 |
| 2 | 按网络/台站分组组织目录 | 大型台网数据归档 |
3.2 只提取需要的通道和时间窗
实际数据处理中常碰到一个 SEED 文件里同时有多台站、三分量甚至多事件。全部转换不仅慢,还会把无关数据带进 SAC。-t参数可以指定起止时间,格式是年:儒略日:时:分:秒.毫秒,例如提取 2020 年第 5 天 06:00 到 07:00 的数据:
./rdseed -f big.seed -R -d -o 1 -t 2020:005:06:00:00.000:2020:005:07:00:00.000-t后是两个时间戳,中间用冒号分隔,整体作为参数传给程序。rdseed 解析后会在解码阶段直接跳过时间窗之外的数据帧,减少 IO 压力。需要指定特定信道时用-c,例如只保留 BHZ 分量:
./rdseed -f big.seed -R -d -o 1 -c BHZ-c后跟信道列表,多个信道用逗号连接,如-c BHZ,BHE,BHN。注意-c匹配的是 SEED 头段里的 channel 标识,大小写敏感,先加-l列出头段再筛最稳妥。
3.3 输出文件验证与字节序问题
转换完成后不要直接进 SAC,先用ls和file检查输出:
ls -lh *.SAC file *.SAC | head -5file输出显示SAC binary data或SAC - Seismic Analysis Code,确认是 SAC 格式而不是空文件。若遇到文件大小为 0,常见原因是-t时间窗设置与数据实际时间区间不重合,或使用了错误的大小写通道名。另外,SEED 数据本身带有字节序标记,rdseed 在ioroutin.c里处理字节序转换,编译器不改变逻辑,所以同一份源码在不同架构 CPU 上生成的 SAC 内容一致。
4. 转换之后:SAC 头段验证、批量脚本与格式坑
4.1 用 SAC 读取并检查头段
转换只是第一步,分析前必须确认 SAC 头段的台站、分量、起始时间和采样率正确。把生成的.SAC带进 SAC 程序,用lh命令列出头段:
sac << EOF r station.BHZ.SAC lh q EOFr读入文件,lh是 list header 的缩写,会输出KSTNM、KCMPNM、DELTA、NPTS、B、E等关键字段。重点检查DELTA是否等于 SEED 中定义的采样间隔,比如 40 Hz 数据DELTA应为 0.025。若出现 0.02500005 之类的小数,是浮点精度正常现象;但若差到 0.02,就要回到-t参数复查设置。
如果头段里台站名称是空或-12345(SAC 的未定义值),说明 rdseed 没有从 SEED 头段中解析到台站标识,常见原因是数据文件只有数据流没有头段卷。这种文件需要另外提供 dataless SEED 或 metadata 文件合并处理。
4.2 批量转换与文件管理脚本
一次野外任务往往涉及几十个 SEED 文件,手工敲-f不现实。在 Linux 下写一个简单的 bash 循环即可:
#!/bin/bash for f in *.seed; do echo "processing $f" ./rdseed -f "$f" -R -d -o 1 -q done-q是 quiet 模式,让 rdseed 只输出错误和摘要,避免每个通道一行日志刷屏。循环里用双引号包裹$f,防止文件名带空格时被拆分。脚本执行完,所有 SAC 文件会散落在当前目录,可以按台站归档:
mkdir -p sac_out mv *.SAC sac_out/如果一台机器要做长时间、多批次的转换,还可以把脚本改造成接受目录参数的形式,用find递归查找所有.seed文件:
find /data/seismic -name '*.seed' -exec ./rdseed -f {} -R -d -o 1 -q \;-exec对每个匹配文件执行一次 rdseed,{}会被替换成文件路径,\;表示命令结束。这是承接后续自动化转储的推荐写法。
4.3 常见异常与对策
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
报Error reading SEED header | 输入文件不是标准 SEED 或文件截断 | 用-l先列出头段,检查文件大小 |
| 转换出的 SAC 波形为直线 | 部分通道标记为标定数据 | 检查头段KCMPNM,确认不是LOG通道 |
提示steim2 decompression failed | 数据帧损坏或压缩格式不兼容 | 用 reftrack 检查文件完整性 |
缺少response头段 | SEED 未内嵌仪器响应 | 单独加载 RI 响应文件,或由 dataless SEED 补充 |
这里最值得注意的 steim 问题:SEED 中波形一般以 STEIM1/STEIM2 整数压缩存储,源码包里的steim.c负责解压。如果数据来自较老的记录器,可能存在非标压缩参数,程序会返回错误码而不崩溃,所以要检查退出码而不是只看有没有报错。
5. 进阶技巧:用时间窗分块与退出码实现大型 SEED 的可靠转换
5.1 拆时间窗避免长文件单点失败
超大型 SEED(连续观测一个月以上)一次转换耗时长,中途一张光盘数据帧损坏会导致整批 SAC 缺失。一个可行的办法是用-t参数把 SEED 按天或按小时切开,逐段转换。先列出 SEED 内部起点:
./rdseed -f big.seed -l 2>&1 | grep 'Begin time'拿到起点后,可以按天循环。假设起始日是 2020:005,想转 7 天数据,最直觉的写法是手工枚举或使用seq。这里给出一个可复制的最小示例,将一天切成 6 个 4 小时块:
for start_hour in 00 04 08 12 16 20; do end_hour=$((10#$start_hour + 4)) end_hour_pad=$(printf "%02d" $end_hour) ./rdseed -f big.seed -R -d -o 1 \ -t "2020:005:${start_hour}:00:00.000:2020:005:${end_hour_pad}:00:00.000" \ -q done注意10#$start_hour强制按十进制计算,防止 08、09 被 bash 当作八进制。每段转换独立执行,一段失败不会影响其他段,日志里能清晰看到哪一段出问题。之后用ls *.SAC | wc -l统计数量,与预期块数对比,就能快速定位缺哪个时窗。
5.2 用退出码把转换变成可重试任务
rdseed 是 C 程序,正常完成时退出码为 0,任何错误都会返回非零值。可以利用这一点写一个简单的失败重试队列:
./rdseed -f chunk_0005.seed -R -d -o 1 -q if [ $? -ne 0 ]; then echo "chunk_0005 failed, try again with verbose" ./rdseed -f chunk_0005.seed -R -d -o 1 fi$?保存上一条命令的退出码。失败时去掉-q重新执行,能看到具体错误位置。更工程化的做法是把失败文件名写入fail.log,下次 cron 任务直接读它作为待转列表,把断点补全。
本文还有配套的精品资源,点击获取