SAC学习笔记

参考

[seisman]https://seisman.github.io/SAC_Docs_zh/

SAC 安装

安装依赖包:

1
2
3
sudo yum install gcc gcc-c++ make
sudo yum install glibc ncurses-devel libSM-devel libICE-devel
sudo yum install libXpm-devel libX11-devel zlib-devel libedit-devel

有些依赖包可能无法安装,例如下面几个。需要手动进行安装。

libedit下载地址:

https://centos.pkgs.org/8/centos-powertools-x86_64/libedit-devel-3.1-23.20170329cvs.el8.x86_64.rpm.html
yum安装即可。
这个安装包未知是否必须安装。

运行如下命令解决报错:X11等错误的情况。
yum install libX*

另几个依赖包:

1
2
sudo yum install libxml2 libxml2-devel -y
sudo yum install -y libcurl-devel.x86_64

编译安装

1
2
3
4
5
mkdir build
cd build
../configure --prefix=/usr/local/sac
make
sudo make install

运行在主目录下的bashrc文件:~/.bashrc,加入语句:

1
2
3
4
5
6
7
export SACHOME=/usr/local/sac
export SACAUX=${SACHOME}/aux
export PATH=${SACHOME}/bin:${PATH}

export SAC_DISPLAY_COPYRIGHT=1
export SAC_PPK_LARGE_CROSSHAIRS=1
export SAC_USE_DATABASE=0

运行
source ~/.bashrc
即可。

SAC入门

启动与退出

启动SAC

在控制端输入
sac

退出SAC

在SAC控制端输入quit

样本数据

SAC支持生成样本数据进行学习,即使手头没有SAC数据也可以进行学习使用。

funcgen(fg)

funcgen(function generator),该命令可以生成一些特定的函数,例如脉冲函数、阶跃函数、正弦函数等。

1
2
3
fg impluse  # 生成脉冲函数
plot # 绘图,将上面的脉冲函数绘制出来
fg seismogram # 生成地震波形样本 使用该命令会在内存中删除上面生成的脉冲信号。

datagen(dg)

datagen(data generator)。该命令用于生成数据。

1
2
dg sub local cdv.?  # 生成了CDV台站记录到的近震三分量波形数据,共有三个波形
pl # plot的简写

读写数据

写入数据

读取数据之前需要拥有SAC数据。除了申请获取之外,换可以通过生成样本数据的方式获取SAC数据。

在SAC中进行下列输入

1
2
3
datagen sub local cdv.n cdv.e cdv.z  # 生成三个SAC数据
write cdv.n cdv.e cdv.z # 写入磁盘中
ls # SAC中调用的linux系统命令,表示显示当前文件夹下的目录

写入数据的步骤如下:

1
2
3
w test.n test.e test.z  # 将内存中的三组数据分别写入到三个新的文件中
w over # 覆盖原来的文件
w append .new # 在原来的文件名后面加上后缀.new

读取数据

通配符与Linux相同。

  1. * 匹配任意长度字符串
  2. ? 匹配任意单个非空字符
  3. [] 匹配从a到g范围内的任意单个字符
    • [ABC]或者A,B,C匹配单个字符A或B或C
    • [0-9]匹配任意一位数字
    • [a-g]匹配a到g范围内任意单个字符
1
2
3
4
read cdv.n cdv.e cdv.z  # 读取这三个文件,分别指定这三个文件的文件名
read cdv.? # 读取cdv.开头的所有文件,但是.后面只有一个字符。
read cdv.[nez] # 匹配这三个字符的cdv.开头的文件
r * # 读取该目录下的所有文件

!!!注意:数据读取到内存中时,每次读取都会清空内存,因此只会保留一次read的数据。
使用more进行追加。

1
read more 文件名(绝对地址)

绘图

绘图在上文中已经提及,使用plot进行绘制。此外,还有
plot1plot2plotpk命令。

同时绘制多个波形时,先显示一个波形,在命令行界面显示Waiting
。使用回车显示下一个波形。如果不想显示,可以使用kill命令,简写k杀死进程。

绘图命令

plot

plot绘制内存块中的所有波形数据,但是每次只显示一个波形,然后等待用户输入再决定是否显示下一个波形。

使用回车显示下一个波形,或者使用kill命令杀死进程。

plot1

绘制内存块中的所有波形数据,在同一个窗口中一次显示多个波形,拥有共同的X轴和单独的Y轴。

使用perplot命令设置每个窗口显示的图形数量。

