MATLAB读取某公司单道地震数据用于处理

有些公司仪器采集了一些单道地震数据。但是其内部格式通常保密。公司专用软件只能对公司内部格式数据进行操作。不能对外部通用地震格式进行处理。针对此问题,本人解决了部分内容。

首先,通过在线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还是不正确
 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weiyiwen1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值