有些公司仪器采集了一些单道地震数据。但是其内部格式通常保密。公司专用软件只能对公司内部格式数据进行操作。不能对外部通用地震格式进行处理。针对此问题,本人解决了部分内容。
首先,通过在线BINARY VIEW软件,查看了公司内部地震数据格式。
发现了前面43个字节是ASCII格式的,可以用CHAR()函数直接显示字符。
然后,用MATLAB UINT8格式查看了前面162个字节。类似于文件道头,项目号之类的文件头。
接着,16个道头和1502个样点是int 16格式的。
贴出MATLAB代码如下所示,省略了文件名扩展,以防被告。
clear;%最后我发现一般是1052个样点
finfo=dir('wei.*');
nt=1052;
ntr=(finfo.bytes-162)/((16+nt)*2);
%ntr=(finfo.bytes-162)/(16+nt)/2;
fid=fopen('wei*');%前面178-16=162个字节
A=fread(fid,162,'uint8','l');%44字节ASC-II
%178+ntr*2
B=char(A(1:43));%前面44(项目日期)+74*2字节
head=zeros(16,ntr);
data=zeros(nt,ntr);
for i=1:ntr
head(:,i)=fread(fid,16,'uint16','l');
data(:,i)=fread(fid,nt,'int16','l');
end
%fprintf(A,"%x");
fclose(fid);
for i=1:ntr
figure(i);
plot(-data(:,i));
end
fid1=fopen('wei.*','w');
fwrite(fid1,A,'uint8');
for i=1:ntr
fwrite(fid1,head(:,i),'uint16');
fwrite(fid1,data(:,i),'int16');
end
fclose(fid1);
图1
有时候某公司内部二进制格式样点未知,我就设置大于实际样点的数组读取所有道。然后,从MATLAB内存workspace中的数组中,通过观察数值变化规律,可以看出实际样点个数。从最后一道读取样点个数是最方便最快捷的。获得样点个数nt后,再读取道头也变得方便了。然后,就是文件头所占字节数。
图2
此道数据是最后一道,但是明显看到了尾部数值震荡现象,可能尾部是道尾。说真的,很少见到这种格式的地震数据。根据显示,我发现尾部震荡数据占有int16位的共42个点。去掉这些42个点,得到没有震荡的曲线如图3.
图3去掉尾部震荡
图4 未去尾部震荡
测试nt是否正确的命令为:
plot(data(end-nt*2+1:end-nt*1))
其中的2和1可以改成3,2;4,3;5,4;只要nt设置正确那么所有道将会分开。
图5 nt偏大,中间那个连接了2道。plot(data(end-290*40+1:end-290*39))
设置了小一点的NTplot(data(end-280*40+1:end-280*39)),这时候只出来一道。
>> plot(data(end-280*50+1:end-280*49))增加了道数第50,49.发现nt还是不正确