1
plot1 perplot n # n为显示数量

默认情况波形数据按照绝对时间absolute对齐,若波形数据具有不同的开始时间,则波形数据会出现相对错动;
可以使用所有波形数据相对于relative各自的开始时间进行绘图,此时X坐标起始为0。

plot2

一次性将所有内存块中的所有波形绘制在一个窗口内,所有波形共用X轴和Y轴。
因此其适合多个波形对比。

1
2
color red inc list red blue # 对两个数据分别设置红色和蓝色
plot2 # 简写p2

plotpk ppk

在窗口中显示指定个数的波形,共用X轴,具有单独Y轴。常用于拾取震相。

plotpm ppm

利用成对的波形数据,提取出任一时间段内两个波形数据的振幅信息,绘制在“振幅-振幅”图上。
如果若一对波形数据恰好是同一台站两个互相垂直的分量,则“振幅-振幅”图即为“质点运动图”。从“质点运动图”中,可以提取出震相的一些重要信息。

利用垂直和径向分量的波形数据绘制 Rayleigh 面波的质点运动轨迹:

1
2
3
4
5
6
7
8
9
10
11
dg sub tele nykl.z             # Z分量
w nykl.z
dg sub tele nykl.e nykl.n # E、N分量
rotate to gcp # 旋转至大圆路径
w nykl.r nykl.t # R、T分量
r nykl.z nykl.r # 读入Z和R分量
xlabel 'Radial component'
ylabel 'Vertical component'
title 'Particle-motion plot for partial Rayleigh wave'
xlim 1300 1340 # 仅绘制Rayleigh面波的部分时间窗
ppm # 绘制质点运动图

plotsp

用于绘制不同格式的谱文件,可以绘制“振幅+相位”或者“实部+虚部”,可以任意指定X、Y轴为线性轴或者对数轴。

1
2
3
fg seis
fft # 进行fft快速傅里叶变换
plotsp am loglog # 绘制振幅谱。

图像外观元素

1
2
3
4
5
6
7
8
9
10
11
fg seis                # 生成数据
qdp on # qdp选项指采样绘制数据点。由于计算机性能不佳使用采样的方式绘制数据点提高绘制速度。现在可以使用off选项。
grid on # 显示网格
title 'Seismic Trace' # 设置标题
xlabel "Time(s)" # 设置x轴标签
ylabel "Amplitude" # 设置y轴标签
filenumber on # 显示文件号
axes only left bottom # left和bottom显示axes
ticks only right # right显示ticks
border on # top显示border
p # 绘图

此外,可以使用以下命令控制坐标轴和坐标系。

  • xlim 控制绘图的X轴范围
  • xdiv 控制X轴刻度间隔
  • xfudge 设定fudge因子,根据数据极值扩展X轴范围
  • linlin
  • linlog
  • loglin
  • loglog
  • xlin
  • xlog
  • ylin
  • ylog
    对数坐标轴可以使用以下命令控制外观:
  • xfull
  • loglab
  • floor

线条属性控制

使用line命令进行线条属性控制。

1
2
3
4
line 4  # 线型为4
width 2 # 线宽为2
color red # 红色
p # 绘制

可以对波形数据进行颜色填充

1
2
3
4
fg seis  # 创建一个数据
qdp on # qdp选项指采样绘制数据点。由于计算机性能不佳使用采样的方式绘制数据点提高绘制速度。现在可以使用off选项。
rmean; rtr; taper
line 0 fill red/blue # 线型为0 负振幅为blue 正振幅为red

绘制组合图

典型组合图示例:源自seisman

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fg seis                        # 生成数据
beginframe # 打开 frame,开始绘制组合图
xvport 0.1 0.9 # 设定第一个绘图命令的 viewport
yvport 0.7 0.9
title 'Seismic Trace' # 设定标题
fileid off # 不显示文件 id
qdp off
p
fft wmean # FFT
xvport .1 .45 # 设定第二个绘图命令的 viewport
yvport .15 .55
title 'Amplitude Response (linlog)'
ylim 1e-5 1 # Y 轴范围
psp am linlog # 绘制振幅谱
xvport .55 .9 # 设定第三个绘图命令的 viewport
title 'Amplitude Response (loglog)'
xlim 1 60
psp am loglog # 绘制振幅谱
endframe # 关闭 frame

图形设备

可以使用begindevicesenddevices命令开启、关闭指定的图形设备。
使用setdevice命令设置默认的图形设备。

