24小时热门版块排行榜    

查看: 3142  |  回复: 6
【奖励】 本帖被评价5次,作者baobiao007增加金币 2.6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

baobiao007

木虫 (职业作家)


[资源] 【分享】相移法偏移程序【原创】

#include
#include
#include
#include"FFT.h"

//将文件filename中的内容读入二维数组a
void MyReadFile(char *filename,float **a,int m,int n)
{
     int i,j;
         FILE *fp;
         fp=fopen(filename,"rb";
         for(i=0; i                  for(j=0; j                          fread(&a[j],sizeof(float),1,fp);
         fclose(fp);
}
//将二维数组a中的数据写入文件filename中
void MyWriteFile(char *filename,float **a,int m,int n)
{
     int i,j;
         FILE *fp;
     fp=fopen(filename,"wb";
         for(i=0; i                  for(j=0; j                          fwrite(&a[j],sizeof(float),1,fp);
         fclose(fp);
}
//申请二维动态数组的函数
float **MySpace(int m, int n)
{
        int i;
        float **p;
        p=(float **)calloc(m,sizeof(float *));
        if(p==NULL)
        {  printf("申请空间失败\n";
           exit(1);
        }
        for(i=0; i                 p=(float *)calloc(n,sizeof(float));
        return p;
}
//释放申请的二维动态数组
void FreeMySpace(float ***p, int m)
{
        int i;
        for(i=0; i                 free((*p));
        free(*p);
}
//矩阵转置a[m][n]->b[n][m]
void Zhuan(float ***a,float ***b,int m,int n)
{
        int i,j;
        for(i=0; i                 for(j=0; j                         *(*(*b+i)+j)=*(*(*a+j)+i);
}

void main()
{
/////////////////////////////////设置初始参数////////////////////////////////////
    const int DNUM=256;//零偏移距剖面接收道数       
        const int TNUM=512;//时间采样点数
    const int ZNUM=256;//深度采样点数
        const float DT=0.002;//时间采样间隔2ms
        const float DX=12.5;//道间距
        const float DZ=5.0;//深度延拓步长
        const float pi=3.1415926;
        //float V=2000.0;
        float V[ZNUM];
    char fname1[]="Datapost-8-8-256-512.dat";//原始地震记录文件名
        char fnamev[]="Modelpost-8-8-256-256.dat";//速度文件
        char fname2[]="after.dat";//偏移后的剖面文件名
////其他参数计算区//////////////////////////////////
        float **recordr, **recordi, **poum;
        float **midr, **midi, *tempr, *tempi, *temp2r, *temp2i;
        float p, **v, vt;
        float df;//频率采样间隔
        float dkx;//x方向波数采样间隔
        float w;//圆频率
        float z;//深度
        float kz;//z方向圆波数
        float kx;
        int iw,iz,ix,k1,k2;
    df=1.0/(DT*TNUM); dkx=1.0/(DX*DNUM);
///相移偏移过程/////////////////////////////////////
    //申请空间
        tempr=(float *)calloc(DNUM,sizeof(float));
        tempi=(float *)calloc(DNUM,sizeof(float));
    temp2r=(float *)calloc(DNUM,sizeof(float));
        temp2i=(float *)calloc(DNUM,sizeof(float));
        recordr=MySpace(DNUM,TNUM);
        recordi=MySpace(DNUM,TNUM);
    poum=MySpace(DNUM,ZNUM);
        midr=MySpace(TNUM,DNUM);
        midi=MySpace(TNUM,DNUM);
        v=MySpace(DNUM,ZNUM);
        //读入叠加剖面
        MyReadFile(fname1,recordr,DNUM,TNUM);
        MyReadFile(fnamev,v,DNUM,ZNUM);
        for(iz=0; iz         V[iz]=v[0][iz];
                for(ix=0; ix                         if(v[ix][iz]                                 vt=v[ix][iz];
                                v[ix][iz]=V[iz];
                                V[iz]=vt;
                        }
        }
        for(iz=0; iz                 printf("%f\n",V[iz]);
        //recordr[127][127]=1.0;
        //recordr[50][50]=1.0;
    //将输入剖面对时间做一维傅里叶变换
    k1=log(DNUM)/log(2.0);
        k2=log(TNUM)/log(2.0);
        if(DNUM>pow(2,k1)) k1=k1+1;
        if(TNUM>pow(2,k2)) k2=k2+1;
    for(ix=0; ix         fft(recordr[ix],recordi[ix],k2,1);
        Zhuan(&recordr,&midr,DNUM,TNUM);
        Zhuan(&recordi,&midi,DNUM,TNUM);
        //圆频率循环与深度延拓
        for(iw=0; iw<=TNUM/2; iw++)//频率循环
        {
            w=2.0*pi*iw*df;
                if(w==0) continue;
                for(ix=0; ix                 {   tempr[ix]=midr[iw][ix];
                        tempi[ix]=midi[iw][ix];
                }
                for(iz=0; iz                 {   
            fft(tempr,tempi,k1,1);//对x进行一维傅里叶变换
                        for(ix=0; ix                         {   //计算相移因子并相乘
                                kx=2.0*pi*ix*dkx;
                                if(ix>DNUM/2) kx= 2.0*pi*(DNUM-ix-1)*dkx;
                                p=1.0-pow(0.5*V[iz]*kx/w,2);
                                if(p>=0.0){
                                kz=w*sqrt(p)/(0.5*V[iz]);
                                    temp2r[ix]=tempr[ix]*cos(kz*DZ)-tempi[ix]*sin(kz*DZ);
                                    temp2i[ix]=tempi[ix]*cos(kz*DZ)+tempr[ix]*sin(kz*DZ);
                                }
                                else{
                                        temp2r[ix]=0.0;
                                        temp2i[ix]=0.0;
                                }
                        }
                        //kx做一维傅里叶反变换
                        fft(temp2r,temp2i,k1,-1);
                        for(ix=0; ix                         {        tempr[ix]=temp2r[ix];
                                tempi[ix]=temp2i[ix];
                //成像
                                poum[ix][iz]+=2.0*temp2r[ix];
                        }
                }
        }       
        //输出偏移结果文件
        MyWriteFile(fname2,poum,DNUM,ZNUM);       
        //释放空间
        FreeMySpace(&recordr,DNUM);
        FreeMySpace(&recordi,DNUM);
        FreeMySpace(&midr,TNUM);
        FreeMySpace(&midi,TNUM);
        FreeMySpace(&poum,DNUM);
        free(tempr);free(tempi);
        free(temp2r);free(temp2i);
        FreeMySpace(&v,DNUM);
}
回复此楼

» 收录本帖的淘帖专辑推荐

科技写作与绘图

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

挖坑埋仪器

新虫 (正式写手)


★ 一星级,一般

引用回帖:
4楼: Originally posted by baobiao007 at 2015-03-29 21:58:30
研究偏移应该仔细看老外写的论文和代码,不要看我写的渣程序...

敢问尊驾哪里可以找到老外的代码?

发自小木虫Android客户端
5楼2016-01-28 03:17:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 7 个回答

whl1979

新虫 (初入文坛)


★★★ 三星级,支持鼓励

近来研究偏移,感谢楼主分享
3楼2015-03-29 19:33:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

baobiao007

木虫 (职业作家)


引用回帖:
3楼: Originally posted by whl1979 at 2015-03-29 19:33:50
近来研究偏移,感谢楼主分享

研究偏移应该仔细看老外写的论文和代码,不要看我写的渣程序
4楼2015-03-29 21:58:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nlgssrs

铜虫 (小有名气)


★ 一星级,一般

你这是弹性波还是声波,叠前还是叠后?

发自小木虫IOS客户端
6楼2016-01-28 08:16:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +5 ASdOkHsho7FD 2026-08-28 9/450 2026-08-30 11:41 by l0VvVHGBGRLv
[博后之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +8 ASdOkHsho7FD 2026-08-28 9/450 2026-08-30 11:40 by l0VvVHGBGRLv
[基金申请] 投票:  有多少人是今天查系统知道结果的? +16 爱看书的可乐 2026-08-26 18/900 2026-08-30 10:33 by winsaint
[基金申请] 我就是申请一个面上项目而已,这评审意见是按照杰青的条件评的吧? +6 gouxfjh 2026-08-28 11/550 2026-08-30 07:57 by gouxfjh
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +3 G6APbkg8SA6w 2026-08-29 4/200 2026-08-30 07:17 by ZPa0EcMwuECS
[考博] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +6 ASdOkHsho7FD 2026-08-28 10/500 2026-08-30 06:11 by ZPa0EcMwuECS
[教师之家] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +5 ASdOkHsho7FD 2026-08-28 8/400 2026-08-30 05:48 by ZPa0EcMwuECS
[论文投稿] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +5 gy1nBQXYQJqL 2026-08-29 6/300 2026-08-30 01:58 by ZPa0EcMwuECS
[基金申请] 国自然面上复盘~欢迎讨论 (金币+15) +15 晴天加油 2026-08-26 16/800 2026-08-29 18:28 by symmetry
[基金申请] 为什么到现在没收到通知? +4 tannykie 2026-08-29 4/200 2026-08-29 17:14 by lmz0216
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +12 Kittylucky 2026-08-27 13/650 2026-08-29 00:04 by superceng
[基金申请] 系统查不到 +11 董八千 2026-08-26 11/550 2026-08-28 18:06 by Leogzhya
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 怎么查啊 +6 huang1991js 2026-08-26 6/300 2026-08-28 08:42 by winsaint
[基金申请] 面上合作单位盖章 +5 ssyjh 2026-08-27 5/250 2026-08-27 20:50 by gdfollow
[基金申请] 基金未中,这种答复是模板吗? +5 zhaosm1982 2026-08-27 6/300 2026-08-27 16:00 by lfy8008
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 牛来!米来!面来! +8 beefly 2026-08-26 8/400 2026-08-26 08:37 by xuzhipiao
信息提示
请填处理意见