ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下rdseed 5.3.1编译与SEED转SAC实战指南

Linux下rdseed 5.3.1编译与SEED转SAC实战指南 简介rdseedv5.3.1 是一款运行于 Linux 环境的地震数据格式转换工具面向地震学研究者与数据分析人员用于将标准 SEED 格式的地震记录转换为 SAC 可读格式解决不同分析软件间数据格式不兼容的问题。使用前需具备基本的 Linux 命令行操作能力并了解 SEED 与 SAC 两种格式的基本概念。压缩包共 454 个文件约 2.72MB以 C 源码210 个 .c与编译目标文件209 个 .o为主体另含头文件、Makefile、说明文档及针对 x86_64、sparc 等平台的预编译文件用户可自行编译或直接调用可执行程序。目前已有 338 人学习下载。资源完整保留了 rdseed 的核心转换模块涵盖 SEED 读取、SAC 输出、Steim 压缩解码与响应文件处理等环节便于读者理解转换流程、按需调整参数并在此基础上完成波形提取与后续分析。1. rdseed 在 Linux 上到底解决什么问题从 SAC 读不了 SEED 说起如果你手头拿到一份.seed或.dataless文件用 SAC 的read命令死活读不进去或者读进去之后时间戳、台站名全乱套那大概率不是 SAC 的锅而是你缺了 rdseed 这一步。rdseed 是 IRIS 出品的 SEED 格式解码工具它把标准 SEED 卷转换成 SAC、AH、miniSEED、SAC ASCII 等一堆地震学常用格式。标题里的rdseedv5.3.1.tar_linux_sac_seed_拆开看就是rdseed 5.3.1 版本的源码 tar 包跑在 Linux 上服务于 SAC 和 SEED 之间的格式转换。这篇文章不讲空泛概念只讲怎么在 Linux 上把这个 tar 包编译出来、怎么用它把 SEED 转成 SAC、参数怎么调、哪些坑我踩过。适合做地震数据处理、台站数据归档、或者刚接手一批 SEED 数据不知道从哪下手的从业者。如果你只会sac不会rdseed那你的数据处理链路是断的。2. 编译 rdseed 5.3.1从 tar 包到可执行文件的完整路径2.1 为什么源码编译比找二进制包更靠谱rdseed 官方确实提供部分平台的预编译二进制但在 Linux 上尤其是国产 Linux 发行版或者较新的 glibc 环境下直接跑二进制经常遇到GLIBC_2.xx not found或者段错误。源码编译的好处是编译器会针对你当前系统的库版本重新链接生成的rdseed可执行文件跟你的环境是匹配的。另外 5.3.1 这个版本对 SAC 输出格式的支持比较完整包括-o选项控制输出类型、-f指定响应文件等这些在旧版本里要么没有要么行为不一致。编译之前先确认三样东西gcc、make、以及一个可用的 Fortran 编译器。rdseed 的源码里混了 C 和 Fortran没有gfortran会在链接阶段报一堆undefined reference to _gfortran_之类的错误。检查命令很简单gcc --version gfortran --version make --version如果gfortran没装Debian/Ubuntu 系用sudo apt install gfortranRHEL/CentOS/Rocky 系用sudo dnf install gcc-gfortran。国产 Linux 比如统信 UOS 或麒麟包管理器不同但包名类似找gfortran就行。2.2 解包、配置、编译的三步操作拿到rdseedv5.3.1.tar之后不要急着tar xvf完就make。先看清楚压缩格式.tar就是纯 tar 归档没有 gzip 压缩。解包命令tar -xvf rdseedv5.3.1.tar cd rdseedv5.3.1 ls你会看到类似makefile、Source目录、README之类的结构。rdseed 的构建系统比较老派没有configure脚本直接改makefile里的编译器变量。打开makefile找到CC和FC这两行# 编辑 makefile确认以下变量 CC gcc FC gfortran CFLAGS -O2 -m64 FFLAGS -O2 -m64 -stdlegacy-m64在 64 位系统上必须加否则可能生成 32 位目标文件导致链接失败。-stdlegacy是给 gfortran 用的因为 rdseed 的 Fortran 代码写于 F77 时代不加这个选项新版本 gfortran 会报语法错误。改完之后make clean make编译过程大概一到两分钟如果最后一行没有Error当前目录下会出现rdseed可执行文件。验证一下./rdseed -h能打印出帮助信息就说明编译成功了。把rdseed复制到/usr/local/bin或者加到PATH里后面用起来方便sudo cp rdseed /usr/local/bin/ rdseed -h提示如果make报错找不到-lX11或类似图形库说明 makefile 里链接了不需要的库直接删掉对应的-l选项即可rdseed 核心功能不依赖图形界面。2.3 编译参数对 SAC 输出兼容性的影响CFLAGS和FFLAGS里的-O2是优化级别一般够用。如果你在嵌入式 Linux 或者资源受限的环境上编译可以降到-O1甚至-O0但转换大文件时速度会慢。-m64前面说了64 位系统必加。还有一个隐藏参数如果你的系统默认字节序是大端某些 MIPS 或 PowerPC 平台rdseed 读 SEED 文件时可能把数据字节序搞反输出 SAC 波形全是噪声。这种情况在 x86_64 上极少见但如果你在国产化硬件平台上跑编译完先用一个小 SEED 文件测试确认波形振幅合理再批量处理。3. 用 rdseed 把 SEED 转成 SAC命令、参数与批量脚本3.1 单文件转换的最小命令与输出类型选择rdseed 最常用的场景就是把一个 SEED 文件转成 SAC 格式。最小命令rdseed -f input.seed -o output.sac但这条命令有个问题-o后面跟的是输出文件前缀rdseed 会根据 SEED 文件里的台站和通道信息自动生成多个 SAC 文件命名规则类似output.BHZ.sac、output.BHN.sac。如果你想要更可控的输出用-d指定输出目录mkdir sac_output rdseed -f input.seed -d sac_output -o sta-f指定输入 SEED 文件-d指定输出目录-o指定输出文件名的前缀。rdseed 支持的输出格式通过-o后面的参数控制但更直接的方式是用-p选项指定输出类型。比如只要 SAC 格式rdseed -f input.seed -d sac_output -p SAC-p后面可以跟SAC、AH、SEED、ASCII等。如果你同时要 SAC 和 miniSEED可以跑两次或者用-p的变体。实际工作中我一般先跑一次-p SAC确认数据没问题再根据需要转其他格式。3.2 响应文件与时间校正-R 和 -t 的配合SEED 文件里通常包含仪器响应信息但 rdseed 默认不会把响应写到 SAC 文件里。如果你后续要用 SAC 做去仪器响应需要加-R选项rdseed -f input.seed -d sac_output -p SAC -R-R会把响应信息以 SAC 的RESP格式输出到单独文件SAC 读的时候用rmean、rtrend、transfer等命令配合。另一个常用选项是-t用来指定时间窗口rdseed -f input.seed -d sac_output -p SAC -t 2024,001,00:00:00,2024,001,01:00:00-t后面跟起始和结束时间格式是年,儒略日,时:分:秒。这个在只关心某段事件波形时特别有用避免转出几百 MB 的无用数据。注意时间格式里的逗号不能换成空格rdseed 对格式很敏感。3.3 批量转换脚本处理整个目录的 SEED 文件实际项目里你不会只有一个 SEED 文件而是一整个目录。写个 bash 脚本批量跑#!/bin/bash # 批量将当前目录下所有 .seed 文件转为 SAC for seedfile in *.seed; do # 去掉 .seed 后缀作为输出前缀 prefix${seedfile%.seed} # 为每个文件建独立输出目录 mkdir -p sac_${prefix} # 执行转换-R 输出响应文件 rdseed -f $seedfile -d sac_${prefix} -p SAC -R # 检查退出状态 if [ $? -ne 0 ]; then echo 转换失败: $seedfile convert_error.log else echo 转换成功: $seedfile fi done脚本逻辑很直白遍历*.seed每个文件建一个以文件名命名的目录跑 rdseed失败记日志。$?是上一条命令的退出码rdseed 正常结束返回 0非 0 就说明有问题。convert_error.log里会记录哪些文件翻车了方便回头单独排查。这个脚本我用了好几年唯一要注意的是如果 SEED 文件特别大比如超过 2GBrdseed 可能会因为内存不足失败这时候需要先用-t切时间窗口分块转。注意批量转换时如果输出目录已存在同名 SAC 文件rdseed 默认会覆盖不会提示。如果你不想覆盖在脚本里加个判断或者每次转换前清空输出目录。4. rdseed 转换翻车现场5 个血泪踩坑记录4.1 现象SAC 读入后波形是一条直线振幅全为零原因SEED 文件里的数据是压缩过的 Steim-1 或 Steim-2 格式rdseed 在编译时如果没正确链接解压库或者 makefile 里漏了-lz解压环节静默失败输出全零。另一种可能是 SEED 文件本身损坏下载不完整。解决先确认编译时 makefile 里有没有-lz没有就加上重新编译。然后用rdseed -f input.seed -v打开 verbose 模式看解压过程中有没有报错。如果 verbose 输出正常但波形还是零用sac读入后执行lh看depmin和depmax如果都是 0换一个已知正常的 SEED 文件对比测试排除文件本身的问题。4.2 现象转换出来的 SAC 文件时间戳是 1970 年原因SEED 文件头里的起始时间字段是零值或者格式不被 rdseed 5.3.1 识别。常见于某些数据中心的自动归档系统生成的 SEED 文件时间字段用了非标准编码。解决用rdseed -f input.seed -v看头部解析日志找到Start time那一行。如果显示1970/001或者0000/000说明 SEED 头有问题。这时候可以用-t强制指定时间窗口rdseed 会以你给的时间为准重新计算。但波形数据本身的时间偏移可能还在需要后续在 SAC 里用ch命令手动改kztime和kzdate。4.3 现象make 编译到一半报undefined reference to _gfortran_compare_string原因gfortran 版本太新rdseed 的 Fortran 代码里用了老式字符串比较新编译器不再默认支持。或者 makefile 里FC指向了f77而不是gfortran。解决确认FC gfortran并且在FFLAGS里加-stdlegacy -fno-underscoring。-fno-underscoring是防止 gfortran 在符号名后面加下划线导致 C 和 Fortran 混合编程时链接不上。如果还报错把 gfortran 降到 9 或 10 版本太新的版本12对 F77 代码兼容性反而差。4.4 现象rdseed 运行时报Segmentation fault且无任何输出原因最常见的是输入文件路径太长或者包含特殊字符空格、中文、括号。rdseed 内部用固定长度字符数组存文件名超过 256 字符或者遇到非 ASCII 字符直接越界。解决把 SEED 文件重命名为短英文名放在路径深度不超过三层的目录里。比如/data/seed/2024/input.seed这种结构就很好。不要用/home/用户/地震数据/2024年1月/台站数据.seed这种路径翻车概率极高。4.5 现象转换成功但 SAC 文件里通道名全是 BH而不是 BHZ原因SEED 文件里的通道标识是三个字符如 BHZ但 rdseed 在某些输出模式下会截断成两个字符。这通常是-p SAC和-o前缀组合使用时文件名生成逻辑的 bug。解决升级到 rdseed 5.3.1 的最新补丁版本或者在转换后用脚本批量重命名 SAC 文件。SAC 文件内部的kcmpnm字段可以用sac的ch命令修改sac sac r file.sac sac ch kcmpnm BHZ sac w over批量处理的话写个 SAC 宏脚本遍历所有文件改kcmpnm。这个坑不致命但很烦尤其是后续要用通道名做筛选的时候。5. 进阶用 rdseed 输出 miniSEED 并接入 ObsPy 验证rdseed 不只是 SAC 的预处理工具它还能输出 miniSEED这对接 Python 生态很有用。命令rdseed -f input.seed -d mseed_output -p SEED输出的是标准 miniSEED 文件可以直接用 ObsPy 读取验证from obspy import read # 读取 rdseed 输出的 miniSEED st read(mseed_output/*.mseed) print(st) # 检查台站、通道、采样率 for tr in st: print(tr.stats.station, tr.stats.channel, tr.stats.sampling_rate) # 简单绘图确认波形 st.plot()这段代码先读所有 miniSEED 文件打印每个 trace 的台站名、通道名和采样率最后画图。如果采样率显示为 0 或者台站名为空说明 rdseed 输出时头部信息丢失回头检查-p SEED是否拼写正确。ObsPy 的read函数对 miniSEED 兼容性很好能直接读 rdseed 的输出这比用 SAC 读再转 Python 省事得多。一个实用技巧如果你要批量验证几百个 SEED 文件的转换质量用 ObsPy 写个循环检查每个文件的stats.npts是否大于零、stats.sampling_rate是否在合理范围比如 1 到 200 Hz把异常文件列出来。这比一个个用 SAC 打开看快得多。我现在的习惯是rdseed 转完先跑一遍 ObsPy 质检脚本确认没问题再进 SAC 做后续处理。这样能把大部分格式问题挡在预处理阶段避免后面去仪器响应时才发现数据是坏的。希望帮到你。本文还有配套的精品资源点击获取
返回列表