FIR滤波器程序设计课程设计基于Labview的交流参数测试仪.doc
1.设计主要内容及要求;编写FIR滤波器程序。要求:1)研究FIR滤波器原理以及利用DSP实现的方法。 2)编写FIR滤波器的程序。 3)调试程序,观察结果。2.对设计论文撰写内容、格式、字数的要求;(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。(2).学生应撰写的内容为:中文摘要和关键词、目录、正文、参考文献等。课程设计论文的结构及各部分内容要求可参照沈阳工程学院毕业设计(论文)撰写规范执行。应做到文理通顺,内容正确完整,书写工整,装订整齐。(3).论文要求打印,打印时按沈阳工程学院毕业设计(论文)撰写规范的要求进行打印。(4). 课程设计论文装订顺序为:封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。3.时间进度安排;顺序阶段日期计 划 完 成 内 容备注17月4日教师讲解题目,学生查阅相关资料27月5日进行方案论证,确定程序流程和实现方法37月6日编写程序47月7日调试程序57月8日撰写论文,程序验收沈 阳 工 程 学 院 DSP控制器原理与应用 课程设计成绩评定表系(部): 自控系 班级: 测控本082 学生姓名: 张九霞 指 导 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分调研论证能独立查阅文献,收集资料;能制定课程设计方案和日程安排。0.15432工作能力态度工作态度认真,遵守纪律,出勤情况是否良好,能够独立完成设计工作, 0.25432工作量按期圆满完成规定的设计任务,工作量饱满,难度适宜。0.25432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.55432指导教师评审成绩(加权分合计乘以12) 分加权分合计指 导 教 师 签 名: 年 月 日评 阅 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分查阅文献查阅文献有一定广泛性;有综合归纳资料的能力0.25432工作量工作量饱满,难度适中。0.55432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.35432评阅教师评审成绩(加权分合计乘以8)分加权分合计评 阅 教 师 签 名: 年 月 日课 程 设 计 总 评 成 绩分中文摘要数字信号处理器(Digital Signal Processing,DSP)也称为DSP芯片,是一种用于进行数字信号处理运算的微处理器,其主要功能是实时快速地实现各种数字信号处理算法及各种复杂控制算法。有限冲激响应(FIR)滤波器是数字信号处理系统中最基本的元件,具有严格的线性相频特性,同时其单位抽样响应是有限长的,系统稳定。FIR滤波器的输出仅取决于现在的输入和有限个过去的输出,···,,而与过去的输出无关。长度N,输出为,输出为的FIR滤波器可用差分方程描述为:即输出序列为系统的冲激响应与输入信号的卷积。 在此次课程设计中设计了一个低通FIR滤波器。根据要求,选择布莱克曼窗实现滤波器的设计,运用正弦波与矩形波叠加后的波形作为输入波形,对它进行滤波,并通过观察频谱图来验证滤波的效果。通过Matlab仿真软件计算求得滤波器的阶数,最后通过实验仿真,从输入信号和输出信号的时域和频域曲线可看出在DSP上实现的滤波器能完成预定的滤波任务。关键词 DSP,数字信号处理,FIR滤波器,Matlab目 录中文摘要V目 录VI1 设计任务描述11.1设计题目:直流数字电压表程序设计11.2 设计要求11.2.1 设计目的11.2.2 基本要求11.2.3 发挥部分12、设计思路23、设计方框图34、系统软件流程45、主要程序设计及各部分功能介绍55.1数据采集卡NI-DAQ55.2交流参数测试及显示65.2.1电压的交流参数测试及显示65.3有关功率的计算与设计95.4档位选择105.5启停与日期获得区域106、仿真结果与数据显示126.1正弦波仿真结果与数据显示126.2三角波仿真结果与数据显示96.3 方波仿真结果与数据显示127、工作过程分析14小 结15致 谢16参考文献17附录一电路图181 设计任务描述1.1设计题目:FIR滤波器程序设计1.2 设计要求1.2.1 设计目的1)研究FIR滤波器原理以及利用DSP实现的方法。2)编写FIR滤波器的程序。3)调试程序,观察结果。1.2.2 基本要求1.2.3 发挥部分(1)输入正弦波进行滤波。(2)输入叠加后的波进行滤波。 2、设计思路本次DSP控制器原理与应用课程设计中,我的题目是FIR滤波器程序的设计,即利用DSP的仿真软件实现FIR滤波器的程序设计,并根据输入的不同波形进行仿真并观察仿真后的结果,同时检验结果是否正确课程设计的要求是设计FIR滤波器,从而实现对不同波形的滤波等功能,我利用所学的数字信号处理与DSP控制器原理与应用知识以及查找资料,在完成老师的要求下还进行了适当的发挥。我的设计思路大体分为以下几部分1) 查找相关资料对FIR滤波器进行深入的了解。FIR滤波器的单位脉冲响应有限长,系统不存在非稳定现象。我们总能用因果稳定系统来实现,FIR滤波器主要的不足在于其较好的性能是以较高的阶数为代价换来的,对于相同的设计指标FIR滤波器所要求的阶数比IIR滤波器高2-3倍信号延迟偏大,因此,在保证相同性能的前提下,尽量降低其阶数是FIR数字滤波器设计的目标之一。2) 通过Matlab仿真软件,并根据要求,求得FIR滤波器各阶的系数。3) 对输入信号进行设计与编程。对滤波器部分进行程序编程,由于此次课程设计中书上已经给出了源程序,所以这部分就变的容易了很多。4) 将输入信号部分程序与滤波器部分进行结合,并调试程序,进行软件仿真,通过曲线的时域与频域的曲线图观察结果是否正确。 通过一周的努力与学习我最终比较圆满的结束了DSP控制器原理与应用的课设,我的设计在满足老师要求的基础上还进行了适当的发挥。3、FIR滤波器的各部分程序设计与思路3.1 FIR滤波器设h(n),n=0,1,2 N-1为滤波器的冲激响应,输入信号为x(n),则FIR滤波器就是要实现下列差分方程:式中,y(n)为输出信号,即经过滤波之后的信号;N为滤波器阶数。FIR滤波器的最主要特点是没有反馈回路,因此是无条件稳定系统,其单位脉冲响应h(n)是一个有限长序列。由式(1)可见,FIR滤波算法实际上是一种乘法累加运算,不断地输入样本x(n),经延时(z-1)做乘法累加,再输出滤波结果y(n)。对式(1)进行Z变换,整理后可得FIR滤波器的传递函数为:图3-1所示为FIR滤波器的一般结构:图3-1 FIR滤波器结构图FIR滤波器的主要特点是没有反馈回路,因此它是无条件稳定系统。它的单位脉冲响应h(n)是一个有限长序列。如果h(n)是实数,且满足偶对称或奇对称的条件,即h(n)=h(N-1-n)或h(n)=-h(N-1-n)。则滤波器具有线性相位特性。偶对称线性相位FIR滤波器(N为偶数)的差分反方程表达式为:线性相位FIR滤波器是用得最多的FIR滤波器。有上式可知,FIR滤波器算法实际上是一种乘法累加运算。它不断地输入样本,经过延时(),做乘法累加,再输出滤波结果.3.2 Matlab实现的滤波器阶数计算MATLAB是美国Mathworks公司与1967年推出的软件包,它是一个功能强、效率高、便进行科学计算和工程计算的交互式软件包,其中包括:一般数值分析、矩阵运算、数字信号处理、建模和系统控制、优化等应用程序。同时MATLAB提供了相应的子程序来实现窗函数,例如:wd=boxcar(N)数组wd中返回N点矩形窗函数wd=triang(N)数组wd中返回N点三角窗函数wd_hanning(N)数组wd中返回N点汉宁窗函数wd=hamming(N)数组wd中返回N点哈明窗函数wd=blackman(N)数组wd中返回N点布莱克曼窗函数wd=kaiserfN,beta)数组wd中返回给定beta值时N点凯泽窗函数 根据课设要求,选择布莱克曼窗,其Matlab程序设计如下:3.3 FIR滤波器的DSP实现仿真器xDS即扩展开发系统,可用来进行系统级的集成调试,是进行DsP芯片软硬件开发的最佳工具。目前主要有两种类型的仿真器:一种是传统的电路仿真器,主要用于早期的IMs320Clx及TMs320c2x两代DSP芯片的仿真。TMS320C54x片内没有I/O资源,CPU通过外部译码可以寻址64KW的I/O单元。有两条指令可以实现输入和输出:PORTR PA,Smem ;Smem=PAPORTW Smem,PA ;PA=Smem这两条指令至少要2个字和2个机器周期。如果I/O设备是慢速器件,则需要插入等待状态。此外,当利用长偏移间接寻址或绝对寻址Smen时,还要增加1个字或1个机器周期。3.4 FIR滤波器的整体设计(1)首先要根据设计要求,即根据FIR滤波器要求的频率响应函数,经过傅里叶变换得到,如果要求的滤波器的频率响应存在过渡带,则设计中所使用的截止频率由通带频率和阻带频率按下式求出。(2)选择合适的窗函数,根据所允许的过渡带宽,估计序列的长度N。(3)利用MATLAB中的提供的一个子程序叫做firl,其标准格式为:求滤波器的系数。其中: b为待设计的滤波器系数向量,其长度为N=M+1; M为所选的滤波器阶数;type为滤波器的类型,如高通、带通、带阻等,缺省时为低通;Window为选定的窗函数类型,缺省时为hamming窗。(4)编写程序实现FIR滤波器。4、程序流程图的设计编写主程序定义变量与函数申明初始化数据开始判断采样点数是否达到 N Y结束输出波形5、各部分程序设计与介绍5.1输入信号正弦波作为典型的信号正弦波信号其频谱图具有明显的特点:其频谱图只在信号的频率上有幅值,但是由于获得的正弦信号是经过采样后的数字信号获得,因此得到的正弦波信号存在干扰信号,并不是严格意义上的正弦波信号,因此得到的频谱图带有拖尾。其仿真图形如下:其程序设计如下:float inputsin(void) int rq; for(rq=K;rq>0;rq-) fxnsrq=fxnsrq-1; fxns0=sin(pi*300*ii/K*3)*4096; ii+; if(ii>K)ii=0; return(fxns0); 此次设计中把正弦信号作为频率较大的干扰信号,其频率为450HZ,是矩形波信号的几十倍,作为干扰信号与主波信号进行叠加后,被滤波器滤除后,仅剩有主波信号即矩形波信号的频谱图。5.2 输入主波信号矩形波 矩形波信号作为输入信号的主波,其频率要远远小于正弦波信号的频率,才可以保证经过低通滤波器后仅保留下矩形波的信号,通过其频谱图可以明显的发现最后正弦波信号被滤除。矩形波的图形如下:其程序设计如下:float inputwave(void) for(i=n-1;i>0;i-) fxni=fxni-1; fxn0=sin(fsignial1)+cos(fsignial2)/6.0; fsignial1+=fstepsignial1; if(fsignial1>=f2pi) fsignial1-=f2pi; fsignial2+=fstepsignial2; if(fsignial2>=f2pi) fsignial2-=f2pi; return(fxn0); 矩形波信号可以看作是无数个正弦波信号与余弦波信号叠加而成的通过计算确定其各项的系数,最后得到的矩形波信号的频率为30HZ左右,可以明显看出其频率远远小于正弦波信号的频率。5.3 滤波器程序设计与整体分析 根据课设的要求选择布莱克曼窗,由截止频率等已知的一些条件可以求得窗系数的长度为25,用Matlab仿真软件求得滤波器的差分方程的系数为fhnn= 0.0,0.0,-0.002,-0.002,0.01,-0.009,-0.018,-0.049,-0.02,0.11,0.28,0.64,0.28,-0.11,-0.02,0.049,-0.018,-0.009,0.01,-0.002,-0.002,0.001,0.0,0.0 输入的正弦波信号与矩形波信号叠加的信号经过滤波器后仅保留下矩形波信号,正弦波信号作为干扰信号被滤除。 经过滤波器后信号的频谱图为: 其程序设计如下:float fir() float fsum; fsum=0; for(i=0;i<n;i+) fxns2i=fxni+fxnsi; fsum+=(fxns2i*fhni); return(fsum);在频域中的乘积形式反映到时域为卷积的形式,把卷积形式展开为各项系数相乘后在求和的形式,在设计和实现上F1R滤波器具有如下优越性:(1)相位响应可为严格的线性,因此它不存在延迟失真,只有固定的时间延迟。(2)由于不存在稳定性问题,所以设计相对简单。(3)只包含实数算法,不涉及复数算法,不需要递推运算,长度为M的滤波器(阶数为M1),它的计算值约为M2。7、工作过程分析 我此次课程设计的题目是FIR滤波器程序的设计,其整体程序运行过程如下:1) 定义函数头文件,进行未知量定义与函数申明,以及初始化等;2) 主函数的编写,包含初始化与主要函数的调用,在采样点数内对输入与输出波形进行采样,并输出需要的波形包括:正弦波,矩形波,叠加后的波形,调用滤波器函数后的波形等;3) 输入波形正弦函数的编写,包含设置正弦波的频率、幅值、相位等;4) 输入波形矩形波函数的程序运行,多个正弦与余弦函数的叠加;5) 输入波形经过滤波器进行滤波滤除不需要的正弦波的干扰信号,观察最后得到的波形的频谱图,验证滤波器的性能指标。在数字滤波器中,FIR滤波器具有如下几个优点: (1)可以在幅度特性随意设计的同时保证精确严格的线性相位; (2)由于FIR滤波器的单位脉冲h(n)是有限长序列,因此FIR滤波器没有不稳定的问题; (3)由于FIR滤波器一般为非递归结构,因此在有限精度运算下,不会出现递归型结构中的极限震荡等不稳定现象,误差较小; (4) FIR滤波器可采用FFT算法实现,从而提高运算效率。小 结此次DSP课程设计只有短短的一周,时间虽然很短暂但是却学到了很多知识。我此次课程设计的题目是FIR滤波器程序设计,这一周让我对滤波器有了一个全新与深入的了解,使我不仅提高了DSP编程与调试能力,还使我的信号处理知识得到了提高。刚开始课程设计时,老师就告诉我们此次题目全是书本上的。所以,刚开始的时候我以为这次课设一定很简单,可是当我真正的着手开始做的时候发现一切都不是我想的那么简单。当把程序敲好开始调试时就发现了错误经过反复调试后,改正了错误,但是老师说要想很好的验证结果最好对正弦波进行滤波,也就是说书上的程序根本行不通,但这个时候其他组的同学已经做好了,我心里十分着急,既害怕自己做不出来,又存在一个侥幸心理,希望别的同学做出来后自己可以参考一下,但是最终我决定一定要自己做出来,在老师的帮助与同学们的互助下,完成了要求。在此次课程设计中我遇到的主要问题是输入信号的提取,刚开始时由于采样点数与频率的不匹配导致输入的正弦信号严重失真,通过多次计算与修正,最终输入信号比较理想,但是当我把它与矩形波信号进行叠加时,又出现了新的问题,输出结果滤波很不明显,最后在老师的帮助下发现是两个信号的频率太接近,我通过改变其中一个信号的频率来观察输出结果,最终找到了适合的信号频率,输出结果也比较理想与明显。在此次课程设计中用到了多方面的知识,首先是数字信号处理的相关知识来理解FIR滤波器并进行相关参数的计算,用Matlab仿真软件进行仿真求得滤波系数,运用DSP知识与思想以及仿真软件进行结果验证等,使我的各个方面的知识都得到了很好的提高。任何事情都没有自己想象的那么难,只要我们肯认真对待,任何问题都可以解决,这次课程设计还使我明白一个道理只有靠自己努力获得的成功才是真正意义上的成功,自己才会获得真正的成功的喜悦。致 谢短暂的课程设计就要结束了,经过一周紧张而充实的努力,我终于顺利完成了设计任务,收获了成功的喜悦。回顾这一周的设计过程,从开始的毫无头绪,逐渐的进入状态,到后来的整体设计,一起解决一个个难题,突破一重重的阻碍,当调试结果出来时,我兴奋的无法形容,从未有过的成就感充满了我的内心。我想这就是课程设计的魅力所在吧。任务越是难以完成,过程越是复杂艰难,成功那一刻的喜悦和成就感就越大,与那一刻相比,之前的所有努力都是值得的。“天下无难事,只怕有心人”经过这次课程设计,我对这句古语有了更深的理解。在设计过程中,我遇到了很多困难,用所学的知识达不到想要的结果,经过各种方式搜集资料,同学们在一起探讨、研究、共同调试程序,逐个排查错误原因,解决问题,终于成功的将错误全部找出。达到能够实现所要求的功能的目的。这次DSP课程设计重点是理论与实际的相结合,不单单只是书上的知识。通过这次设计让我更系统的了解了DSP的应用以及相关知识。学会了新的知识,同时也知道了就我现在所知道的知识要灵活设计出方案是远远不够的,有待于更努力的学好课本知识以及好好锻炼自己的综合考虑问题的能力。经过这次课程设计我对以前学过的知识有了更深的理解,明白了所学知识在实际应用中的作用及功能,使我对DSP的兴趣更加浓厚,为今后学习更深层的知识打下坚实的基础。 非常感谢吕老师对我们的耐心指导。不管我们问多少问题,您都耐心地为我们一一解答,不厌其烦的帮我们查看程序,为我们解答难题,纠正我们的错误,如果没有老师的帮助与鼓励,我们是不可能顺利完成这次课程设计的。我们发自内心的感谢老师,是您在我们遇到问题时给予了指导,谢谢您老师!您辛苦了!参考文献1 张东亮.DSP控制器原理与应用.北京:机械工业出版社,2011年 2 支长义,程志平,陈书立,刘晓兰.DSP原理及其开发运用.北京:北京航空航天大学出版社,2006.83 张长森.数字信号处理.北京:中国电力出版社,2007年4 纪震,钟锦春,强乐.DSP系统入门与实践.北京:电子工业出版社,2006.35 祁才君.数字信号处理技术的算法分析与应用.北京:机械工业出版社,2005.7附录一程序清单#include"math.h"#define n 25#define pi 3.1415926#define K 128float inputwave(void);float inputsin(void);float fir(void);float fhnn=0.0,0.0,-0.002,-0.002,0.01,-0.009, -0.018,-0.049,-0.02,0.11,0.28,0.64, 0.28,-0.11,-0.02,0.049,-0.018,-0.009, 0.01,-0.002,-0.002,0.001,0.0,0.0; /截止频率为16000Hzfloat fxnn=0;int finput,foutput;float fsignial1,fsignial2;float fstepsignial1,fstepsignial2;int fxnsK=0;float fxns2n=0;float f2pi;int i=0;int ii=0;int fin256=0,fout256=0,fin1256=0;int nin,nout;main(void) nin=0;nout=0; f2pi=2*pi; fsignial1=0.0; fsignial2=pi*0.1; fstepsignial1=2*pi/30; fstepsignial2=2*pi*1.4; while(1) finput=inputwave(); finnin=inputsin(); fin1nin=finput; nin+;nin%=256; foutput=fir(); foutnout=foutput; nout+; if(nout>=256) nout=0; float inputwave(void) for(i=n-1;i>0;i-) fxni=fxni-1; fxn0=sin(fsignial1)+cos(fsignial2)/6.0; fsignial1+=fstepsignial1; if(fsignial1>=f2pi) fsignial1-=f2pi; fsignial2+=fstepsignial2; if(fsignial2>=f2pi) fsignial2-=f2pi; return(fxn0);float fir() float fsum; fsum=0; for(i=0;i<n;i+) fxns2i=fxni+fxnsi; fsum+=(fxns2i*fhni); return(fsum);float inputsin(void) int rq; for(rq=K;rq>0;rq-) fxnsrq=fxnsrq-1; fxns0=sin(pi*300*ii/K*3)*4096; ii+; if(ii>K)ii=0; return(fxns0);