⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convolution model.cpp

📁 石油地震勘探褶积的一个简单程序显示
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.1415926
#define f0 40

void main()
{
	int   i,j,k,num1,num2;   
    double   dt,*R,wavelet[81],reflect[460],*s,*x; 
	FILE *fp,*reflection,*record;
	/***************************Ricker子波离散化******************************/ 
	dt=0.001;                                                  /*离散时间间隔*/
	R=wavelet;
	k=-40;
	for(i=0;k<=40;k++)                                    
	{
		wavelet[i]=(1-2*(PI*f0*k*dt)*(PI*f0*k*dt))*exp(-(PI*f0*k*dt)*(PI*f0*k*dt));
		i++;
	}
	/****************************输出数据到文件*******************************/
	if((fp=fopen("D:\\code\\data\\X_wavelet.txt","w+"))==NULL)
	{
		printf("cann't open file\n");
		return;
	}
	for(i=0;i<=80;i++)
		if (fprintf(fp,"%f\n",wavelet[i])==0)
			printf("file write error\n");		
	fclose(fp);
	/****************************输入反射系数序列******************************/
	num1=81;
	num2=231;
	for(i=0;i<=230;i++)
		reflect[i]=0;
	reflect[40]=0.2353;
	reflect[75]=0.1871;
	reflect[110]=-0.3731;
	reflect[140]=0.4247;
	reflect[175]=-0.2455;
	reflect[230]=0.1871;
	s=(double   *)malloc((num1+num2-1)*sizeof(double   ));
	x=(double   *)malloc(num2*sizeof(double   ));
	/**************************输出反射系数离散序列到文件**********************/
	if((reflection=fopen("D:\\code\\data\\reflection.txt","w+"))==NULL)
	{
		printf("cann't open file\n");
		return;
	}
	for(i=0;i<=230;i++)
		if (fprintf(reflection,"%f\n",reflect[i])==0)
			printf("file write error\n");		
	fclose(reflection);
	/*********************wavelet[]与reflect[]褶积的过程***********************/	
	 if(num1>=num2)                   /*先考虑wavelet数组长度大于reflect的情况*/              
	{
		 for(i=0;i<num1+num2-1;i++)
		 {
			 if(i<num2)
			{
				 for(s[i]=0,j=0;j<=i;j++)
					 s[i]+=wavelet[j]*reflect[i-j];
			 }
			 if(num2<=i&&i<num1)
			 {
				 for(s[i]=0,j=i-num2+1;j<=i;j++)
					 s[i]+=wavelet[j]*reflect[i-j];
			 }
			if(i>=num1)
			{
				for(s[i]=0,j=i-num2+1;j<num1;j++)
					s[i]+=wavelet[j]*reflect[i-j];
			}
		 }
	 }
	else                           /*再考虑reflect数组长度大于wavelet的情况*/  
	{
		for(i=0;i<num1+num2-1;i++)
		{
			if(i<num1)
			{
				for(s[i]=0,j=0;j<=i;j++)
					s[i]+=wavelet[j]*reflect[i-j];
			}
			if(num1<=i&&i<num2-1)
			{
				for(s[i]=0,j=0;j<num1;j++)
					s[i]+=wavelet[j]*reflect[i-j];
			}
			if(num2-1<=i)
			{
				for(s[i]=0,j=i-num2+1;j<num1;j++)
					s[i]+=wavelet[j]*reflect[i-j];
			}
		}
	}

    for(j=0,i=40;i<(num1+num2-1-40);i++,j++)                                /*输出褶积结果*/  
	    x[j]=s[i];
    for(j=0;j<num2;j++)                                /*输出褶积结果*/  
	    printf("x[%d]=%f\n ",j,x[j]);
    /*******************************输出结果离散序列***************************/
    if((record=fopen("D:\\code\\data\\record.txt","w+"))==NULL)
	{
		printf("cann't open file\n");
		return;
	}
	for(i=0;i<num2;i++)
		if (fprintf(record,"%f\n",x[i])==0)
			printf("file write error\n");		
	fclose(record);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -