石油软件概论实验报告.docx
《石油软件概论实验报告.docx》由会员分享,可在线阅读,更多相关《石油软件概论实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
![石油软件概论实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/13/e293c41f-68f2-4d1d-a108-63d31f739b0a/e293c41f-68f2-4d1d-a108-63d31f739b0a1.gif)
石油软件概论实验报告
本科生实验报告
实验课程石油地球物理软件技术概论
学院名称地球物理学院
专业名称勘查技术与工程(石油物探)
学生姓名
学生学号
指导教师赵宪生
实验地点地球物理学院5417
实验成绩
二〇一五年4月-二〇一五年5月
资料处理软件与交互软件设计
摘要
地震勘探采集的数据需要经过一定的处理,才能被解释使用,地震勘探采集数据多为seg_y格式,石油勘探采集处理越来越依赖于计算机技术的发展,使用计算机技术实现地球物理处理软件设计、交互软件设计和图形软件设计及可视化和集成化基本技术。
本实验报告中,主要针对seg_y格式数据进行滤波处理,比较带通滤波和低通滤波的结果差异;对给定信号进行剩余时差校正,并写出相应的C语言源程序;并在MFC框架程序下,设计出相应的交互集成软件。
关键字:
seg_y,带通滤波,低通滤波,剩余时差校正,交互集成软件
第一章seg-y数据滤波
1.1方法
分析已知seg-y数据格式的程序,补充该程序中计算滤波因子的子函数段,选择参数对数据文件366.sgy完成滤波处理,以及对某一道数据做谱分析,比较低通滤波和带通滤波及参数对结果的影响。
用Fimage.exe程序显示原数据和滤波处理数据,比较分析结果。
1.2源程序
#include
#include
#include
#include
#defineLEN3200
#defineNQ230000
#definePI3.1415926
//==========低通滤波因子=========//
floatfilter1(floath[],intn)
{
inti;
floatfc;
doublet,dt=0.002;
printf("输入fc:
\n");
scanf("%f",&fc);
for(i=1;i<=n/2;i++)
{
t=i*dt;
h[i]=sin(2*PI*fc*t)/(PI*t);
h[i+n/2]=h[i];
}
h[25]=2*fc;
for(i=1;i<=n/2;i++)
{
h[n/2-i]=h[n/2+i];
}
}
//============带通滤波因子=========//
floatfilter2(floath[],intn)
{
inti;
floatf1,f2,df,f0;
doublet,dt=0.002;
printf("输入f1、f2:
\n");
scanf("%f%f",&f1,&f2);
f0=(f1+f2)/2;
df=abs(f2-f1)/2;
for(i=0;i<=n/2;i++)
{
t=i*dt;
h[i]=2*cos(2*PI*f0*t)*sin(2*PI*df*t)/(PI*t);
h[i+n/2]=h[i];
}
h[25]=4*df;
for(i=0;i<=n/2;i++)
{
h[n/2-i]=h[n/2+i];
}
}
//==========求褶积函数==========//
intcvbx0(floatx[],floath[],floatr[],intkc,intnt)
{
intm,np,i,j;
floatsum;
m=kc/2;
for(np=0;npr[np]=0.0;
for(i=0;i{
sum=0.0;
for(j=0;j{
if((i-m+j)<0||(i-m+j)>=nt)continue;
sum=sum+x[i-m+j]*h[j];
}
r[i]=sum;
}
}
//================傅里叶函数==============//
intIBIT(intj,intm)
{
inti,it,j1,j2;
it=0;
j1=j;
for(i=1;i<=m;i++)
{
j2=j1/2;
it=it*2+(j1-2*j2);
j1=j2;
}
returnit;
}
voidfft(float*xr,float*xi,intnr,floatT)
{
inti,j,k,l,n,n2,nr1,i1,j1,k2,k1n2;
floatc,s,p,tr,ti,trc,tic,ars;
n=(int)(pow(2,nr));
n2=n/2;
nr1=nr-1;
k=0;
for(l=1;l<=nr;l++)
{
loop1:
for(j=1;j<=n2;j++)
{
k2=k/(int)(pow(2,nr1));
p=(float)(IBIT(k2,nr));
ars=(float)(6.2831852*p/(float)(n));
c=(float)(cos(ars));
s=(float)(sin(ars));
k1n2=k+n2;
tr=xr[k1n2]*c+xi[k1n2]*s*T;
ti=xi[k1n2]*c-xr[k1n2]*s*T;
xr[k1n2]=xr[k]-tr;
xi[k1n2]=xi[k]-ti;
xr[k]=xr[k]+tr;
xi[k]=xi[k]+ti;
k++;
}
k+=n2;
if(k{
gotoloop1;
}
else
{
k=0;
nr1=nr1-1;
n2/=2;
}
}
for(j=1;j<=n;j++)
{
i=IBIT(j-1,nr)+1;
if(i>j)
{
j1=j-1;
i1=i-1;
trc=xr[j1];
tic=xi[j1];
xr[j1]=xr[i1];
xi[j1]=xi[i1];
xr[i1]=trc;
xi[i1]=tic;
}
}
if(T<0.0)
{
for(j=0;j<=n;j++)
{
xr[j]/=n;
xi[j]/=n;
}
}
}
voidmain()
{
floatki[NQ2],ko[NQ2],h[51],pr[1024],pi[1024];
intnflg,i,n,l,p;
intlen,len1,jhd;
charnamei[50],nameo[50];
FILE*fp1,*fp2,*fp3,*fp4,*fp5;
union
{
inthd[NQ2];
floatdata[NQ2];
charbuf[NQ2];
shortintshd[NQ2];
}dat;
//****************************/
printf("inputfilename:
");
scanf("%s",&namei);
printf("outputfilename:
");
scanf("%s",&nameo);
fp1=fopen(namei,"rb");
if(fp1==NULL){printf("can'topeninputsegyfile\n");exit(0);}
fp2=fopen(nameo,"wb");
if(fp2==NULL){printf("can'topenoutputsegyfile\n");exit(0);}
fp3=fopen("滤波因子.csv","w");
if(fp3==NULL){printf("can'topenfilterfactorfile\n");exit(0);}
fp4=fopen("振幅谱.csv","w");
if(fp4==NULL){printf("can'topenamplitudefile\n");exit(0);}
fp5=fopen("相位谱.csv","w");
if(fp5==NULL){printf("can'topenphasefile\n");exit(0);}
fread(&dat.buf[0],1,LEN,fp1);
fwrite(&dat.buf[0],1,LEN,fp2);
fread(&dat.buf[0],1,400,fp1);
len1=dat.shd[10];
printf("samplenumbers:
%d\n",len1);
printf("samplerate(ms):
%u\n",dat.shd[8]/1000);
printf("seg_yflag:
%d\n",dat.shd[12]);
/**********************************/
fwrite(&dat.buf[0],1,400,fp2);
nflg=dat.shd[12];
if(nflg==1)len=len1*4+240;
if(nflg==2)len=len1*4+240;
if(nflg==3)len=len1*2+240;
printf("\ninputrecordlength:
%d\n",len);
n=0;
jhd=60;
//==========计算滤波因子===========//
printf("请输入p:
\n");
scanf("%d",&p);
if(p==1)
{
filter1(h,51);
for(i=0;i<51;i++)
fprintf(fp3,"%f\n",h[i]);
}
if(p==2)
{
filter2(h,51);
for(i=0;i<51;i++)
fprintf(fp3,"%f\n",h[i]);
}
if((p!
=1)&&(p!
=2))
printf("输入错误!
请重新输入p:
\n");
//*******************************//
while((l=fread(&dat.buf[0],1,len,fp1))>0)
{
for(i=0;iki[i]=dat.data[i+jhd];//dat.hd[],dat.shd[]
cvbx0(ki,h,ko,51,len1);//对数据进行各种处理
for(i=0;idat.data[i+jhd]=ko[i];//dat.hd[],dat.shd[]
fwrite(&dat.buf[0],1,len,fp2);
n++;
//=========对第100道做谱分析==========//
if(n==100)
{
for(i=0;i<1024;i++)
{
pr[i]=ki[i];
pi[i]=0;
}
fft(pr,pi,10,1.0);
for(i=0;i<1024;i++)
{
fprintf(fp4,"%f\n",sqrt(pr[i]*pr[i]+pi[i]*pi[i]));
fprintf(fp5,"%f\n",atan(pi[i]/pr[i]));
}
}
printf("tracenumber:
%d\n",n);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
fclose(fp4);
fclose(fp5);
}
1.3结果分析
1.3.1滤波因子
图1-1低通滤波因子
图1-2