信号处理模块.docx
- 文档编号:23065383
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:74
- 大小:48.85KB
信号处理模块.docx
《信号处理模块.docx》由会员分享,可在线阅读,更多相关《信号处理模块.docx(74页珍藏版)》请在冰豆网上搜索。
信号处理模块
在今天我已经做信号处理模块差不多了,感觉东西还是很乱,唉,也不知道怎么搞的。
我一定要好好理一理了,我的界面设计也得马上开始了,已经完全乱了计划,真想打自己,呜呜。
一.在信号部分,我得查查我做了什么。
1.sin信号
:
doublesinwn(doublea,doublef,doubleph,doublefs,intk)
{
doublepi,result;
pi=4.0*atan(1.0);
f=2*pi*f/fs;
ph=ph*pi/180;
result=a*sin(k*f+ph);
returnresult;
}
intmain()
{
inti;
doublea,f,fs,ph;
doublex[n];
a=2.0;
f=5.0;
ph=45.0;
fs=150.0;
for(i=0;i<32;i++)
{
x[i]=sinwn(a,f,ph,fs,i);
printf("%10.7f",x[i]);
if(i%4==3)
printf("\n");
}
return0;
}
2.LFM信号(范围是-T/2,T/2)
:
doublelfm(doublea,doublef0,doubleT,doubleF,doublefs,intk)
{
doublepi,y,f1,f2,f3;
pi=4.0*atan(1.0);
f1=2*pi*f0/fs;
f2=F/T;
f3=pi*f2*(1/fs)*(1/fs);
y=a*cos(f1*k+f3*k*k);
returny;
}
intmain()
{
inti;
doublea,f0,T,F,fs;
//n=50;
doublex[n];
a=1.5;
f0=10.0;
T=50.0;
F=200.0;
fs=150.0;
FILE*fp;
for(i=0;i<=n;i++)
{
x[i]=lfm(a,f0,T,F,fs,i);
printf("%10.4f",x[i]);
printf("\n");
}
fp=fopen("lfm1.txt","w+");
for(i=0;i<=n;i++)
{
fprintf(fp,"%f",x[i]);
}
fclose(fp);
return0;
}
3.方波
:
4.白噪声(高斯分布)
:
5.均匀分布随机信号
:
6.双曲调频(对数相位信号或者线性周期信号)
:
(HyperbolicFMsignal还没做,赶紧做啊)
7.CW脉冲(相当于取一小段0~T内的sin函数或者cos函数)
二.信号处理
1.首先是重头戏FFT:
#include
#include
doublefft(doublex[],doubley[],intn,intsign)
//x[]先x(i)放fft的实部,FFT后放X(k)的实部;y[]先y(i)放fft的实部,FFT后放Y(k)的实部,n为2的整数次方,sign为1时做FFT,sign为-1时,做IFFT;
{
inti,j,k,l,m,n1,n2;
doublec,c1,e,s,s1,t,tr,ti;
j=1;
for(i=1;i<16;i++)//做n点的FFT,并且N<2的16次方
{
m=i;
j=j*2;
if(j==n)break;
}
n1=n-1;
j=0;
for(i=0;i { if(i { tr=x[j]; ti=y[j]; x[j]=x[i]; y[j]=y[i]; x[i]=tr; y[i]=ti; } k=n/2; while(k { j=j-k; k=k/2; } j=j+k; } n1=1; for(l=1;l<=m;l++)//FFT { n1=2*n1; n2=n1/2; e=3.14159265359/n2; c=1.0; s=0.0; c1=cos(e); s1=-sign*sin(e); for(j=0;j { for(i=j;i { k=i+n2; tr=c*x[k]-s*y[k]; ti=c*y[k]+s*x[k]; x[k]=x[i]-tr; y[k]=y[i]-ti; x[i]=x[i]+tr; y[i]=y[i]+ti; } t=c; c=c*c1-s*s1; s=t*s1+s*c1; } } if(sign==-1)//IFFT的公式前面有1/n { for(i=0;i { x[i]/=n; y[i]/=n; } } return0; } #definen16 intmain() { inti; doublew[16]={1.0,0.0,-1.0,0.0,1.0,0.0,-1.0,0.0,1.0,0.0,-1.0,0.0,1.0,-1.0,0.0,1.0}; doublez[16]={0.0}; fft(w,z,n,1); printf("\nFFT\n"); for(i=0;i { printf("%10.7f+J%10.7f",w[i],z[i]); printf("\n"); } return0; } 如果序列x(n)是实数,那么其博立叶变换X(k)一般是复数,但其实部是偶对称,虚部是奇对称,即x(A)具有如下共扼对称性: x(o)和x(付/2)都是实数,且有: X(k)=X*(N-k),1<=k<=(N/2-1); 2.IIR滤波器: (butterworth通带内平坦,但是过渡带衰减的慢,chebyshiev通带内有波动,但是过渡带衰减的快) ifilt——整型变量。 滤波器的类型。 取值为1、2和3,分别对应切比雪夫、逆切比雪夫和巴持沃兹滤波器。 band——整型变量。 滤波器的通带形式。 取值为1、2、3和4,分别对应低遇、高通、带通和带阻滤波器。 ns——整型变量。 滤波器的n阶节数。 n——整型变量。 滤波器每节的阶数。 对于低通和高通滤波器,n=2;对于带通和带阻滤波器,n=4。 对于低通和高通滤波器fc通带边界频率;fr: 阻带边界频率。 对于带通和带阻滤波器flc: 通带下边界频率;fhc: 通带上边界频率;fls: 阻带下边界频率;fhs: 阻带上边界频率。 #include #include #include voidiirbcf(intifilt,intband,intns,intn,doublef1,doublef2,doublef3,doublef4,doubledb,doubleb[],doublea[]) { intk; doubleomega,lamda,epslon,fl,fh; doubled[5],c[5]; voidchebyi(int,int,int,double,double*,double*),chebyii(int,int,int,double,double,double*,double*); voidbwtf(int,int,int,double*,double*); doublecosh1(double),warp(double),bpsub(double,double,double),omin(double,double); voidfblt(double*,double*,int,int,double,double,double*,double*); if((band==1)||(band==4))fl=f1; if((band==2)||(band==3))fl=f2; if(band<=3)fh=f3; if(band==4)fh=f4; if(ifilt<3) { switch(band) { case1: case2: { omega=warp(f2)/warp(f1); break; } case3: { omega=omin(bpsub(warp(f1),fh,fl),bpsub(warp(f4),fh,fl)); break; } case4: { omega=omin(1.0/bpsub(warp(f2),fh,fl),1.0/bpsub(warp(f3),fh,fl)); break; } } lamda=pow(10.0,(db/20.0));//? ? ? epslon=lamda/cosh(2*ns*cosh1(omega));//? ? ? } for(k=0;k { switch(ifilt) { case1: { chebyi(2*ns,k,4,epslon,d,c); break; } case2: { chebyii(2*ns,k,4,omega,lamda,d,c); break; } case3: { bwtf(2*ns,k,4,d,c); break; } } fblt(d,c,n,band,fl,fh,&b[k*(n+1)+0],&a[k*(n+1)+0]); } } staticdoublecosh1(doublex) { doublez; z=log(x+sqrt(x*x-1.0)); return(z); } staticdoublewarp(doublef) { doublepi,z; pi=4.0*atan(1.0); z=tan(pi*f); return(z); } staticdoublebpsub(doubleom,doublefh,doublefl) { doublez; z=(om*om-warp(fh)*warp(fl))/((warp(fh)-warp(fl))*om); return(z); } staticdoubleomin(doubleom1,doubleom2) { doublez,z1,z2; z1=fabs(om1); z2=fabs(om2); z=(z1 z1: z2; return(z); } staticvoidbwtf(intln,intk,intn,doubled[],doublec[]) { inti; doublepi,tmp; pi=4.0*atan(1.0); d[0]=1.0; c[0]=1.0; for(i=1;i<=n;i++) { d[i]=0.0; c[i]=0.0; } tmp=(k+1)-(ln+1.0)/2.0; if(tmp==0.0)//当n为奇数时,在n/2处系数为1/(p+1) { c[1]=1.0; } else { c[1]=-2.0*cos((2*(k+1)+ln-1)*pi/(2*ln)); c[2]=1.0; } } staticvoidchebyi(intln,intk,intn,doubleep,doubled[],doublec[]) { inti; doublepi,gam,omega,sigma; pi=4.0*atan(1.0); gam=pow(((1.0+sqrt(1.0+ep*ep))/ep),1.0/ln); sigma=0.5*(1.0/gam-gam)*sin((2*(k+1)-1)*pi/(2*ln)); omega=0.5*(1.0/gam+gam)*cos((2*(k+1)-1)*pi/(2*ln)); for(i=0;i<=n;i++) { d[i]=0.0; c[i]=0.0; } if(((ln%2)==1)&&((k+1)==(ln+1)/2))//n为奇数,在n/2处的系数 { d[0]=-sigma;//分子 c[0]=d[0];//分母 c[1]=1.0; } else { c[0]=sigma*sigma+omega*omega;//分母 c[1]=-2.0*sigma; c[2]=1.0; d[0]=c[0];//分子 if(((ln%2)==0)&&(k==0)) d[0]=d[0]/sqrt(1.0+ep*ep);//前面的系数A } } staticvoidchebyii(intln,intk,intn,doublews,doubleatt,doubled[],doublec[]) { inti; doublepi,gam,alpha,beta,sigma,omega,scln,scld; pi=4.0*atan(1.0); gam=pow((att+sqrt(att*att-1.0)),1.0/ln); alpha=0.5*(1.0/gam-gam)*sin((2*(k+1)-1)*pi/(2*ln)); beta=0.5*(1.0/gam+gam)*cos((2*(k+1)-1)*pi/(2*ln)); sigma=ws*alpha/(alpha*alpha+beta*beta); omega=-1.0*ws*beta/(alpha*alpha+beta*beta); for(i=0;i<=n;i++) { d[i]=0.0; c[i]=0.0; } if(((ln%2)==1)&&((k+1)==(ln+1)/2)) { d[0]=-1.0*sigma; c[0]=d[0]; c[1]=1.0; } else { scln=sigma*sigma+omega*omega; scld=pow((ws/cos((2*(k+1)-1)*pi/(2*ln))),2); d[0]=scln*scld;//分子常数项 d[2]=scln;//分子平方项 c[0]=d[0]; c[1]=-2.0*sigma*scld; c[2]=scld; } } staticvoidfblt(doubled[],doublec[],intn,intband,doublefln,doublefhn,doubleb[],doublea[]) { inti,k,m,n1,n2,ls; doublepi,w,w0,w1,w2,tmp,tmpd,tmpc,*work; doublecombin(int,int); voidbilinear(double*,double*,double*,double*,int); pi=4.0*atan(1.0); w1=tan(pi*fln);//? ? ? for(i=n;i>=0;i--) { if((c[i]! =0.0)||(d[i]! =0.0)) break; } m=i; switch(band) { case1: case2: { n2=m; n1=n2+1; if(band==2) { for(i=0;i<=m/2;i++) { tmp=d[i]; d[i]=d[m-i]; d[m-i]=tmp; tmp=c[i]; c[i]=c[m-i]; c[m-i]=tmp; } } for(i=0;i<=m;i++) { d[i]=d[i]/pow(w1,i); c[i]=c[i]/pow(w1,i); } break; } case3: case4: { n2=2*m; n1=n2+1; work=(double*)malloc(n1*n1*sizeof(double)); w2=tan(pi*fhn); w=w2-w1; w0=w1*w2; if(band==4) { for(i=0;i<=m/2;i++) { tmp=d[i]; d[i]=d[m-i]; d[m-i]=tmp; tmp=c[i]; c[i]=c[m-i]; c[m-i]=tmp; } } for(i=0;i<=n2;i++) { work[0*n1+i]=0.0; work[1*n1+i]=0.0; } for(i=0;i<=m;i++) { tmpd=d[i]*pow(w,(m-i)); tmpc=c[i]*pow(w,(m-i)); for(k=0;k<=i;k++) { ls=m+i-2*k; tmp=combin(i,i)/(combin(k,k)*combin(i-k,i-k)); work[0*n1+ls]+=tmpd*pow(w0,k)*tmp; work[1*n1+ls]+=tmpc*pow(w0,k)*tmp; } } for(i=0;i<=n2;i++) { d[i]=work[0*n1+i]; c[i]=work[1*n1+i]; } free(work); } } bilinear(d,c,b,a,n); } staticdoublecombin(inti1,inti2) { inti; doubles; s=1.0; if(i2==0) return(s); for(i=i1;i>(i1-i2);i--) { s*=i; } return(s); } staticvoidbilinear(doubled[],doublec[],doubleb[],doublea[],intn) { inti,j,n1; doublesum,atmp,scale,*temp; n1=n+1; temp=(double*)malloc(n1*n1*sizeof(double)); for(j=0;j<=n;j++) { temp[j*n1+0]=1.0; } sum=1.0; for(i=1;i<=n;i++) { sum=sum*(double)(n-i+1)/(double)i; temp[0*n1+i]=sum; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { temp[j*n1+i]=temp[(j-1)*n1+i]-temp[j*n1+i-1]-temp[(j-1)*n1+i-1]; } for(i=n;i>=0;i--) { b[i]=0.0; atmp=0.0; for(j=0;j<=n;j++) { b[i]=b[i]+temp[j*n1+i]*d[j]; atmp=atmp+temp[j*n1+i]*c[j]; } scale=atmp; if(i! =0)a[i]=atmp; } for(i=0;i<=n;i++) { b[i]=b[i]/scale; a[i]=a[i]/scale; } a[0]=1.0; free(temp); } intmain() { inti,k,n,ns,ifilt,band; doublea[50],b[50]; doublef1,f2,f3,f4,fc,fr,fs,flc,fls,fhc,fhs,db; printf("enter1forchebyshevI,2forchebyshevII,3forbutterworth\n"); scanf("%d",&ifilt); printf("enter1forlowpass,2forhighpass,3forbandpass,4forbandstop\n"); scanf("%d",&band); n=(band<=2)? 2: 4; printf("enterthenumberoffiltersection\n"); scanf("%d",&ns); printf("entersamplefrequencyfs\n"); scanf("%lf",&fs); if(ifilt<=2) { switch(band) { case1: case2: { printf("enterpassbandedgefrequencyfc\n"); scanf("%lf",&fc); printf("enterstopbandedgefrequencyfr\n"); scanf("%lf",&fr); if(band=1) { f1=fc; f2=fr; } else { f1=fr; f2=fc; } f3=f4=0; break; } case3: case4: { printf("enterthelowerpassbandedgefrequencyflc\n"); scanf("%lf",&flc); printf("enterthehigherpassbandedgefrequencyfhc\n"); scanf("%lf",&fhc); printf("enter
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号 处理 模块