xwindows

以位图方式显示的软件窗口系统。

begindevices

启动命令:

1
BeginDevices Sgf|Xwindows
  • Sgf:Sac图像文件设备
  • Xwindows:X window窗口显示系统

enddevices

关闭命令:

1
EndDevices [ALL|Sgf|Xwindows]
  • ALL:关闭所有图像设备
  • SGF:SAC图形文件设备
  • Xwindows:X Window图像窗口系统

setdevices

定义后续绘图默认图形设备

1
SETDEVICE name
  • name:图形设备名

sgftops

SGF格式是SAC自定义的图像文件格式,转换到其他图像格式需要此命令、
用法:

1
2
3
4
5
6
7
8
sgftops
Usage: sgftops sgf_file ps_file [line_width scale_id]
sgf_file : SGF 文件名
ps_file : PS 文件名
line_width : 图像线宽,可以取1,1.5,2等等
scale_id : - i : landscape模式加上文件id
- s : 对图像进行平移、旋转、缩放
- si:landscape模式+文件id+平移+旋转+缩放
1
sgftops SGF文件名 PS文件名 [图像线宽 [i|s|si]] # 具体含义见上

绘图流程

1
2
3
4
5
6
r cdv.[nez] # 读取数据文件到内存中
begindevices xwindows # 启动xwindows图形设备,简写: bd x
plot # 绘图,简写:p
### 进行绘制
enddevices xwindows # 关闭图形设备xwindows,简写:ed x
q # 退出SAC

文件格式

头段变量

基本变量

nvhdr
  • nzyear 年
  • nzjday 一年的第几天
  • kzdate(由上面两个变量构成)
  • kztime(由下面两个变量构成)
  • nzhour 时
  • nzmin 分
  • nzsec 秒
  • nzmsec 毫秒
1
2
fg seis
lh nzyear nzjday nzhour # 显示头段变量信息
iztype

等效参考时刻。

  • IUNKN 未知
  • IB 文件开始时刻为参考时间
  • IDAY 参考日期当天午夜为参考时间
  • IO 事件发生时间为参考时间
  • IA 初动到时为参考时间
  • ITn 用户自定义时间Tn为参考时间,n可取0-9

iztype=IO表示数据以发震时刻作为参考时刻,此时头段变量o的值为0

iftype

SAC文件类型,决定了头段区之后有几个数据区

  • ITIME 时间序列文件 即Y数据,一般的地震波形数据
  • IRLIM 频谱文件 格式为实部-虚部
  • IAMPH 频谱文件 格式为 振幅-相位
  • IXY 一般的X-Y数据
  • IXYZ 一般的XYZ 3D文件
idep

因变量(Y)类型。该头段变量可以不定义

  • IUNKN 未知类型
  • IDISP 位移量 单位:nm
  • IVEL 速度量 单位:nm/s
  • IVOLTS 速度量 单位:V(未知含义)
  • IACC 加速度量 单位:nm/s2

数据相关变量

npts

数据点数,决定了数据区有多少个数据点。

delta

等间隔数据的数据点采样周期 (标称值)。

odelta

采样周期的实际值。如果实际值与标称值不同则有值。
一般来说都是未定义的。

b, e

文件的起始时间和结束时间,相对于参考时刻的秒数

leven

数据为等间隔则为True,否则为False

depmin depmax depmen

因变量Y的最小值、最大值、均值。在读入SAC文件以及对数据进行处理时,这三个头段变量的值会被自动计算并更新。

scale

因变量比例因子,即真实物理场被乘以该比例因子而得到现有数据。
scale=1.0e20 指乘10^20转换量级

xmininum xmaximum yminimum ymaximum

仅用于3D文件中,记录X、Y的最小、最大值。

nxsize nysize

仅用于3D文件中,记录X、Y方向的数据点数。

iqual

iqual标识数据质量,可以取如下值:

  • IGOOD 高质量数据
  • IGLCH 数据中有毛刺 glitches
  • IDROP 数据有丢失 dropouts
  • ILOWSN 低信噪比数据
  • IOTHER 其他
isynth

合成数地震图标识
IRLDTA 真实数据

事件相关变量

kevnm

事件名,长度为16个字节

evla evlo evel evdp

分别代表事件发生的 纬度(-9090) 经度(-180180) 高程(m)和深度(km)

ievreg

事件发生的地理区域

Flinn-Engdahl Regions: http://en.wikipedia.org/wiki/Flinn-Engdahl_regions

