SU初学习之程序编写

示例一:

建立一个采样间隔为4ms,200个采样点,主频30Hz的ricker子波。

(一)建立ricker.c文件

首先,在命令行中输入vi  ricker.c,建立一个名为ricker.c的文件,在文件中加入头文件,程序如下:

#include<stdio.h>
#include<math.h>
#include<su.h>
#include<segy.h>
main()
{
    float pi=3.1415926,a,b,t=0.0,lt=0.8,dt=0.004,fp=30,*r1;#lt为总检测时间,dt为每隔dt时间检测一次,fp为主频
    int i,nt;
    nt=(int)(lt/dt);#nt为采样点个数
    FILE *fp1;#创建文件
    r1=alloc1float(nt);#为r1分配空间
    for(i=0;i<nt;i++)
        r1[i]=0.0;#安全起见,先为数组每个元素赋0值
    for(i=0;i<nt;i++)#雷克子波的生成方式
    {
        t=(i-nt/2)*dt;
        a=pi*t*fp;
        b=a*a;
        r1[i]=(1-2*b)*exp(-b);
    }
    fp1=fopen("r1.bin","wb");#打开文件,一个fopen对应一个fclose,wb为打开方式
    for(i=0;i<nt;i++)#向文件中写入数据
         fwrite(&r1[i],sizeof(float),1,fp1);
    fclose(fp1);
}

(二)为ricker.c建立makefile文件

在命令行输入 vi makefile后,再输入

#! /bin/sh
# Make  ricker  programs
INC=${CWPROOT}/include
LIK=${CWPROOT}/lib
LIB=-lsu -lpar -lcwp -lm
ricker:ricker.c
gcc ricker.c -o ricker  -O3 -I${INC} -L${LIK} ${LIB}

保存退出。

注意:makefile与ricker.c在同一个文件夹里。

(三)生成可执行文件

在命令行中输入:make

(四) 运行程序

输入./ricker

使用xgraph<r1.bin n1=200 d1=0.004&

可得到如下图所示的ricker子波。

示例二

生成ricker子波后,对其进行傅里叶变换,计算它的振幅谱与相位谱。

(一)建立一个名为fft.c的文件(其中ricker子波参数与示例一相同),程序如下:

#include "su.h"
#include "segy.h"
#include "header.h"
#include <time.h>
void ricker(float *r1,int nt)
{
	float pi=3.1415926,a,b,t=0.0,lt=0.8,dt=0.004;
	int i;
	float fp=30;
	for(i=0;i<nt;i++)
		r1[i]=0.0;
	for(i=0;i<nt;i++)
	{
		t=(i-nt/2)*dt;
		a=pi*t*fp;
		b=a*a;
		r1[i]=(1-2*b)*exp(-b);
	}
}
main()
{
	int nt,ntfft,nw,i,iw;
	float dt=0.004,lt=0.8;
	float *r1,*amp,*pha,*a,*b,*r2f;
	complex *r1f;
	FILE *fp1,*fp2,*fp3,*fp4;
	nt=(int)(lt/dt);
	r1=alloc1float(nt);
	for(i=0;i<nt;i++)
		r1[i]=0.0;
		ricker(r1,nt);
		fp1=fopen("r1.bin","wb");
	for(i=0;i<nt;i++)
    	fwrite(&r1[i],sizeof(float),1,fp1);
	fclose(fp1);
	ntfft=npfar(nt);
	nw=(int)(ntfft/2+1);
	r1f=alloc1complex(nw);
	amp=alloc1float(nw);
	pha=alloc1float(nw);
	a=alloc1float(nw);
	b=alloc1float(nw);
	for(iw=0;iw<nw;iw++)
	{
    	r1f[iw]=cmplx(0.0,0.0);
    	amp[iw]=0.0;
    	pha[iw]=0.0;
    	a[iw]=0.0;
    	b[iw]=0.0;
	}

	pfarc(-1,ntfft,r1,r1f);
	for(iw=0;iw<nw;iw++)
	{
    	a[iw]=r1f[iw].r;
    	b[iw]=r1f[iw].i;
	}
	for(iw=0;iw<nw;iw++)
	{	
    	amp[iw]=sqrt(a[iw]*a[iw]+b[iw]*b[iw]);
    	pha[iw]=atan(b[iw]/a[iw]);
	}
	fp2=fopen("amp.bin","wb");
	for(i=0;i<nw;i++)
    	fwrite(&amp[i],sizeof(float),1,fp2);
	fclose(fp2);
	fp3=fopen("pha.bin","wb");
	for(i=0;i<nw;i++)
    	fwrite(&pha[i],sizeof(float),1,fp3);
	fclose(fp3);
}

 (二) 为fft.c建立makefile文件

在命令行输入 vi  makefile后,再输入

#! /bin/sh
INC=${CWPROOT}/include
LIK=${CWPROOT}/lib
LIB=-lsu -lpar -lcwp -lm
fft:fft.c
gcc fft.c -o fft  -O3 -I${INC} -L${LIK} ${LIB}

保存退出。

注意:makefile与fft.c在同一个文件夹里。

(三)生成可执行文件

在命令行中输入:make

(四) 运行程序

输入./fft

使用

xgraph<amp.bin n1=200 d1=0.004&

xgraph<pha.bin n1=200 d1=0.004&

可得到如下振幅谱与相位谱:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值