ARTICLE DETAIL

资讯详情

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

Linux下rdseed编译与SEED/SAC双向转换实战指南

Linux下rdseed编译与SEED/SAC双向转换实战指南 简介rdseedv5.3.1 是一款运行于 Linux 平台的地震数据格式转换工具面向地震学研究者与数据处理人员用于将标准 SEED 格式的地震记录转换为 SAC 可识别的文件解决不同分析软件间数据格式不兼容的问题。压缩包共 454 个文件约 2.72MB以 C 源码210 个 .c与编译目标文件209 个 .o为主体另含头文件、Makefile、说明文档及针对 x86_64、sparc 等平台的预编译文件用户可自行编译或直接调用可执行程序。资源已有 338 人学习下载适合具备一定 Linux 命令行基础、需要批量处理台站波形数据的读者。借助该工具读者可完成从 SEED 到 SAC 的批量转换并结合 SAC 进行波形查看、滤波与事件定位等后续分析是地震数据处理流程中衔接采集与研究的实用环节。1. 从 rdseedv5.3.1.tar 说起Linux 下把 SAC 波形和 SEED 数据打通的真实场景如果你手头有一批.seed格式的台站观测数据想转成 SAC 能直接读的波形或者反过来要把 SAC 波形打包成 SEED 交付那你迟早会撞上rdseed这个工具。标题里的rdseedv5.3.1.tar就是它的源码包linux是运行平台sac和seed分别是目标格式和源格式。这三个词凑在一起说的其实是一件很具体的事在 Linux 上把 IRIS 出品的 rdseed 编译起来用它完成 SEED 与 SAC 之间的双向转换。这件事听起来简单但真正动手的人都知道从拿到 tar 包到跑出一条能用的 SAC 波形中间隔着编译环境、依赖库、参数选择、台站元数据匹配好几道坎。新手最容易卡在make报错上熟手则更关心-d、-o、-f这些参数怎么组合才能批量处理而不丢数据。这篇笔记就按我实际干活的顺序把编译、转换、验证、排错整条链路讲清楚让你拿到 tar 包当天就能跑出结果。2. 编译 rdseedv5.3.1从 tar 包到可执行文件的完整链路2.1 为什么 rdseed 在 Linux 上编译总出问题rdseed 的源码是 Fortran 和 C 混写的早期版本对编译器版本相当敏感。v5.3.1 这个版本已经比老版本友好了不少但它默认的 Makefile 仍然假设你系统里有gfortran和gcc而且对libm、libncurses这些基础库有隐式依赖。很多人解压后直接make看到一堆undefined reference就懵了其实大部分是缺编译器或者缺开发库头文件。另一个容易被忽略的点是rdseed 的源码目录里通常带一个makefile全小写和一个Makefile在不同文件系统上大小写敏感行为不一样。Linux 下大小写敏感如果你敲的是make -f makefile而实际文件叫Makefile就会直接报找不到文件。我一般先ls看一眼再决定用哪个。还有一点rdseed 编译出来的可执行文件默认叫rdseed但它依赖一个叫rdseed.stations或者通过-s指定的台站文件来解析台站坐标。编译本身不涉及这个文件但如果你编译完直接跑转换没有台站文件输出 SAC 的台站信息就是空的。这个坑后面会细说。2.2 编译前的环境准备与依赖检查在动手之前先把编译工具链装齐。以 Debian/Ubuntu 系为例一条命令搞定sudo apt update sudo apt install -y gcc gfortran make libncurses-dev如果你用的是 RHEL/CentOS/Rocky 系换成sudo yum install -y gcc gcc-gfortran make ncurses-devel装完之后验证一下版本gfortran --version gcc --version make --version这三条都能正常输出版本号才说明环境就绪。我遇到过有人gfortran装了但gcc没装编译到 C 部分就挂报错信息还特别隐晦所以两个都要确认。提示如果你在国产 Linux 发行版上操作包管理器可能是apt也可能是yum或dnf先cat /etc/os-release确认发行版再选命令。依赖包名字可能略有差异但核心就是编译器、make、ncurses 开发库这三样。2.3 解压、配置、编译、安装四步走假设你已经把rdseedv5.3.1.tar放到了~/src目录下完整操作如下cd ~/src tar -xvf rdseedv5.3.1.tar cd rdseedv5.3.1 lsls之后你会看到源码文件和一个 makefile。接下来编译make如果一切顺利当前目录下会出现一个名为rdseed的可执行文件。验证一下./rdseed -h能打印出帮助信息就说明编译成功了。然后把它放到系统路径里方便全局调用sudo cp rdseed /usr/local/bin/ sudo chmod x /usr/local/bin/rdseed再执行rdseed -h如果不用./也能跑就说明安装到位了。这里解释一下几个关键点。tar -xvf里的x是解压v是显示过程f指定文件名。make不带参数时默认读取当前目录的Makefile或makefile按里面的规则编译。/usr/local/bin是 Linux 下用户自行安装软件的标准位置放在这里不需要改PATH就能直接调用。如果make报错最常见的两类一是gfortran: command not found说明编译器没装二是cannot find -lncurses说明 ncurses 开发库没装。按 2.2 节的命令补装即可。还有一类是权限问题如果你在系统目录里编译可能因为写权限不足失败换到用户主目录下操作就行。2.4 编译参数怎么调优化级别与调试符号的取舍rdseed 的 makefile 里通常有CFLAGS和FFLAGS两个变量控制编译选项。默认可能是-O2或者空。如果你只是日常转换数据保持默认就行-O2在性能和编译时间之间平衡得不错。但如果你遇到转换结果异常、怀疑是编译优化导致的数值问题可以手动降级make clean make CFLAGS-O0 -g FFLAGS-O0 -g-O0关闭优化-g保留调试符号。这样编译出来的二进制体积大、跑得慢但出问题时能用gdb跟进去看。我一般只在排查诡异 bug 时才这么干正常生产环境还是用默认优化。注意make clean会删掉之前编译的中间文件和可执行文件确保你不需要保留旧版本再执行。如果你已经cp到了/usr/local/binmake clean不会影响那边但重新编译后记得再cp一次覆盖。编译这一步说到底就是环境齐全、命令敲对、参数按需调整。真正花时间的是后面的转换环节因为 SEED 和 SAC 之间的映射关系比想象中复杂。3. SEED 转 SAC 实操命令、参数与批量处理脚本3.1 rdseed 转换 SEED 到 SAC 的核心命令拆解最基础的一条转换命令长这样rdseed -f input.seed -d -o -g逐个参数解释-f指定输入的 SEED 文件-d表示输出 SAC 格式-o表示覆盖已有输出文件-g是让 rdseed 在输出 SAC 时把台站信息也写进去。这四个参数组合是我日常用得最多的能覆盖大部分单文件转换场景。执行完之后当前目录下会生成一堆.SAC文件命名规则通常是NET.STA.LOC.CHA.SAC或者类似格式取决于 SEED 文件里的台站命名。你可以用ls *.SAC看一眼数量对不对。但这里有个细节-g参数依赖台站文件。如果 rdseed 找不到台站信息它仍然会输出 SAC 文件但头段里的台站经纬度、高程这些字段可能是零或者缺失。所以更稳妥的做法是显式指定台站文件rdseed -f input.seed -d -o -g -s rdseed.stations-s后面跟台站文件路径。这个文件可以从 IRIS 或者数据提供方那里获取格式是 rdseed 自己的台站列表格式每行包含台网、台站、通道、经纬度、高程、起始时间等信息。3.2 批量转换用 shell 脚本处理整个目录的 SEED 文件实际工作中很少只转一个文件。假设你有一个目录seed_data/里面全是.seed文件想全部转成 SAC 并放到sac_output/下可以写一个简单的 shell 脚本#!/bin/bash # 批量将 seed_data 目录下的 .seed 文件转换为 SAC INPUT_DIRseed_data OUTPUT_DIRsac_output STATIONSrdseed.stations mkdir -p $OUTPUT_DIR for seedfile in $INPUT_DIR/*.seed; do basename$(basename $seedfile .seed) mkdir -p $OUTPUT_DIR/$basename cd $OUTPUT_DIR/$basename || exit 1 rdseed -f ../../$seedfile -d -o -g -s ../../$STATIONS cd - /dev/null || exit 1 echo 转换完成: $seedfile done这段脚本的逻辑是遍历seed_data下所有.seed文件为每个文件在输出目录里建一个同名子目录进入子目录后执行 rdseed 转换这样不同 SEED 文件产生的 SAC 不会混在一起。cd -回到上一级目录继续循环。参数方面basename命令去掉文件后缀mkdir -p确保目录存在且不报错。../../是因为脚本在子目录里执行需要回退两级才能找到原始的 seed 文件和台站文件。如果你把脚本放在别的位置路径要相应调整。提示如果 SEED 文件很大转换过程可能持续几分钟到几十分钟。建议在rdseed命令后面加 echo OK来确认每条命令是否成功或者在脚本里加错误判断。我一般会在循环里加if [ $? -ne 0 ]; then echo 失败: $seedfile; fi这样哪个文件出问题一目了然。3.3 转换结果验证用 SAC 读一遍头段信息转换完不能直接就用得先验证。最直接的方法是用 SAC 打开一个文件看头段sac进入 SAC 交互界面后r NET.STA.LOC.BHZ.SAC lhr是读文件lh是列出头段。你会看到stla、stlo、stel、kstnm、kcmpnm这些字段。重点检查台站经纬度是否合理、通道名是否正确、采样率和时间戳是否对得上。如果stla和stlo都是零说明台站文件没生效回去检查-s参数路径。也可以用非交互方式快速检查sac EOF r *.SAC lh stla stlo stel kstnm q EOF这样会批量打印所有 SAC 文件的台站信息适合快速扫一眼有没有明显异常。3.4 反向操作SAC 转 SEED 的命令与注意事项rdseed 也支持把 SAC 转回 SEED命令是rdseed -f sac_list.txt -R -o这里-R表示从 SAC 转 SEED-f后面跟的是一个文本文件里面每行列出一个 SAC 文件路径。注意不是直接跟 SAC 文件名而是跟一个列表文件。这个列表文件需要你自己生成ls *.SAC sac_list.txt rdseed -f sac_list.txt -R -o输出会是一个 SEED 文件默认名字可能是rdseed.seed或者类似。反向转换时最容易丢的是台站元数据因为 SAC 头段里的信息不一定完整。如果 SAC 文件是从别处来的头段里缺kstnm或者经纬度转出来的 SEED 台站信息就是空的。所以反向转换前最好先用lh确认 SAC 头段完整。注意SAC 转 SEED 时rdseed 对通道命名和采样率的匹配比较严格。如果 SAC 头段里的kcmpnm不是标准通道名比如 BHZ、HHN 这种转换可能失败或者输出异常。遇到这种情况先用 SAC 的ch命令修改头段再转。4. 避坑与排查rdseed 转换中最容易翻车的五个地方4.1 编译通过但运行报 “cannot open station file”现象rdseed -f input.seed -d -o -g执行后提示找不到台站文件或者输出 SAC 头段里台站信息为空。原因-g参数需要台站文件支持但 rdseed 默认会在当前目录找rdseed.stations找不到就静默跳过台站信息写入或者直接报错退出。很多人以为-g是“自动获取台站信息”其实它只是“如果找到台站文件就写进去”。解决显式用-s指定台站文件路径并确保文件格式正确。台站文件可以从数据提供方获取也可以自己按 rdseed 格式手写。格式不对的话rdseed 会忽略或者报解析错误。4.2 转换出来的 SAC 文件数量对不上现象SEED 文件里明明有 3 个台站、每个台站 3 个通道但转出来只有 5 个 SAC 文件。原因rdseed 默认只转换它认为“有效”的通道。如果 SEED 文件里某些通道的时间段不完整、或者采样率标记异常rdseed 可能跳过。另外-d参数下 rdseed 默认按通道输出但如果多个通道数据在同一个时间窗内完全重叠它可能只保留一个。解决加-v参数看详细输出rdseed 会打印每个通道的处理情况。如果确实有通道被跳过检查 SEED 文件本身是否完整。也可以用-q参数调整输出策略但最稳妥的还是先确认源数据没问题。4.3 编译时提示 “undefined reference toncurses”现象make到最后链接阶段报一堆undefined reference关键词是ncurses或者tgetent、tputs之类。原因系统装了 ncurses 运行库但没装开发库头文件和静态库。rdseed 的交互模式依赖 ncurses链接时需要-lncurses。解决按 2.2 节安装libncurses-devDebian/Ubuntu或ncurses-develRHEL 系。装完make clean make重新编译。4.4 SAC 读文件报 “header not found” 或时间戳异常现象SAC 能读文件但lh显示的时间字段是零或者bz字段异常。原因rdseed 输出 SAC 时时间信息来自 SEED 头段。如果 SEED 文件本身的时间标记有问题或者 rdseed 在转换时用了-t参数裁剪时间窗但没对齐就会导致时间字段异常。解决先不加任何时间裁剪参数转一遍确认原始时间信息是否正确。如果原始数据时间就有问题那得回去找数据提供方。如果原始数据没问题但转换后异常检查 rdseed 版本v5.3.1 在时间处理上比老版本稳定很多。4.5 批量转换时中途卡死或内存暴涨现象脚本跑了几十个文件后突然卡住或者系统内存被吃满。原因rdseed 在处理超大 SEED 文件时如果不用-o覆盖模式可能会反复询问是否覆盖已有文件在非交互环境下就卡住了。另外某些版本的 rdseed 在处理连续波形时有内存泄漏的传闻虽然 v5.3.1 已经改善很多但超大文件仍然吃内存。解决批量脚本里一定加-o参数避免交互提示。对于超大 SEED 文件可以先用-t参数按时间段切分转换或者用-q调整内部缓冲区。如果内存实在紧张分批次处理每批转换完手动释放一下。提示这五条里第一条和第五条是我踩过最多次的。台站文件问题几乎每个新手都会遇到而批量转换卡死往往是因为忘了加-o。记住这两个能省不少时间。5. 进阶技巧用 rdseed 的隐藏参数提升转换效率与数据质量5.1 用 -q 和 -t 精细控制输出rdseed 的帮助信息里有一堆参数但文档写得比较简略。我实际用下来-q和-t这两个最值得花时间研究。-q控制输出模式。默认情况下 rdseed 按通道输出 SAC每个通道一个文件。但如果你加-q后面跟不同字母可以改变输出策略。比如-q d会按天输出把同一天所有通道合并到一个文件里。这对于需要连续波形的研究特别有用省得自己再去合并。-t控制时间窗。格式是-t start end比如-t 2020,01,01,00,00,00 2020,01,02,00,00,00表示只转换这个时间段的数据。时间格式是逗号分隔的年月日时分秒。这个参数在只需要某次事件波形时非常高效避免转出大量无关数据。组合使用示例rdseed -f input.seed -d -o -g -s rdseed.stations -t 2020,01,01,00,00,00 2020,01,02,00,00,00 -q d这条命令会只转 2020 年元旦当天的数据并按天合并输出。实际用的时候注意时间格式不能有空格逗号分隔要严格对齐。5.2 台站文件的制作与校验台站文件是 rdseed 转换质量的命门。如果你拿不到现成的rdseed.stations可以自己从 SEED 文件里提取。rdseed 有一个-S参数可以输出台站列表rdseed -f input.seed -S这会生成一个台站文件但格式可能和-s期望的略有差异。我一般会打开看一眼确保每行的台网、台站、通道、经纬度、高程、起始时间、结束时间这些字段都在正确的位置。如果缺字段手动补一下。校验台站文件是否被正确读取可以在转换时加-v参数rdseed 会打印它读到的台站信息。如果打印出来的经纬度和你预期的一致说明文件没问题。5.3 转换后的 SAC 批量重命名与整理rdseed 输出的 SAC 文件名有时候不太符合个人习惯比如带多余的点号或者大小写不统一。我通常会在转换后跑一个小脚本统一重命名#!/bin/bash # 将 SAC 文件名统一为大写并去掉多余的点号 for f in *.SAC; do newname$(echo $f | tr [:lower:] [:upper:] | sed s/\.\./\./g) if [ $f ! $newname ]; then mv $f $newname fi done这段脚本把文件名转大写并把连续两个点替换成一个点。tr负责大小写转换sed负责替换。跑完之后文件名整齐很多后续批量处理不容易出错。5.4 一个我常用的验证习惯每次转换完我不会直接就把数据扔进后续流程而是固定做三件事第一用ls *.SAC | wc -l数一下文件数量和预期对比第二随机抽一个文件用 SAC 的lh看头段重点确认stla、stlo、kstnm、kcmpnm、delta这几个字段第三用sac的plot命令画一下波形肉眼扫一眼有没有明显异常比如全零、削波、时间轴错乱。这个习惯帮我拦下过好几次问题。有一次批量转换后文件数量对但抽检发现某个通道的delta是零导致后续采样率计算全错。如果没抽检这个错误会一直带到最终结果里回头排查成本极高。提示delta是采样间隔单位秒。lh delta看到的值应该是 0.01100Hz或 0.0250Hz这类正常值。如果是零或者负数说明 SEED 头段有问题转换出来的 SAC 不能用。5.5 关于 rdseed 版本选择的个人建议v5.3.1 这个版本在 Linux 上的稳定性已经不错但如果你遇到编译问题实在解决不了可以试试用发行版自带的包管理器安装。有些 Linux 发行版的软件源里直接有rdseed包比如apt install rdseed或者yum install rdseed。版本可能旧一点但省去编译麻烦。不过要注意包管理器装的版本可能不带某些新参数用之前先rdseed -h确认一下。我自己是习惯从源码编译因为可以控制编译选项而且能确保用的是最新版本。但如果你只是偶尔转几个文件包管理器版本完全够用。选哪个取决于你的使用频率和对版本特性的依赖程度。希望这些经验帮到你少走几个我当年走过的弯路。本文还有配套的精品资源点击获取
返回列表