APP下载

LEMI-417型地球深部电磁场观测系统的数据格式解析

2020-07-26张伟胡蕾张钊搏

物探与化探 2020年4期
关键词:二进制字节测点

张伟,胡蕾,张钊搏

(1.中国地质调查局 成都地质调查中心,四川 成都 610082; 2.电子科技大学 资源与环境学院,四川 成都 611731; 3.中科院成都信息技术股份有限公司,四川 成都 610041)

0 引言

长周期大地电磁法目前是探测地球深部(>150 km)上地幔尺度电性结构特征的主要方法,由乌克兰Lviv Centre of Institute of Space Research研究所研制的LEMI-417仪器是最早引入到我国用于长时间、稳定、连续观测超低频大地电磁场的一套成熟装备。2007年起,中国科学院地质与地球物理研究所[1]、成都理工大学[2]、中国地质大学(北京)[3-4]以及中国地震局地质研究所[5]等科研院所开始使用该仪器探测青藏高原及邻区、龙门山构造带以及川滇黔相邻区地震活动带的深部地质结构,用于揭示其关键地质带的深部动力学特征。与该仪器配套的数据处理软件是由俄罗斯Ivan M. Varantsov等编写的PRC_MTMV商业软件,用于实现将大地电磁场从时间域到频率域的转换,通过傅里叶变换计算得到功率谱,并通过功率谱估计得到大地电磁阻抗要素。

众所周知,计算机对于二进制格式数据的读取效率远远大于文本格式数据,因此在进行傅里叶变换时直接读取二进制数据进行计算将大大提高程序的运行效率。但由于乌克兰仪器生产厂家没有公开给出其原始数据的二进制格式,因此在处理LEMI-417数据时,必须首先使用厂家提供的转换程序将仪器二进制记录数据转换为文本格式,再使用PRC_MTMV软件的LEMI2PRC子模块将ASCII文本格式数据再次转换为二进制数据后方能进行后续的傅里叶变换处理[3],这无疑明显地增加了一步不必要的处理操作。为此,作者对照V5-2000仪器的二进制数据格式的特点[6],对LEMI-417仪器的原始二进制数据格式进行了深入研究,在不断试错后,成功剖析出了该仪器二进制记录数据的数据结构。

1 LEMI-417型系统的原始数据格式

LEMI-417是专门针对长时间采集超低频段天然电磁场而研制的一款观测系统,其主要特点是:①采用磁通门传感器来采集磁场数据,观测范围为±70 000 nT,可以记录到几十万秒的长周期信号;②电道采集盒子通过专门的电路设计能够保证在长时间范围内保持很低的漂移,提供了4组电道接口,可以同时采集4组电极的电场数据;③采用高精度GPS同步授时能够保证在长时间范围内具有很小的时移;④整体功耗很低,能够保证在1块12V45ah的铅酸电池供电下连续工作一周以上。

该仪器以1 Hz的采样率来连续观测天然电磁场,采集的数据以二进制格式实时储存到仪器内部的CF卡中,文件名以L417_×××.B××的规则来进行命名,其中:L417为仪器的型号名称;_×××为单点的数据存放文件序号,第一个数据文件编号为001,当GPS时间为格林威治时间的零点时,仪器系统自动新建一个新文件来存放数据,文件序号自动在前一个文件序号的基础上累加1;B××的首字母B是二进制(binary)的缩写,××是采集仪器的出厂编号。

1.1 头文件格式

通常与测点数据采集相关的记录信息(如仪器型号、采集日期、经纬度、高程、电极距等)一般以文件头的形式存放于二进制文件的首端。LEMI-417I型仪器共分配了32个字节的大小空间来存放信息(表1),各字节位置信息阐述如下。

表1 LEMI-417原始二进制记录数据的头文件格式(tag)

1~4字节:4个字节长度,存放采集仪器的型号信息,对于LEMI-417I型仪器来说,第1个字节为ASCII字符‘4’(16进制为34),第2字节为ASCII字符‘1’(16进制为31),第3字节为ASCII字符‘7’(16进制为37),第4字节为ASCII字符‘I’(16进制为49)。

5字节:1个字节长度,存放采集仪器的出厂编号。

6字节:1个字节长度,存放开始采集数据时的当前年信息。

7字节:1个字节长度,存放开始采集数据时的当前月信息。

8字节:1个字节长度,存放开始采集数据时的当前日信息。

9字节:1个字节长度,存放开始采集数据时的当前小时信息(24小时制)。

10字节:1个字节长度,存放开始采集数据时的当前分信息。

11字节:1个字节长度,存放开始采集数据时的当前秒信息。

12~15字节:4个字节长度,存放当前测点GPS同步的纬度。

16字节:1个字节长度,存放当前测点坐标是位于北纬还是南纬,以我国位于北半球为例,在我国测量数据时应为ASCII字符‘N’( 16进制为4E)。

17~21字节:5个字节长度,存放当前测点GPS同步记录的经度信息。

22字节:1个字节长度,存放当前测点坐标是位于东经还是西经,以我国位于东半球为例,在我国测量数据时应为ASCII字符‘E’( 16进制为45)。

