24小时热门版块排行榜    

查看: 3137  |  回复: 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的回帖

baobiao007

木虫 (职业作家)


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

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

whl1979

新虫 (初入文坛)


★★★ 三星级,支持鼓励

近来研究偏移,感谢楼主分享
3楼2015-03-29 19:33:50
已阅   回复此楼   关注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的回帖

nlgssrs

铜虫 (小有名气)


★ 一星级,一般

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

发自小木虫IOS客户端
6楼2016-01-28 08:16:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 投票:  有多少人是今天查系统知道结果的? +15 爱看书的可乐 2026-08-26 17/850 2026-08-27 00:25 by xxniao123
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 LIbGuocjEEYw 2026-08-26 3/150 2026-08-27 00:09 by Ie9AyIAvGbvs
[基金申请] 基金不中,共勉 +5 eulota 2026-08-26 5/250 2026-08-26 23:33 by young90
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 系统查不到 +10 董八千 2026-08-26 10/500 2026-08-26 16:30 by Equinoxhua
[基金申请] 能否退出参与的面上项目解除限项 +23 koalala 2026-08-24 26/1300 2026-08-26 14:29 by 宝贝虫子
[基金申请] 只有每年这种时候来逛逛小木虫 +26 yaoyewhu2008 2026-08-20 28/1400 2026-08-26 13:49 by zzuzxg
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 国际合作可查了,中了面上 +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 怎么看青基中了没有啊 +4 叶九微 2026-08-26 4/200 2026-08-26 10:52 by xiacongxu
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 国合现在查不到了吗? +10 chengyan1220 2026-08-24 20/1000 2026-08-26 08:57 by peasantsprig
[基金申请] 人气不行了 +11 fansofjerry 2026-08-21 11/550 2026-08-25 11:04 by 孤独的英雄6
[基金申请] 我面上完蛋了 +13 且听虎啸 2026-08-20 14/700 2026-08-25 09:10 by mrkang
[基金申请] 建议基金发布提前给出明确的时间点 +13 kulium 2026-08-21 16/800 2026-08-24 16:27 by superceng
[基金申请] 让我中一个面上吧! +13 大萍1987 2026-08-20 16/800 2026-08-24 10:23 by 太傻了
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
信息提示
请填处理意见