课程设计总结论文课程名称:高级语言编程课程设计专业:电子信息工程班级:132学号:13424036姓名:陈俊宏指导教师:李泽光2014年7月9号目录(一)1、数字滤波器的设计与应用2、数字滤波器的设计与应用流程图及程序(二)1、离散傅立叶变换的应用2、离散傅立叶变换的应用相应流程图及程序(三)本次实训,所获心得体会,以及自身不足(一)数字滤波器的设计与应用1.1设计题目:基于正交双通道算法的正弦信号相位差的计算。1.2设计目的:通过该题的训练,使学生掌握连续信号的离散化处理、数字滤波器的设计与应用、卷积运算及其应用等许多数字信号处理技术,为工程实践打好基础。1.3设计目标:编写程序计算出结果并与预先所设的值比较,要求做到误差最小。1.4设计原理:两路被测同频正弦信号u(t)和i(t)各自经过两个乘法器,两个乘法器的另外两个输入端分别是互为正交的正弦本振信号SI(t)和SQ(t)。4个乘法器的输出信号经过低通滤波器处理后得到4个低频或直流信号HI1(t)、HQ1(t)、HI2(t)、HQ2(t)。通过计算,可以得到有功功率:P=2[HI1(t)*HI2(t)+HQ1(t)*HQ2(t)]=(UmImcosθ)/2无功功率:Q=2[HQ1(t)*HI2(t)-HI1(t)*HQ2(t)]=(UmImsinθ)/2视在功率:S=22QP=UmIm/2功率因子:cosθ=P/S相位差:Θ=arccos(P/S)2.1流程图:开始PI=3.1415926,N=1025,fc=1000,HI1=HQ1=HI2=HQ2=0,输入f0,f1,fs,U,I,xX=xPI/180,n=0Nn?a=2PIf0n/fsb=2PIf1n/fsu[n]=Ucos(a)i[n]=Icos(a+x)SI[n]=cos(b)SQ[n]=sin(b)n=n+1Yn=0Nn?UI[n]=u[n]SI[n]UQ[n]=u[n]SQ[n]II[n]=i[n]SI[n]IQ[n]=i[n]SQ[n]n=n+1YNn=0NNn?n=(N-1)/2?Yhd[n]=2fc/fsc=2PIfc(n-(N-1)/2)/fshd[n]=2fcsin(c)/(fsc)YNw[n]=0.54-0.46cos(2PIn/(N-1))h[n]=hd[n]w[n]n=n+1n=0NNn?HI1=HI1+UI[n]h[n]HQ1=HQ1+UQ[n]h[n]HI2=HI2+II[n]h[n]HQ2=HQ2+IQ[n]h[n]n=n+1YP=2(HI1HI2+HQ1HQ2)Q=2(HQ1HI2-HI1HQ2)S=UI/2y=P/SN输出P,Q,S,y结束2.2程序:#includestdio.h#includemath.h#definePI3.14156926#defineN1025#definefc1000voidmain(){intn;floata,b,c,d,x,y,f0,f1,fs,HI1,HQ1,HI2,HQ2,U,I,P,Q,S;floatu[N],i[N],SI[N],SQ[N],UI[N],UQ[N],II[N],IQ[N],hd[N],h[N],w[N];HI1=HQ1=HI2=HQ2=0;printf(请输入被测信号的频率:\n);scanf(%f,&f0);printf(请输入本振信号的频率:\n);scanf(%f,&f1);printf(请输入采样频率:\n);scanf(%f,&fs);printf(请输入电压最大值:\n);scanf(%f,&U);printf(请输入电流最大值:\n);scanf(%f,&I);printf(请输入相位差:\n);scanf(%f,&x);x=x*PI/180;for(n=0;nN;n++){a=2*PI*f0*n/fs;b=2*PI*f1*n/fs;u[n]=U*cos(a);i[n]=I*cos(a+x);SI[n]=cos(b);SQ[n]=sin(b);}for(n=0;nN;n++){UI[n]=u[n]*SI[n];UQ[n]=u[n]*SQ[n];II[n]=i[n]*SI[n];IQ[n]=i[n]*SQ[n];}for(n=0;nN;n++){if(n!=(N-1)/2){c=2*PI*fc*(n-(N-1)/2)/fs;hd[n]=2*fc*sin(c)/(fs*c);}elsehd[n]=2*fc/fs;w[n]=0.54-0.46*cos(2*PI*n/(N-1));}for(n=0;nN;n++){h[n]=hd[n]*w[n];}for(n=0;nN;n++){HI1=HI1+UI[n]*h[n];HQ1=HQ1+UQ[n]*h[n];HI2=HI2+II[n]*h[n];HQ2=HQ2+IQ[n]*h[n];}P=2*(HI1*HI2+HQ1*HQ2);Q=2*(HQ1*HI2-HI1*HQ2);S=U*I/2;y=P/S;printf(有功功率为:%.6f\n,P);printf(无功功率为:%.6f\n,Q);printf(视在功率为:%.6f\n,S);printf(功率因素为:%.6f\n,y);}(二)离散傅立叶变换的应用2.1设计题目:轴承故障诊断。2.2设计目的:通过本课程设计的训练可以掌握数据文件的打开、读写等操作,掌握离散傅立叶变换的概念、工程应用与计算机实现,为将来的工程实践打好基础。2.3设计目标:本设计利用时域分析、幅值分析和频域分析等方法对轴承振动信号进行计算和分析。在频域分析中分别用直接离散傅立叶变换和快速傅立叶变换两种方法来编写程序进行轴承振动信号的频谱分析,对给定的轴承振动数据进行数据计算和分析,判断轴承出现问题的部位。2.4设计原理:对轴承振动信号进行去均值后归一化处理,利用处理过得去均值的归一化数据x(n),n=0~N-1;查找到数据|x(n)|中的最大值;计算均方根值;计算峰值因子;计算峭度。根据计算出的峰值因子和峭度值判断被测轴承的好坏,并给出结论。如果轴承已损坏,下面通过信号的频域分析找到轴承的故障点。信号采样频率为:fs=16000Hz。将给定的轴承振动信号数据(已去均值并归一化)读到所设的数组x(n)中,n=0~N-1(N=2048点),对N个点的x(n)做离散傅里叶变换(DFT)得N个点的X(k),k=0~N-1,则功率谱为2|)(X|k,取功率谱的对数Y(k)=log2|)(X|k,再对Y(k)求傅里叶反变换得到倒频谱:y(n)=IDFT[Y(k)]。在倒频谱y(n)中,如果在ni=fs/fi,i=1,2,3,4处出现峰值,ni=0~N/2-1,则对应的fi(i=1,2,3,4)就是轴承的故障频率,则可以判断轴承出现故障的部位。2.1流程图:开始N=2048,PI=3.1415926,m=0,jf=0,Xq=0Fp=fopen(c:\\6310.dat,r)=NULL?输出:不能打开文件YFeof(fp)=0?NN=0YNn?fscanf(fp,%f,&x[n])n=n+1Yfclose(fp)Nn=0Nn?m=m+x[n]n=n+1Ym=m/Nn=0NNn?x[n]=x[n]-mn=n+1YXmax=|x[0]|n=1NNn?|x[n]|Xmax?YXmax=|x[n]|n=n+1YNn=0NNn?x[n]=x[n]/Xmaxn=n+1Yn=0NNn?Jf=jf+x[n]x[n]n=n+1YJf=jf/NJf=sqrt(jf)n=0NNn?Xq=Xq+x[n]x[n]x[n]x[n]n=n+1YXq=Xq/(Njfjfjfjf)Xp=|x[0]|n=0NNn?|x[n]|Xp?YXp=|x[n]|n=n+1YNNc=Xp/jf输出最大值Xmax,峰值Xp,均方根值jf,峭度c,峰值因子Xqn=0Nn?x[n]=x[n](0.54-0.46cos(2PIn/(N-1)))n=n+1Yn=0NNn?Xr[n]=0X1[n]=0k=0YNk?Xr[n]=Xr[n]+x[k]cos(2PInk/N)X1[n]=X1[n]-x[k]sin(2PInk/N)k=k+1Yn=n+1Nk=0NNk?y[k]=log10(Xr[k]Xr[k]+X1[k]X1[k])k=k+1Yn=0NNn?Yr[n]=0Y1[n]=0k=0YNk?Yr[n]+=y[k]cos(2PInk/N)Y1[n]+=y[k]sin(2PInk/N)k=k+1YYr[n]=Yr[n]/NY1[n]=Y1[n]/Nn=n+1Nn=0NNn?y[n]=1000sqrt(Yr[n]Yr[n]+Y1[n]Y1[n])n=n+1Yfp=fopen(c:\\zh.dat,w)=NULL?N打印:不能打开该文件exit(1)Yn=0NNn?fprintf(fp,n=%-6d%f\n,n,y[n])n=n+1Y结束N2.2程序:#includestdio.h#includestdlib.h#includemath.h#defineN2048#definePI3.1415926voidmain(){FILE*fp;floatx[N],y[N],Xmax,m=0,Xp,a,jf=0,c,Xq=0,Xr[N],X1[N],Yr[N],Y1[N];inti,k,n;if((fp=fopen(c:\\6310.dat,r))==NULL){printf(不能打开文件.\n);exit(1);}if(!feof(fp))for(n=0;nN;n++)fscanf(fp,%f,&x[n]);fclose(fp);for(n=0;nN;n++)m+=x[n];m/=N;for(n=0;nN;n++)x[n]-=m;Xmax=fabs(x[0]);for(i=1;iN;i++)if(fabs(x[i])Xmax)Xmax=fabs(x[i]);for(n=0;nN;n++)x[n]/=Xmax;for(n=0;nN;n++)jf+=x[n]*x[n];jf/=N;jf=sqrt(jf);for(n=0;nN;n++)Xq+=x[n]*x[n]*x[n]*x[n];Xq/=N*jf*jf*jf*jf;a=fabs(x[0]);for(i=0;iN-1;i++)if(fabs(x[i])a)a=fabs(x[i]);Xp=a;c=Xp/jf;printf(最大值=%f\n峰值=%f\n均方根值=%f\n峭度=%f\n峰值因子=%f\n,Xmax,Xp,jf,c,Xq);for(n=0;nN;n++){x[n]=x[n]*(0.54-0.46*cos(2*PI*n/(N-1)));}for(n=0;nN;n++){Xr[n]=0;X1[n]=0;for(k=0;kN;k++){Xr[n]+=x[k]*cos(2*PI*n*k/N);X1[n]+=-x[k]*sin(2*PI*n*k/N);}}for(k=0;kN;k++)y[k]=log10(Xr[k]*Xr[k]+X1[k]*X1[k]);for(n=0;nN;n++){Yr[n]=0;Y1[n]=0;for(k=0;kN;k++){Yr[n]+=y[k]*cos(2*PI*n*k/N);Y1[n]+=y[k]*sin(2*PI*n*k/N);}Yr[n]/=N;Y1[n]/=N;}for(n=0;nN;n++)y[n]=1000*sqrt(Yr[n]*Yr[n]+Y1[n]*Y1[n]);if((fp=fopen(c:\\zh.dat,w))==NULL){printf(不能打开该文件\n);exit(1);}for(n=0;nN;n++)fprintf(fp,n=%-6d%f\n,n,y[n]);}(三)本次实训,所获心得体会,以及自身不足通过这次实训,让我知道了C语言在我们电信专业上所能起到的作用是非常巨大的,因为这些所有电子设备的硬件都需要有软件来