23字节:1个字节长度,为空字符(对应的16进制为00)。

24~25字节:2个字节长度,存放当前测点GPS同步的高程(单位:m)。

26字节:1个字节长度,存放仪器的采样频率。

27字节:1个字节长度,存放仪器内部的VIN(外部供电电源电压)信息。

28字节:1个字节长度,存放仪器内部的VBAT(内部纽扣电池电压)信息。

29字节:1个字节长度,存放电道盒子上第1对电极的极距长度(单位:m)。

30字节:1个字节长度,存放电道盒子上第2对电极的极距长度(单位:m)。

31字节:1个字节长度,存放电道盒子上第3对电极的极距长度(单位:m)。

32字节:1个字节长度,存放电道盒子上第4对电极的极距长度(单位:m)。

1.2 时间序列格式

如图1所示,在头文件(Tag)后紧接着的是时间序列数据,LEMI-417以30个字节的大小空间来存放一个采样时间片采集到的电磁场数据段(segment,表2所示),由17个时间片组成一个记录块(record),一个数据段结束后再接下一个文件头数据,依次循环、直到采集结束。其中,单个时间片数据段中各字节位置信息阐述如下。

图1 LEMI-417原始数据结构分解示意Fig.1 Schematic diagram of original data structure decomposition

表2 LEMI-417原始二进制记录数据的时间序列格式(segment)

1~3字节:3个字节长度,存放磁通门传感器X方向的测量值(单位:nT)。

4~6字节:3个字节长度,存放磁通门传感器Y方向的测量值(单位:nT)。

7~9字节:3个字节长度,存放磁通门传感器Z方向的测量值(单位:nT)。

10~13字节:4个字节长度,存放第1道电极间的测量值(单位:mkV/m)。

14~17字节:4个字节长度,存放第2道电极间的测量值(单位:mkV/m)。

18~21字节:4个字节长度,存放第3道电极间的测量值(单位:mkV/m)。

22~25字节:4个字节长度,存放第4道电极间的测量值(单位:mkV/m)。

26~27字节:2个字节长度,存放磁通门传感器温度(单位:℃)。

28~29字节:2个字节长度,存放电道采集盒子的温度(单位:℃)。

30字节:1个字节长度,存放时间片采样间隔(单位:m)。

2 计算机数据类型与程序实现

2.1 头文件数据结构与核心代码

在C++语言中可利用struct类型变量来结构化地读取和存储头文件信息,再按表1所示各信息的字节位置和字节长度,定义其内部的子变量数据类型,其核心代码如下:

// 头文件数据结构定义

structTagData

{

unsignedcharstr_1; //4

unsignedcharstr_2; //1

unsignedcharstr_3; //7

unsignedcharstr_4; //仪器型号

unsignedcharno; //仪器编号

unsignedcharyear; //年

unsignedcharmonth; //月

unsignedcharday; //日

unsignedcharhour; //时

unsignedcharminute; //分

unsignedcharsecond; //秒

unsignedcharlatitude[4]; //纬度

charN_S; //北纬还是南纬

unsignedcharlongitude[5]; //经度

charE_W; //东经还是西经

charseparator; //空字符

unsignedcharaltitude[2]; //高程

unsignedcharaverage; //采样率

unsignedcharvin; // 外部电压

unsignedcharvbat; // 内部电压

unsignedcharL1; //第一对极距长度

unsignedcharL2; //第二对极距长度

unsignedcharL3; //第三对极距长度

unsignedcharL4; //第四对极距长度

}

// … …由于篇幅有限省略部分非关键代码

// 读取仪器原始数据文件

TagDatatag;

FILE*fp=fopen(strFilePath,"rb");

chardataBuf[32] = "";

fread(dataBuf,sizeof(dataBuf),1,fp);

fclose(fp);

// 结构体各子变量赋值

tag.str_1=dataBuf[0];

tag.str_2=dataBuf[1];

// … …由于篇幅有限省略部分代码

tag.latitude[0]=dataBuf[11];

tag.latitude[1]=dataBuf[12];

tag.latitude[2]=dataBuf[13];

tag.latitude[3]=dataBuf[14];

// … …由于篇幅有限省略部分代码

tag.L4=dataBuf[31];

2.2 时间序列数据结构与核心代码

同理,利用struct类型变量来结构化地读取和存储时间片数据段信息,再按表2所示各信息的字节位置和字节长度,定义其内部的子变量数据类型,其核心代码如下:

// 单个时间片数据段结构定义

structSegmentData

{

charHx[3]; //Hx

charHy[3]; //Hy

charHz[3]; //Hz

charE1[4]; //E1

charE2[4]; //E2

charE3[4]; //E3

charE4[4]; //E4

charTF[2]; //TF

charTE[2]; //TE

charNo; //

}

// … …由于篇幅有限省略部分非关键代码

// 定义变量

intHx=0,Hy=0,Hz=0,E1=0,E2=0,E3=0,E4=0;shortintTf=0,Te=0;

charNo;

TagDatatag;