ievtyp

事件类型

  • IUNKN 未知事件
  • INUCL 核事件
  • IEQ 地震
  • IOTHER 其他
mag

震级

imagsrc

震级信息来源

imagtyp

震级类型

  • IMB:体波震级
  • IMS:面波震级
  • IML:区域震级
  • IMW:矩震级
  • IMD:持续时间震级
  • IMX:用户自定义震级
grarc

全称Great Circle Arc;震中距,震中到台站大圆弧的长度,单位为度

dist

震中与台站之间的距离,单位为km

az

方位角,震中到台站的连线与地理北向的夹角,单位为度

baz

反方位角,台站到震中的连线与地理北向的夹角,单位为度

o ko
  • o 事件发生时刻相对于参考时刻的秒数
  • ko 绘图时时间变量o的标识符
khole

若为核爆事件,为孔眼标识;如果是其他事件为位置标识

nevid norid nwfid

标识事件ID、 起始时间ID、 波形ID

台站相关变量

knetwk kstnm

地震台网名、台站名

istreg

台站地理区域

stla stlo stel stdp

台站纬度、精度、高程(地震仪与海平面之间高程差(m))和深度(地震仪相对于当地地表的深度(m))

cmpaz cmpinc kcmpnm kstcmp

方位角、入射角、通道名和辅助型变量(表示台站分量)
前两者详见Rdseed学习笔记

kcmpnm 通道名(component name),用于存储通道的信息。包含三个英文字符,包括:
频带码(Band Code)、仪器码(Instrument Code)和方位码(Orientation Code)。

lpspol

如图,左手坐标系下,三通道都是正极性为真,否则为假

震相相关变量

a f tn

a、f存储事件初动、结束时刻相对于参考时刻的秒数
Tn:n=0-9 存储用户自定义的时刻相对于参考时刻的秒数,常用存储震相到时

ka kf ktn

头段变量a、f、tn都有一个对应的k开头的字符型头段变量,称之为时间标识。
时间标识用于说明对应的时间头段变量中所包含时间的含义。

a中包含P波到时,ka=P;

t1中包含PcP震相的到时,则kt1设置为PcP

在绘图时,若时间头段变量中有值,则默认会在该时刻处绘制一条垂线,若相应的时间标记有定义,则将时间标记的值显示在垂线附近。

Xmarker

震相相关的变量可以构成一个辅助型变量。
aka可以构成amarker,fkf可以构成fmarker
oko可以构成omarkertnktn可以构成tnmarker(n=0-9)。

仪器相关变量

kinst

记录仪器的通用名称

iinst

记录仪器的类型

respn

仪器相应参数

其它变量

usern

n=0-9 用于存储用户自定义的浮点型数值

kusern

n=0-2 用于存储用户自定义字符型值

lovrok

若为真,则磁盘里的原始数据可以被覆盖;

若为假,则原始数据不可被覆盖。

用于保护原始数据。建议先做好备份再操作原始数据。

lcalda

全称:Calculate Distance and Azimuth。如果为真,则当事件和台站
的坐标被写入或被修改时,头段变量dist gcarc az baz将自动计算,否则不会被自动计算,SAC头段中存在信息的不兼容。

kdatrd

数据被读入计算机的日期。

阿波罗S12头段变量

NPTS = 46108 采样点数
B = 6.000000e-04 起始时间 相对于参考时刻的秒数
E = 6.959548e+03 结束时间
IFTYPE = TIME SERIES FILE sac文件类型, ITIME表示时间序列值
LEVEN = TRUE TRUE表示等时间间隔采样
DELTA = 1.509434e-01 采样周期
DEPMIN = -5.100000e+02 Y的最小值
DEPMAX = 5.120000e+02 Y的最大值
DEPMEN = 5.343101e+01 Y的平均值
KZDATE = JUL 26 (208), 1972 记录时间的绝对时刻
KZTIME = 16:29:18.327 SAC中的绝对时刻
KSTNM = S12 台站名
KHOLE = 核爆事件为孔眼标识,其他事件为位置标识
LOVROK = TRUE True表明原始数据可覆盖
NVHDR = 6 头段变量版本号。目前为6
LPSPOL = FALSE 三通道都是正极性为真。否则为假。
LCALDA = TRUE True标识当事件和台站坐标被写入或修改时,头段变量dist、gcarc、az、baz将自动计算
KCMPNM = MHZ 台站名
KNETWK = XA 台网名