课程设计 信号分析与处理C语言编程Word下载.docx
- 文档编号:20550769
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:20
- 大小:52.64KB
课程设计 信号分析与处理C语言编程Word下载.docx
《课程设计 信号分析与处理C语言编程Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计 信号分析与处理C语言编程Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
主要注意几点就行了
1,熟悉课本滤波部分知识;
2,第二参数要比第一参数滤波效果好,因为门第一参数开大了,进来的干扰波也多了,从第一参数:
Fy、第二参数Fy图形上可以看出来,干扰波频谱被压小了。
第二参数压制了干扰波,突显了有效波,所有好。
频域滤波
由公式:
1,对x(t)进行补0,28或者29总之必须是2的次方,因为要用到FFT公式与IFFT公式,进行FFT变换得到X(k);
2,H(k)的求法:
H(k)也必须与X(k)点数相同
单门:
20,
50
双门:
50,
=N-
3,
在用IFFT反变换得y(t),存在实部与虚部,需要分析与处理
画出H(k)、X(k)、Y(k)图形,并且分析X(k)、Y(k)的区别,还有开单双门的区别与差异,时域与频域滤波谁好、为什么?
3,分析:
从单双门实部图形看出,与有效波是完全一样的,但是幅值变大,这体现了滤波突显有效波的特性;
从图形看出虚部对结果没有影响;
单双门虚部完全不同,这是由于开单双门效果不同引起的。
单门虚部变化大,而且幅值与起伏变化也大,而双门幅值很小,小到可以忽略不计。
按理说反变化IFFT后应该只有实部,没有虚部,至于为什么会产生虚部,希望读者自己下去研究下,希望大家相互交流、交流!
第一个注意问题:
单门与双门谁好?
答案当然是:
双门好。
因为原始有效波x(t)是实数信号,对应的频谱是偶对称的,单门时,只是让一部分通过了;
而双门则全部通过,肯定效果要好!
而且实部波形,明显看出双门是干扰部分起伏比单门时要平缓,小得多了。
第二个注意问题:
时域与频域哪个好?
频域要好,首先从两者波形上可以看出,其次就是频域滤波,只让有效波通过,而之外的完全被滤掉,可谓是真正的理想状态。
第三个注意问题:
频域滤波y(t)实部图200点以后,为什么有波形起伏?
因为由于时域离散,必将导致频域周期化,这是由于频域周期化的结果。
2、相关
1,
30Hz,抽样点数:
M=100
0.8,
50Hz,抽样点数:
M=150
Δ=0.004s
画出
的图形并分析验证书上自互相关性质的正确性!
3、快速褶积
25Hz,抽样点数:
M=250
0.7,
55Hz,抽样点数:
M=200
4、地震记录的生成和频谱分析
地震记录的生成和频谱分析、信噪比计算以及补0对频谱的影响,给定地震子波的数学表达式:
和反射系数序列:
0.2,
0.4,
0.15,
0.5
0.35,
0.1,
0.2
产生一个含有随机干扰信号的地震信号:
(其中n(t)可以用-0.4—+0.4之间的随机数代替)
1,制作合成地震记录x(t),并对b(t)和s(t)做频谱分析(用FFT),其中:
b(t)(N=41,Δ=0.004s,f=35Hz,α=100,A1=1)反射序列和随机干扰N=200;
2,计算x(t)信噪比,改变n(t)(用-0.8—+0.8之间的随机数代替)的大小再计算。
信噪比:
3,分别对b(t)后边、前边、中间补0,计算补0前后频谱的变化及补0多少对频谱的影响。
附带程序:
最麻烦的就是编程序了,开始的时候,是很麻烦,不过只有去啃,就一定会有收获,比如:
我开始编褶积程序的时候,整理了几天,上网查,翻图书,后来突然明白,靠公式就可以编出来了。
只是FFT需要些功夫,其余都很快!
书上介绍的是基2FFT,这个代码网上到处都有,想提升自己的编程能力,就去尝试编基4FFT,以及考虑基nFFT吧,祝大家好运。
1、时域滤波程序代码
#include<
stdio.h>
math.h>
#include"
conv.cpp"
dft.cpp"
gyh.cpp"
#defineT200//************T表示x(t)点数,R表示n(t)点数
#defineR60
voidmain()
{
inti,j,B=100;
//*********************B表示贝塔的值
FILE*fp;
doubleA1=1.0,A2=0.8,A3=0.5;
//********产生x(t)
doublef1=25,f2=45,f3=5,f4=80;
//******频率取值
doubledata=0.004;
//******************取样点数
doubles[T],n[T],x[T],h[R],y[T+R-1];
doublesi[T]={0},s1[T]={0},s1i[T]={0},Fs[T]={0};
doubleni[T]={0},n1[T]={0},n1i[T]={0},Fn[T]={0};
doublexi[T]={0},x1[T]={0},x1i[T]={0},Fx[T]={0};
doublehi[T]={0},h1[T]={0},h1i[T]={0},Fh[T]={0};
doubley1[T+R-1]={0},yb[T+R-1]={0},yb1[T+R-1]={0},Fy[T+R-1]={0};
for(i=0;
i<
T;
i++)
{
s[i]=A1*exp(-B*pow((i*data),2))*sin(2*PI*f1*i*data)+A2*exp(-B*pow((i*data),2))*sin(2*PI*f2*i*data);
n[i]=A3*(sin(2*PI*f3*i*data)+cos(2*PI*f4*i*data));
x[i]=s[i]+n[i];
}
//对s(t)进行频谱分析,用DFT
dft(s,si,s1,s1i,Fs,T,1);
dft(n,ni,n1,n1i,Fn,T,1);
dft(x,ni,x1,x1i,Fx,T,1);
//统一导出
fp=fopen("
D:
\\sh\\time1\\snxFsFnFx1.txt"
"
w"
);
for(i=0;
fprintf(fp,"
%f\t%f\t%f\t%f\t%f\t%f\n"
s[i],n[i],x[i],Fs[i],Fn[i],Fx[i]);
fclose(fp);
//产生h(t)
floatff1=20,ff2=50;
//*****************可以修改的h(t)参数
doublew1,w2,dataw,w0;
w1=2*PI*ff1,w2=2*PI*ff2;
dataw=(w2-w1)/2,w0=(w2+w1)/2;
h[0]=2*dataw/PI;
for(j=1;
j<
R;
j++)
h[j]=(2.0/(PI*j*data))*cos(w0*j*data)*sin(dataw*j*data);
dft(h,hi,h1,h1i,Fh,R,1);
gyh(Fh,R);
\\sh\\time1\\hFh.txt"
for(j=0;
fprintf(fp,"
%f\t%f\n"
h[j],Fh[j]);
fclose(fp);
//褶积滤波得到y(t)
con(x,h,y,T,R);
//对y(t)作傅里叶变换
dft(y,y1,yb,yb1,Fy,T+R-1,1);
//导出y及频谱Y(k)
fp=fopen("
\\sh\\time1\\yFy1.txt"
T+R-1;
y[i],Fy[i]);
printf("
\nover\n\n"
}
2、频域滤波程序代码:
fft.cpp"
ifft.cpp"
#defineG256
inti,B=100;
//定义指针文件
//产生x(t)
//参数
//抽样间隔
doubles[200],n[200];
doublex[G]={0},x1[G]={0},h[G]={0},h1[G]={0},y[G]={0},y1[G]={0};
doubleFx[G]={0},Fh1[G]={0},Fh2[G]={0},Fy1[G]={0},Fy2[G]={0};
doubleY1[G]={0},Y1i[G]={0},Y2[G]={0},Y2i[G]={0};
200;
//导出x[t]
\\sh\\py\\x.txt"
G;
%f\n"
x[i]);
//x[t]频谱计算
fft(x,x1,Fx,G,1);
//导出X(k)
\\sh\\py\\Fx.txt"
Fx[i]);
//处理h[t]
doubledataf;
doublem1,m2,m3,m4;
dataf=1.0/(data*G);
m1=20.0/dataf,m2=50.0/dataf;
m3=G-m2,m4=G-m1;
//计算,导出单门
if(i>
=int(m1)&
&
=int(m2))
Fh1[i]=1;
elseFh1[i]=0;
//计算,导出双门
if((i>
=int(m2))||(i>
=int(m3)&
=int(m4)))
Fh2[i]=1;
elseFh2[i]=0;
\\sh\\py\\Fh12.txt"
256;
Fh1[i],Fh2[i]);
i++)//单门滤波
Y1[i]=x[i]*Fh1[i];
Y1i[i]=x1[i]*Fh1[i];
Fy1[i]=sqrt(pow(Y1[i],2)+pow(Y1i[i],2));
i++)//开双门
Y2[i]=x[i]*Fh2[i];
Y2i[i]=x1[i]*Fh2[i];
Fy2[i]=sqrt(pow(Y2[i],2)+pow(Y2i[i],2));
\\sh\\py\\Fy12.txt"
//导出单双门
Fy1[i],Fy2[i]);
//Y[k]作反变换IFFT,并且导出实部,虚步
ifft(Y1,Y1i,G,-1);
ifft(Y2,Y2i,G,-1);
\\sh\\py\\yt12.txt"
%f\t%f\t%f\t%f\n"
Y1[i],Y1i[i],Y2[i],Y2i[i]);
3、相关程序代码
correl.cpp"
inti,j;
doubleA1=1.0,A2=0.8;
doublef1=30,f2=50;
doubledata=0.004,p=100;
doublex[100]={0},y[150]={0},xy[249]={0},yx[249]={0};
doublexx[199],yy[299],xyft[249];
100;
x[i]=A1*sin(2*PI*f1*i*data);
150;
j++)//计算y(t)
y[j]=A2*exp(-p*j*data*j*data)*sin(2*PI*f2*j*data);
correl(x,y,100,150,xy);
correl(x,x,100,100,xx);
correl(y,y,150,150,yy);
correl(y,x,150,100,yx);
FILE*fp,*fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
//导出数据
inti1,j1,k,l,m,n;
fp1=fopen("
\\sh\\data\\x.txt"
fp2=fopen("
\\sh\\data\\y.txt"
fp3=fopen("
\\sh\\data\\xy.txt"
fp4=fopen("
\\sh\\data\\xx.txt"
fp5=fopen("
\\sh\\data\\yx.txt"
fp6=fopen("
\\sh\\data\\yy.txt"
249;
xyft[i]=yx[i];
\\sh\\data\\xyt.txt"
xyft[i]);
for(i1=0;
i1<
i1++)
fprintf(fp1,"
x[i1]);
fclose(fp1);
for(j1=0;
j1<
j1++)
fprintf(fp2,"
y[j1]);
fclose(fp2);
for(k=0;
k<
k++)
fprintf(fp3,"
xy[k]);
fclose(fp3);
for(l=0;
l<
199;
l++)
fprintf(fp4,"
xx[l]);
fclose(fp4);
for(m=0;
m<
m++)
fprintf(fp5,"
yx[m]);
fclose(fp5);
for(n=0;
n<
299;
n++)
fprintf(fp6,"
yy[n]);
fclose(fp6);
4、地震子波及频谱分析
uni.cpp"
#defineV64//*********宏定义的参数,可以修改的点数
#defineW256
inti;
doubleA1=1,f=35,a=100;
//********************a代表阿尔法α
//*************************抽样间隔
doubleb[V]={0},bi[V]={0},Fb[V]={0},ks[200]={0};
doublesz[W]={0},s[200]={0},szi[W]={0},Fsz[W]={0};
doublex[W]={0},xi[W]={0},Fx[W]={0},n[200]={0};
doublexwp[V];
41;
b[i]=A1*exp(-a*i*data)*sin(2*PI*f*i*data);
//*****产生ξ(t)
ks[29]=0.2,ks[64]=0.4,ks[80]=0.15,ks[102]=0.5,ks[114]=0.35,ks[145]=0.1,ks[156]=0.2;
\\da\\b.txt"
V;
b[i]);
\\da\\ks.txt"
ks[i]);
con(b,ks,sz,41,200);
\\da\\s.txt"
W;
sz[i]);
i++)//*******************甩掉后40个样点
s[i]=sz[i];
uni(-0.4,0.4,200,n);
//*****************产生随机数
\\da\\n.txt"
n[i]);
\\da\\x.txt"
fft(sz,szi,Fsz,W,1);
//**********
fft(b,bi,Fb,V,1);
//************************用fft对b[t],x[t]频谱分析
fft(x,xi,Fx,W,1);
\\da\\Fs.txt"
Fsz[i]);
\\da\\Fb.txt"
Fb[i]);
\\da\\Fx.txt"
xwp[i]=atan(bi[i]/b[i]);
\\da\\xw.txt"
xwp[i]);
5、信噪比
#defineV64
doubledata=0.004,Sr,tps=0,tpn=0;
doubleb[V]={0},sz[240]={0},s[200]={0},ks[200]={0};
doublex[W]={0},n[200]={0};
ks[29]=0.2,ks[64]=0.4,ks[80]=0.15;
ks[102]=0.5,ks[114]=0.35,ks[145]=0.1,ks[156]=0.2;
i++)//甩掉后40个样点
//随机数
i++)//信噪比计算
tps+=pow(s[i],2);
tpn+=pow(n[i],2);
Sr=tps/tpn;
printf("
S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 信号分析与处理C语言编程 信号 分析 处理 语言 编程