SegmentDatasegment;

// 读取仪器原始数据文件

fseek(infile_origin,0L,SEEK_SET);

cur_rc= 0;

intNo= 0;

// 如果当前文件指针读取位置不是结尾

while(cur_rc

{

if(i% 17 == 0)

{

fread(tag,sizeof(unsignedchar),32L,infile_origin);

cur_rc=ftell(infile_origin);

i++;

continue;

}

fread(segment,sizeof(unsignedchar),30L,infile_origin);

cur_rc=ftell(infile_origin);

i++;

j++;

// 将二进制数值转换为整型变量,详见下文

convertSegmentData(segment,&Hx,&Hy,&Hz,&E1,&E2,&E3,&E4,&Tf,&Te,&No);

pre_rc=cur_rc;

}

2.3 二进制数值到整型变量的转换

LEMI-417原始数据是在仪器采集时存储的二进制数据,将它赋值到计算程序语言的整型变量时必须进行二进制位操作转换。以磁通门传感器的x方向磁场数据(Hx)为例,由于整型变量(int)无论是在32位还是64位操作系统其字节长度均为32位,幸运地避开了不同操作系统程序代码的特殊处理问题,位转换的实质就是将原始数据中各字节位置的数值完整地赋值到整型变量的各字节位置上,其核心代码如下:

inttemp1=0,temp2=0,temp3=0;

temp1 =segment.Hx[2];

temp1=temp1 ≪ 16;

temp1 =temp1 & 0x00FF0000;

temp2 =segment.Hx[1];

temp2 =temp2 ≪ 8;

temp2 =temp2 & 0x0000FF00;

temp3 =segment.Hx[0];

temp3 =temp3 & 0x000000FF;

Hx=temp1|temp2|temp3;

if(Hx>=0)

{

Hx=Hx& 0x00FFFFFF;

}

else

{

Hx=Hx| 0xFF000000;

}

3 应用开发实例

在对原始数据格式成功剖析的基础上,笔者针对该LEMI-417仪器在实际工作中存在的一些问题,补充性地开发出一套基于MFC的、可以在任何Windows系统运行的界面程序,辅助一线野外工作人员对个别偶然会出现的数据问题进行人为纠正。

实际应用中,LEMI-417型仪器在无GPS信号时会出现记录紊乱的现象[4]。在峡谷地貌或林木茂密区开展工作时可能会出现个别时段GPS卫星信号偶然解锁的现象,使得仪器无法同步当前的GPS时钟和测点坐标,在对应的文件头信息中记录下多组差别迥异的信息。例如,野外工作中仪器部署在深切山谷地貌区时,在部分时段会出现仪器GPS无法锁定到≥3颗卫星的情况,此时仪器记录的测点经纬度和高程均变为0,个别情况甚至会出现1颗卫星都无法锁定的情况,此时便会出现卫星失锁问题,无法同步到正确的GPS时钟,使采集数据时序出现混乱,从而导致在后期数据导出时无法顺利形成连续的时间序列数据,需要进行2次返工,造成不必要的成本支出。

针对该常见问题,开发出了Lemi-417数据修改器(图2),可以将当前测点采集的连续多天的数据加载、合并到一起,遍历每个文件头中的GPS时钟、测点经度、纬度、高程信息,判断每段数据对应的GPS时钟是否是以设置的采样率进行连续观测,会缺失的、不连续的时间序列进行三次样条插值修复,此外判断每段数据对应的经度、纬度和高程信息是否出现较大的数据偏差,通过取众数方法,识别出正常状态下和故障状态下的记录,对故障状态下的记录进行自动修复。最后通过最小二乘法对正常状态下的GPS经度、纬度和高程进行线性回归拟合得到高精度的测点定位信息。由此,通过计算机程序解决了以往由于GPS偶然失锁而需要重复返工的问题。

图2 窗口程序界面截图Fig.2 Screenshot of the window program interface

4 结论

随着我国广大学者对大地电磁时频转换算法研究的不断深入[7-9],国产化数据处理软件[10]、仪器设备[11]的研制工作也已取得长足进步。本文深入剖析了LEMI-417I型地球深部探测主流观测系统的原始数据格式,较详细地给出了对应的核心程序代码,为广大从事天然电磁场现代数字信号处理方面研究的学者提供一定的前期基础支撑,对今后同类型国产仪器、软件的研发工作具有一定的借鉴意义。此外,也针对LEMI-417I型仪器存在的GPS解锁时的记录紊乱问题,提出了一个经济有效的计算机辅助纠正技术方案。

猜你喜欢

二进制字节测点
用二进制解一道高中数学联赛数论题
No.8 字节跳动将推出独立出口电商APP
基于CATIA的汽车测点批量开发的研究与应用
基于小波包位移能量曲率差的隧道衬砌损伤识别
有用的二进制
广州市老城区夏季室外园林空间人体舒适度评价①
室外风环境实测及PHOENICS 模拟对比分析研究*
——以徐州高层小区为例
有趣的进度
No.10 “字节跳动手机”要来了?
轻量级分组密码Midori64的积分攻击