最小平方反滤波程序代码C语言以及MATLAB编写(共11页).doc

上传人:飞****2 文档编号:14053089 上传时间:2022-05-02 格式:DOC 页数:11 大小:317.50KB
返回 下载 相关 举报
最小平方反滤波程序代码C语言以及MATLAB编写(共11页).doc_第1页
第1页 / 共11页
最小平方反滤波程序代码C语言以及MATLAB编写(共11页).doc_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《最小平方反滤波程序代码C语言以及MATLAB编写(共11页).doc》由会员分享,可在线阅读,更多相关《最小平方反滤波程序代码C语言以及MATLAB编写(共11页).doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上分C语言和MATLAB两部分第一部分:C语言#include stdio.h#include math.h#include stdlib.h#include malloc.h#include string.h#define pi 3.14#define fm 25 /主频#define dt 0.001 /采样间隔void con(float a,float b,float c,int M,int L);/褶积void zixiangguan(float *a,float *r,int P);/自相关int jiefangchengzu(float R,int n,f

2、loat b,float x);/解托普利茨方程组void main() int i,j;int P=200;/子波长度int Q=399;/反射序列长度float a;/子波衰减因子float wave200,ref200,con1399,xcorr200,b200,at200,yt598;FILE *fp_wave,*fp_con1,*fp_xcorr,*fp_at,*fp_yt;fp_wave=fopen(wave.csv,w);/子波fp_con1=fopen(con1.csv,w);/子波与反射序列褶积的地震记录fp_xcorr=fopen(xcorr.csv,w);/地震记录自相关

3、fp_at=fopen(at.csv,w);/反滤波因子fp_yt=fopen(yt.csv,w);/因子与地震记录褶积for(i=0;iP;i+)refi=0.;ref50=0.2; ref80=0.4; ref150=-0.7; /构造反射序列/for(i=0;iP;i+)a=2*fm*fm*log(2)/3;wavei=cos(2*pi*fm*i*dt)*exp(-a*i*i*dt*dt);fprintf(fp_wave,%fn,wavei); / 构造子波 /con(wave,ref,con1,P,P);for(i=0;iQ;i+)fprintf(fp_con1,%fn,con1i);

4、 / 褶积生成地震记录 /zixiangguan(wave,xcorr,200);for(i=0;iP;i+)fprintf(fp_xcorr,%fn,xcorri); / 子波自相关 /for(i=0;iP;i+)bi=0;b0=1; / 构造方程组右侧结果数组 /jiefangchengzu(xcorr,P,b,at);for(i=0;iP;i+)fprintf(fp_at,%fn,ati); / 解方程组,求反滤波因子 /con(con1,at,yt,Q,P);for(i=0;iP+Q-2;i+)fprintf(fp_yt,%fn,yti); / 因子与地震记录褶积 / 普通褶积 /vo

5、id con(float a,float b,float c,int M,int L)int i,j,N;float tp=0;N=M+L-1;for(i=0;iN;i+) for(j=0;j=0&(i-j)L)tp+=aj*b(i-j); ci=tp;tp=0;/ 函数自相关 /void zixiangguan(float *a,float *r,int P) int i,j;float s=0;for(i=0;iP;i+)for(j=0;j=i;j+)s=s+aj*aP-1-i+j;/从最左边开始,移到两者重合rP-1-i=s;s=0;/ 莱文森递推解托普利茨方程组 / /R为矩阵的第一行

6、或者第一列数据,b为方程组右侧结果, x为计算的反滤波因子 int jiefangchengzu(float R,int n,float b,float x) int i,j,k; float a,beta,q,c,h,*y,*s; s=(float*)calloc(n,sizeof(double); y=(float*)calloc(n,sizeof(double); a=R0; if (fabs(a)+1.0=1.0) free(s); free(y); printf(failn); return(-1); y0=1.0;x0=b0/a; for(k=1;k=n-1;k+) beta=0.

7、0;q=0.0; for(j=0;j=k-1;j+) beta=beta+Rj+1*yj; q=q+Rk-j*xj; if(fabs(a)+1.0=1.0) free(s);free(y);printf(failn);return(-1); c=-beta/a;s0=c*yk-1;yk=yk-1; if(k!=1) for(i=1;i=k-1;i+) si=yi-1+c*yk-i-1;a=a+c*beta; if(fabs(a)+1.0=1.0) free(s);free(y);printf(failn);return(-1); h=(bk-q)/a; for(i=0;i=k-1;i+) xi

8、=xi+h*si;yi=si; xk=h*yk; free(s); free(y); return(1); 第二部分:MATLABf=25;%频率a=2/3*f*f*log(2);dt=0.001;%采样时间for i=1:200wave(i)= cos(2*pi*f*i*dt)*exp(-a*i*i*dt*dt);%生成子波endplot(wave)for i=1:200ref(i)=0;endref(50)=0.7;ref(80)=-0.4;ref(150)=0.5;%构造反射序列con1=conv(wave,ref);%褶积生成地震记录for i=1:200wav(i)=wave(201

9、-i);%把wave反一下endf3=conv(wave,wav);%wave与wav褶积相当于wave自相关for i=1:200t(i)=f3(i+199);%利用自相关后200个数据endT=toeplitz(t);% 用t构造托普利兹矩阵,相当于线性方程组的系数b=zeros(200,1);%构造一个矩阵,线性方程组右侧的结果b(1,1)=1; %构造一个矩阵,相当于线性方程组右侧的结果at=Tb;%解方程组,求出反滤波因子atyt=conv(con1,at);%地震记录与反滤波因子褶积子波地震记录反射序列子波自相关截取自相关后半段反滤波因子Yt :滤波因子at与地震记录褶积结果与最初反射系数一致,实现反滤波专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