24小时热门版块排行榜    

查看: 2583  |  回复: 2
【奖励】 本帖被评价2次,作者baobiao007增加金币 1.4

baobiao007

木虫 (职业作家)


[资源] 【分享】频率波数域FK偏移c程序【原创】

#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[ i ][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[ i ][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)[ i ]);
        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);
}
//2D-FFT tag=1,正变换;tag=-1,反变换
void FFT2D(float **xr,float **xi,int m,int n,int tag)
{
        int i,k1,k2;
        float **xtr, **xti;
        xtr=MySpace(n,m);
        xti=MySpace(n,m);
        k1=log(m)/log(2.0);
        k2=log(n)/log(2.0);
        if(n>pow(2,k1)) k1=k1+1;
        if(m>pow(2,k2)) k2=k2+1;
    for(i=0; i         fft(xr[ i ],xi[ i ],k2,tag);
    Zhuan(&xr,&xtr,m,n);
    Zhuan(&xi,&xti,m,n);
    for(i=0; i         fft(xtr,xti,k1,tag);
        Zhuan(&xtr,&xr,n,m);
        Zhuan(&xti,&xi,n,m);
        FreeMySpace(&xtr,n);
        FreeMySpace(&xti,n);       
}
//sinc插值
void SincIns(float **pur,float **pui,float ***midr,float ***midi,
                           float v,int m,int n,float dkx,float dkz,float df)
{
        int i,j,l;
        float pi=3.1415926;
        float kx, kz;//圆波数
        float dw;//圆频率采样间隔
        float lm,k,a,b;
        dw=2.0*pi*df;
        for(i=0; i<=m/2; i++)
            for(j=0; j<=n/2; j++)               
                {
                        kx=i*2.0*pi*dkx;
                        kz=j*2.0*pi*dkz;
                        k=0.5*v*sqrt(kx*kx+kz*kz)/dw;//速度要减半(爆炸反射界面原理)
            l=(int)k;
            lm=k-l;
                        a=pi*lm;
                        b=1.0-lm;
                        if(fabs(a-0)<1e-6 || fabs(b-0)<1e-6) continue;
            (*midr)[ i ][j]=pur[ i ][ l ]*cos(a)*sin(a)/a
                                +sin(a)*sin(a)/a*pui[ i ][ l ]
                                +pur[ i ][l+1]*cos(b*pi)*sin(b*pi)/(b*pi)
                                -pui[ i ][l+1]*sin(b*pi)*sin(b*pi)/(b*pi);
                        (*midi)[j]=pui[ i ][ l ]*cos(a)*sin(a)/a
                                -sin(a)*sin(a)/a*pur[ i ][ l ]+pui[ i ][l+1]*cos(b*pi)*sin(b*pi)/(b*pi)
                                +pur[ i ][l+1]*sin(b*pi)*sin(b*pi)/(b*pi);

                }
        for(i=m/2+1; i                 for(j=0; j<=n/2; j++)
                {
                        (*midr)[ i ][j]= (*midr)[m-i][j];
                        (*midi)[ i ][j]=(*midi)[m-i][j];
                }
}
void main()
{
///初始参数设置区///////////////////////////////////
        const int DNUM=64;//零偏移距剖面接收道数       
        const int TNUM=256;//时间采样点数
    const int ZNUM=TNUM;//深度采样点数
        const float V=2000.0;//上覆介质速度
        const float DT=0.002;//时间采样间隔2ms
        const float DX=10.0;//道间距
        const float DZ=DT*V*0.5;//深度步长(速度要减半)
        const float pi=3.1415926;
    char fname1[]="before.dat";//原始地震记录文件名
        char fname2[]="after.dat";//偏移后的剖面文件名
        char fname3[]="mid.dat";//频谱图
////其他参数计算区//////////////////////////////////
        float **recordr, **recordi;
        float **midr, **midi;
        float df;//频率采样间隔
        float dkx;//x方向波数采样间隔
        float dkz;//z方向波数采样间隔
        float dex;
        int i,j;
    df=1.0/(DT*TNUM); dkx=1.0/(DX*DNUM);
        dkz=1.0/(DZ*ZNUM);
        //申请空间
        recordr=MySpace(DNUM,TNUM);
        recordi=MySpace(DNUM,TNUM);
        midr=MySpace(DNUM,TNUM);
        midi=MySpace(DNUM,TNUM);
        //读入原始剖面
        MyReadFile(fname1,recordr,DNUM,TNUM);
        //对原始剖面进行二维傅里叶变换
    FFT2D(recordr,recordi,DNUM,TNUM,1);
        MyWriteFile(fname3,recordr,DNUM,TNUM);
        //对变换结果进行插值
    SincIns(recordr,recordi,&midr,&midi,V,DNUM,TNUM,dkx,dkz,df);
        //乘因子
    for(i=0; i             for(j=0; j                 {   dex=0.5*V*j*dkz/sqrt(pow(i*dkx,2)+pow(j*dkz,2));
                        if(fabs(dex-0)<1e-6) continue;
                    midr[j]=midr[ i ][j]*dex;
            midi[ i ][j]=midi[ i ][j]*dex;                       
                }
        //傅里叶反变换
        FFT2D(midr,midi,DNUM,TNUM,-1);
        MyWriteFile(fname2,midr,DNUM,TNUM);
        //释放空间
        FreeMySpace(&recordr,DNUM);
        FreeMySpace(&recordi,DNUM);
        FreeMySpace(&midr,DNUM);
        FreeMySpace(&midi,DNUM);
}
五点脉冲的偏移结果:


[ Last edited by baobiao007 on 2011-2-18 at 03:48 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zmc

金虫 (正式写手)


★★★ 三星级,支持鼓励

沙发
2楼2011-03-21 10:13:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

biyadi

铁虫 (初入文坛)


★★★★★ 五星级,优秀推荐

c:\documents and settings\administrator\桌面\新建文件夹\c.c(4) : fatal error C1083: Cannot open include file: 'FFT.h': No such file or directory
执行 cl.exe 时出错.
我运行时总会出现以上问题 怎么解决呢
3楼2011-12-14 15:56:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 baobiao007 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[公派出国] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +3 PbwVEMK5haaE 2026-08-25 4/200 2026-08-26 03:20 by cNXvBfCpiZOM
[论文投稿] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 7K1CJE38xLG4 2026-08-25 4/200 2026-08-26 02:04 by cNXvBfCpiZOM
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +17 木水思豆 2026-08-25 20/1000 2026-08-26 01:26 by chengyan1220
[基金申请] 今天务委会开完了,明天出结果吗 +18 angus9576 2026-08-25 22/1100 2026-08-26 00:41 by merchancy
[基金申请] 在坚冰还盖着北海的时候,我看到了怒放的梅花。 (金币+10) +6 ziyangfang 2026-08-25 9/450 2026-08-25 20:26 by huagongfeihu
[基金申请] 有没有大神帮我看看基金代码 28+4 1234567wang 2026-08-24 10/500 2026-08-25 19:15 by lfy8008
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
[基金申请] 2026国自然函评费到账 +20 羊腰板 2026-08-21 23/1150 2026-08-25 16:34 by zsna
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +17 医学老男孩 2026-08-20 22/1100 2026-08-25 15:36 by 医学老男孩
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
[基金申请] 人气不行了 +11 fansofjerry 2026-08-21 11/550 2026-08-25 11:04 by 孤独的英雄6
[基金申请] 今天基金会出结果吗?20260819 +17 kkkl_v 2026-08-19 18/900 2026-08-25 09:41 by windflowerwy
[基金申请] 我面上完蛋了 +13 且听虎啸 2026-08-20 14/700 2026-08-25 09:10 by mrkang
[基金申请] 能否退出参与的面上项目解除限项 +21 koalala 2026-08-24 24/1200 2026-08-24 19:25 by 家与远方
[基金申请] filecode,4个jtjc了 +14 ziyangfang 2026-08-19 17/850 2026-08-24 18:37 by 哈哈蛤?
[基金申请] 建议基金发布提前给出明确的时间点 +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 太傻了
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 时间戳又变了 +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
信息提示
请填处理意见