每个物探人员都要和地震数据打交道,但是很多同学常常被眼花缭乱的地震数据格式迷得七荤八素。SEGA、SEGB、SEGC、SEGD、SEGY、SU,工作站格式、微机格式、整形、浮点型、大头(Big-Endian)、小头(Little-Endian)、IBM、IEEE等等,这些名称连起来可以绕脑门好几圈,直接把你绕蒙圈。今天就为大家抽丝剥茧,聊聊地震数据格式那些事。
SEGA、SEGB、SEGC、SEGD、SEGY
SEGA、SEGB、SEGC、SEGD、SEGY这几种格式一看就是亲兄弟,它们系出名门,都是美国勘探地球物理学会 (SEG)推荐的几种数字磁带记录格式。如果地球物理界也是一个江湖,那么SEG就是该江湖中的武林大会了, 该机构推荐的格式基本就是江湖标准,应用那是相当的广泛。SEG-A和SEG-B记录格式简称A格式和B格式,是 SEG1967年推荐的两种数字磁带记录格式。分别适用于21轨一英寸磁带和九轨半英寸磁带。A格式目前早已随着一英寸磁带的淘汰而被淘汰。SEG-C是1972年推荐的一种九轨半英寸磁带记录格式,它以时序方式对数据多路编排记带,与B格式的区别在于所记录的数据是以32位浮点的IBM格式记录的。SEGD和SEGY都是1975年推出的新的数据格式,也是目前应用最多的两种,SEGD在野外采集时用的比较多,载体多为磁带,SEGY多用在室内数据传递,载体以磁盘居多。其实对我们大部分从业人员来说,ABCD都只是传说,SEGY才是我们熟悉的家常菜。
SU格式
SU全称Seismic Unix,是科罗拉多矿院CWP(Center for Wave Phenomena)实验室开发的一套开源地球物理数据处理系统。CWP在江湖上具有响当当的名声,地位比肩少林武当,门下人才辈出,John W. Stockwell Jr., Jack K. Cohen, Einar Kjartansson, and Joshua (Shuki) Ronen等人也因为在SU中做出的贡献与2002年被SEG授予特殊贡献奖, 目前Dave Hale正带领着团队持续维护并发展着SU。而SU格式则是该环境下应用的地震数据格式,由于软件太受欢迎,因此SU格式也就成为了一种广为流传的非官方格式被大家所认可。其实它和SEGY格式相差的只有3200个字节卷头的距离。
Big-Endian和Little-Endian
Big-Endian和Little-Endian是一对好基友,我们都是成对的提到他们。endian这个词来源于Jonathan Swift在1726年写的讽刺小说 "Gulliver's Travels"(《格利佛游记》)。该小说在描述格利佛畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从大的一端剥开的人Swift就称作Big-Endians,而支持从小的一端剥开的人就称作Little-Endians......(后缀ian表明的就是支持某种观点的人)。1980年,Danny Cohen在其著名的论文"On Holy Wars and a Plea for Peace"中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians,支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。我们一般将endian翻译成“字节序”,将big endian和little endian称作“大头”和“小头”,有的也叫“大尾”和“小尾”。从下图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。需要注意的是这里的字节序是指整数在内存中保存的顺序。
而由于工作站中默认的是大头格式,微机中默认的是小头格式,因此我们也常用工作站格式和微机格式来进行区分大头和小头。
值得一提的是,区分大头和小头是十分必要的,C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
IBM和IEEE
IBM和IEEE是二进制码存储浮点数的两种不同格式:
1.32 bit IEEE floating format
分三部分:符号位(sign)占1bit,指数部分(exp)占8bits,尾数部分(x)占23bits.所表示的十进制数值result = (-1)^sign* (1+ x/ ( 2^23 )) * 2^ ( exp -127)
2. 32 bit IBM floating format
分三部分: 符号位(sign)占1 bit, 指数部分(exp )占7bits, 尾数部分(mant)占24 bits.所得数值result = (-1)^sign * (mant/ (2^24) ) *16^ (exp-64)
总结起来说,seg系列和su是从地球物理专业记录数据的方式来分类的,属于宏观的类别,每个分类下面又有整形和浮点之分,大头小头是依据整数在内存中字节排列顺序不同分类的,而ibm和ieee则代表了不同的浮点型数据存储方式。
我们常用的SEGY数据格式包括以下几种:
1、4字节IBM浮点SEG-Y(标准)
2、4字节整型SEG-Y(标准)
3、2字节整型SEG-Y(标准)
5、4字节IEEE浮点SEG-Y(非标准)
8、1字节整型SEG-Y(非标准)
有人会问怎么没有4,6,7?答案是现在没有用到这几个定义,可以为后来新的定义留下扩展空间。大道至简,记住上面几种格式,他们又都分大头小头哦。
讲到这里,大家对地震数据格式了解了吧?讲的不对的地方欢迎大家指出来哦。
网友评论