#在dsp上实现fir数字滤波器.docx
- 文档编号:30719578
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:23
- 大小:483.67KB
#在dsp上实现fir数字滤波器.docx
《#在dsp上实现fir数字滤波器.docx》由会员分享,可在线阅读,更多相关《#在dsp上实现fir数字滤波器.docx(23页珍藏版)》请在冰豆网上搜索。
#在dsp上实现fir数字滤波器
DSP
课
程
设
计
学院:
昆仑学院
班级:
10级电气<2)班
姓名:
柴智博
FIR数字滤波器的MATLAB设计与DSP实现
摘要:
针对有限长冲激响应(FIR>数字滤波器的原理,讨论了窗函数法设计线性相位FIR数字滤波器的基本思路,介绍了用MATLAB工具来设计数字滤波器的方法及在定点DSP上的实现。
通过CCS5000开发工具和在DES3200实验箱上运行,实现了达到目标要求的滤波器。
关键词:
matlab;fir;dsp;ccs开发环境
1、引言
随着信息和数字技术的发展,数字信号处理已成为当今极其重要的学科和技术领域之一通信语音、图像、自动控制、雷达、军事、航空航天、医疗和家用电器等众多领域得到了广泛的应用。
在数字信号处理的基本方法中,通常会涉及到变换、滤波、频谱分析、调制解调和编码解码等处理。
其中,滤波是应用非常广泛的一个环节,数字滤波器的理论与相关设计也一直都是人们研究的重点之一。
数字滤波器根据其冲激响应函数的时域特性,可分为无限长冲激响应(IIR>滤波器和有限长冲激响应(FIR>滤波器。
其中FIR滤波器具有严格的相位特性,同时系统函数的极点固定在原点上,因而该类型的滤波器是稳定的。
滤波器的设计方法主要有窗函数法、频率取样法和最优线性相位设计法。
其中窗函数设计方法因为其运算简便、物理意义直观,已成为项目实际中应用最广泛的方法,本文从FIR数字滤波器的原理与基本设计步骤出发,对FIR数字滤波器在MATLAB中的仿真与设计的基本思路做了阐述,并在定点DSP上实现了满足要求的FIR滤波器。
1、滤波器基本原理3
1.1数字滤波器的基本概念3
1.2FIR滤波器的基本结构31.2FIR滤波器的基本结构3
1.3FIR滤波器的主要特点4
1.4开发环境CCS简介4
2、数字滤波器的设计6
2.1数字滤波器matlab设计的基本步骤6
2.2FIR数字滤波器的DSP实现8
2.3结论9
3.心得体会10
4.附录10
参考文献16
1、滤波器基本原理
1.1数字滤波器的基本概念
数字滤波器的设计问题就是寻找一组系数和,使得其性能在某种意义上逼近所要求的特性。
如果在s平面上去逼近,就得到模拟滤波器,如果在z平面上去逼近,则得到数字滤波器。
数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变系统的输出序列y(n>和输入序列x(n>之间的关系,应满足常系数线性差分方程:
其中x(n>为输入序列,y(n>为输出序列,和为滤波器系数,N为滤波器的阶数。
1.2FIR滤波器的基本结构
在式<1)中,若所有的均为0,则得FIR滤波器的差分方程:
对<2)式是滤波器的差分方程,其一般形式为
对(3>式进行变换,整理后可得FIR滤波器的传递函数
FIR数字滤波器的设计方法主要有窗函数法和频率抽样设计法,其中窗函数法是基本而有效的计方法。
由此可得到FIR滤波器的结构如图1所示。
FIR滤波器的单位冲击响应h(n>是一个有限长序列。
若h(n>为实数,且满足偶对称或奇对称的条件,即h(n>=h(N-1-n>或h(n>=-h(N-1-n>,则FIR滤波器具有线性相位特性。
1.3、FIR滤波器的主要特点
1)单位冲击响应只有有限项;
2)FIR滤波器无反馈回路,是一种无条件稳定系统;
3)FIR滤波器可以设计成具有线性相位特性。
1.4、开发环境CCS简介
CCS是TI公司推出的为开发TMS320系列DSP软件的集成开发环境(IDE>。
CCS工作在Windows操作系统下类似于vc++的集成开发环境采用图形接口界面提供编辑工具和项目管理工具的软件。
CCS开发流程图如图所示
图2开发流程
对于CCS的使用先应建立项目文件*.mak根据需要添加C语言源程序*.c汇编源程序*.asm链配置件文件*.cmd等可能需要的文件完成整个项目的建立然后对源文件编辑修改后进行汇编连接以生成目标文件*.out。
对源文件每作一次修改都必须全部重新建立生成新的目标文件*.out接下来就可用CCS调试先让系统复位再载入*.out。
调试的方式是多种多样的有单步执行多步执行单步跳出单步进入等还有断点设置和探测点设置
在CCS环境下实现FIR滤波器的程序框图如图所示
否
是
图3用循环寻址的方法FIR实现滤波器的程序框图
从图3可知FIR滤波器DS实现包括4个部分:
模拟输入数据的生成DSP初始化程序滤波系数以及输入数据的调入及滤波子程序其中模拟输入数据的生成可利用C语言编程实现用.COPY汇编命令将生成的数据文件拷贝到汇编程序中作为FIR滤波器的输入数据文中C语言程序运行后所生成的数据文件名为初始化程序包括了对堆栈指针(SP>软件等待状态寄存器(SWWSR>中断寄存器(IFR>中断屏蔽寄存器(IMR>以及处理器工作状态寄存器(PMST>的初始化另外还对各变量赋值因为滤波器系数一开始是存在程序存储器中输入数据则是存在程序外的文件中程序对这两组数据进行处理时需要把两者都调到数据存储器中这是滤波系数以及输入数据的调入部分的任务滤波子程序重复执行的次数一般等同于输入序列的长度实现对数据的读入处理输出等功能。
2、数字滤波器的设计
2.1数字滤波器matlab设计的基本步骤
(1>确定指标
在设计一个滤波器之前,必须首先根据项目实际需要确定滤波器的技术指标。
在很多实际应用中,数字滤波器常常被用来实现选频操作。
因此,指标的形式一般在频域中给出幅度响应和相位响应。
幅度指标主要以两种方式给出。
第一是绝对指标,它提供对幅度响应函数的要求,一般应用于FIR滤波器的设计。
第二种指标是相对指标。
它以分贝值的形式给出要求,在项目实际中,比较受到欢迎。
对于相位响应指标形式,通常希望系统在通频带中仍然有线性相位。
运用线性相位响应的指标进行滤波器设计具有如下优点①只包含实数算法,不涉及复数运算②不存在延迟失真,只有固定数量的延迟③长度为N的滤波器(阶数为N-1>,计算量为N/2数量级。
(2>逼近
确定了技术指标后,就可以建立一个目标的数字滤波器模型。
通常采用理想的数字滤波器模型。
之后,利用数字滤波器的设计方法,设计出一个实际滤波器模型来逼近给定的目标。
(3>性能分析和计算机仿真
上两步的结果是得到以差分或系统函数或冲激响应描述的滤波器。
根据这个描述就可以分析其频率特性和相位特性,以验证设计结果是否满足指标要求,或者利用计算机仿真实现设计的滤波器,再分析滤波结果来判断。
(4>窗函数法设计FIR滤波器的MATLAB仿真
matlab是一套用于科学计算的可视化高性能语言与软件环境。
它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个界面友好的用户环境。
它的信号处理工具箱包含了各种经典的和现代的数字信号处理技术,是一个优秀的算法研究与辅助设计的工具对于线性相位FIR滤波器通常采用窗函数法设计。
窗函数设计滤波器的基本思想(1>,就是从时域出发,把理想的无限长的hd(n>用一定形状的窗函数截取成有限长的h(n>,以此h(n>来逼近hd(n>,从而使所得到的频率响应与所要求的理想频率响应相接近。
理想的数字滤波器Hd(>频率特性是无法实现的,
FIR的设计就是要寻找一个可以得到的频率特性来逼近Hd(,这相当于用一个可实现的单位脉冲响应h(n>去逼近一个理想单位脉冲响应hd(n>。
要想用一个有限长的因果序列去逼近它,最简单的方法是截取n从0~N-1的一段来表示它,即h(n>=hd(n>(0≤n≤N-1>。
当n为其他的数时,h(n>=0。
同时,为了保证线性相位,还要满足偶对称:
h(n>=h(N-1-n>,这就好像通过一个窗口观看到一段hd(n>,因此h(n>就表示成hd(n>和一个“窗口函数”的乘积。
这样,对h(n>的求解就变为:
这里的W(n>就称为窗口函数。
窗口函数相当于对hd(n>在时域上截取一段,势必造成频域的矩形窗口的失真,结果就是截取出的信号也相应失真。
为了补偿这种失真,只有改变原来窗口的形状,修正经过时域截取后的窗口失真。
改善窗口函数的标准:
<1)尽量减少窗口频谱的旁瓣,使能量集中在主瓣中,以减少波动的幅度和次数,提高阻带衰减。
这样,主瓣就不能太窄;<2)主瓣的宽度应尽量窄,以得到尽量窄的过渡带。
项目中常用的窗函数有以下六种<2):
矩形窗,三角形窗 表1为六种窗函数的性能指标。 图1和图2分别为64点的矩形窗函数的时频特性曲线和64的三角窗函数的时频特性曲线。 计算出64点的矩形窗函数并利用wvtool函数绘制出其时频特性。 程序如下: N=64。 y=rectwin(N>。 wvtool(y>。 图4矩形窗函数时域和频域特性 计算出点的三角窗函数并利用函数wvtool绘制出其时频特性程序如下: N=64。 y=triang(N>。 Wvtool(y>。 图5三角窗函数时域、频域特性 比如设计一个低通数字滤波器,采样频率Fs=8000HZ,要求: 通带范围: 0~1000HZ。 带内波动: 5%。 阻带范围: 1500HZ~4000HZ。 带内最小衰减: Rs=40dB。 采用Kasier窗进行设计,程序如下: Fs=8000。 Fctus=[10001500]。 Mags[10]。 Devs=[0.050.01]。 %给定频率点上幅度允许波动值 利用Kaiser窗设计FIR滤波器前,需要先用函数kaiserord记进行有关参数计算 [n,Wn,deta,ftype]=Kaiserord(fcuts,mags,devs,Fs>。 H=fir1(n,Wn,ftype,Kaiser(n+1,deta>>。 Freqz(h>。 2.2FIR数字滤波器的DSP实现 数字滤波器的实现方法一般有以下几种: 用加法器、乘法器、延时器设计专用的滤波电路。 在通用计算机系统中加上专用的加速处理机设计实现。 用通用的可编程DSP芯片实现。 用专用的DSP芯片实现在一些特殊的场合要求的信号处理速度极高,用通用DSP芯片很难实现。 这种芯片将相应的滤波算法在芯片内部用硬件实现,无需进行编程。 采用FPGA/CPLD设计实现。 在上述几种方法中,第②种方法的缺点是速度较慢,一般可用于DSP算法的模拟。 第①、④种方法专用性强,应用受到很大的限制。 第③、⑤种方法都可以通过编程来实现各种数字滤波,但是,第③种因有专用的指令来实现滤波运算编程实现容易,而第⑤种方法编程实现较为困难,因此,本文选用了可编程DSP芯片来实现。 DSP是一种实时、快速、特别适合于实现各种数字信号处理运算的微处理器。 因为它由具有丰富的硬件资源、改进的哈佛结构、高速数据处理能力和强大的指令系统,而在通信、航空、航天、雷达、工业控制、网络及家用电器等各个领域得到广泛应用。 在滤波器的实现方面,定点DSP芯片显示出强大的优势,比较合适于滤波器的实现,本文选用含TMS320C5402的实验箱作为硬件平台。 下图为FIR滤波器DSP实现的电路方框图,其核心部分为TI公司生产的DSP芯片TMS320C5402,EP2ROM和RAM是其外围电路。 DSP送给A/D抽样时钟,对输入的模拟信号抽样,即将模拟信号转换成数字信号,然后读取每一次的抽样值,并对抽样值进行卷积运算 INOUT 图6 电路框图 FIR滤波器程序设计的具体流程如下先对主程序进行初始化,包括数据段的初始化和数据缓冲区的清零等,再将从A/D获得的采样点样值送到数据缓冲区中,执行FIR滤波程序,最后将滤波结果输出。 同时,在CCS的图形显示界面中显示出输人波形与输出波形。 滤波器算法在TMS320C5416开发板上可用汇编,也可用C语言实现。 但汇编执行效率高。 (实现FIR滤波器功能的程序见附录> 汇编程序调试可先在CCS中建立新的项目fir.pjt,再将汇编语言源文件(asm或c>文件及中断向文件(.asm>、位文件(.cmd>添加到项目中。 若为C语言程序则还需添加“stdio.h”、“math.h”,“rts.lib”编译后生成.out文件,可下载到基于DES3200的系统板上。 编译并将整个FIR项目成功地下载到目标系统板后,程序就可以在所设计的目标板上运行。 实际在CCS中通过加人时域内一个低频正弦波与一个高频正弦波的叠加输人波形信号,对所设计的数字滤波器进行仿真,高频部分被滤除,其输人及结果见图4和图5。 仿真结果表明,高频部分被滤除,达到设计要求。 图7低频正弦波与高频正弦波的叠加 图8通过低频滤波器后的波形 2.3结论 用MATLAB语言可方便、快捷地设计具有严格线性相位的FIR系统,且参数的修改也十分方便,用DSP芯片实现低通FIR数字滤波。 除了具有准确度高、不受环境影响等优点外,因为DSP芯片具有可编程特性。 程序的可移植性好,具有较好的灵活性.在实际应用串,其需按要求修改摅渡器参数,并对程序作较少的 改动,即可实现不同截止频率的低通Fm滤波器,实用性较强。 三、心得体会 从复习课本,再到复习实验,相互探讨编程思路,上网搜索资料,调试实验等,我们都在努力的自学着。 通过这次FIR滤波器的设计,我们都有不同程度的收获。 首先,是学习上的巩固。 一方面,通过复习课本和实验,对DSP的基础知识又有了很大的巩固。 其次,通过对用Mathlab实现FIR滤波器的设计,熟悉了matlab软件的一些相关的窗口函数以及相关功能的调用,如怎样实现窗函数的调用,怎样实现滤波,等等。 第二,增进了与同学的交流。 平常除了上课,大家也比较少接触。 而每次做课程设计的时候,大家总会互相探讨,发表自己的看法,帮忙解决遇到的问题,分享自己的心得,于是交流也就不由自主的变得相对频繁些了,感觉也就更亲切了。 第三,对FIR的滤波器性能和作用有了更深一层的了解。 FIR滤波器的应用十分广泛,当今许多信号处理系统和图像处理系统等都要求信号具有线性相位特性。 在这方面,FIR滤波器有十分独特的优点,运用mathlab语言,我们能够很容易的设计出具有严格线性相位的FIR滤波系统,以及比较容易的实现。 此外,我们还知道了FIR滤波器是永远稳定的,因为FIR滤波器的冲激响应是有限长序列,其系统函数为一个多项式,它所含的的极点多为原点。 四、附录 实验汇编程序 .title"testvc5402'bootloader..." .def_c_int00 .mmregs gpiocr.set3ch gpiosr.set3dh dxr10.set23h drr10.set21h spsa0.set38h spcr10.set39h dxr11.set43h spsa1.set48h spcr11.set49h swcr.set2bh timer_count.set060h new_ad.set064h out_wave_ptr.set065h t_ar2.set066h temp.set068h wave_buf.set0900h out_wave_buf.set01000h N.set38。 FIRtaps fir_coef_buf.set100h。 FIRcoefbuffer fir_data.set200h。 FIRwindowsdatabuffer! .text 。 -------------------------------------------------------------------- 。 interruptevectortable! 。 -------------------------------------------------------------------- rsb_c_int00 nop nmib__ret nop sint17b__ret nop int0b__ret nop tintbtimer nop brint0breceive nop bxint0bdtransmit trintb__ret int3b__ret hpintb__ret q26.word0ff80h 。 -------------------------------------------------------------------------- 。 endofinterruptevectortable! 。 ------------------------------------------------------------------------- _c_int00: stm#2020h,pmst。 vectortablestart: 0x2000 ssbxintm。 closeallint! (ssbxintm> ssbxsxm。 extendsign! ssbxfrct。 factionmultiply stm#10h,26h。 stopTIMER0! stm#0ffh,sp。 sp=0x0ff ld#0,dp。 dp=0 stm#0ffffh,ifr。 clearallint! 。 /*------------------------------------------------------------------------ 。 Thefollowingcodesswitchto90MHzclock! 。 -------------------------------------------------------------------------*/ stm#0,58h wait_pll: ldm58h,a and#1,a bcwait_pll,aneq stm#87ffh,58h。 switchpll*9->90Mclk rpt#1000 nop 。 *********************************************************************** 。 initalizeRAM,Variable.... 。 *********************************************************************** stm#wave_buf,ar6 stm#1,ar0 rpt#24 mvpdwave_data,*ar6+0。 movewavedatatowave_buf->0x6000h stm#wave_buf,wave_ptr。 savewavebuffer'ptr stm#out_wave_buf,out_wave_ptr。 saveoutwavebuffer'ptr,becauseuse 。 circularaddress,sowhensaveout_wave 。 date,must++! stm#fir_coef_buf,ar6 rpt#N-1 mvpdfir_coef,*ar6+。 movefircoeftofir_coef_buf(indatamem> stm#fir_coef_buf,t_ar2。 stm#fir_data,t_ar3 ld*ar0,t 。 ****************************************************************** 。 ThefollowingcodesareusedtoinitalizeMcBSP0! 。 ****************************************************************** stm#0,spsa0。 chooseSPCR10 stm#2000h,spcr10。 receivesign_extendinDR stm#00h,dxr10 ldm22h,a stm#1,38h stm#0c1h,39h。 startMcBSP0send! ld#603h,a rsbxintm。 enableallint! 。 ---------------------------------------------------------------------- 。 ThefollowingcodesareinitalizedAC01,ALLAC01setupsame! 。 ---------------------------------------------------------------------- idle1 idle1。 resettwoAC01bysoftware! ld#600h,a idle1。 waitforint..... ld#3,a idle1。 send#3 ld#00105h,a。 fs=10M/2/A/B=25k 。 flp=10M/2/40/A=25k(allpass> 。 fhp=fs/200=125Hz(notuse! > 。 A=05,B=40(0x28> idle1。 send1thregs->05h ld#3,a idle1。 send#3 ld#800h,a idle1。 send8thregs->0 ld#0h,a stm#0,38h stm#2001h,39h。 startMCbsp0receive! stm#30h,imr。 bit5->BXINT0,bit4->BRINT0,enableBXINT0 。 ****************************************************************** 。 ThefollowingcodesareusedtoinitalizeTIMER! 。 ****************************************************************** stm#10h,tcr。 stopTIMER! bitfis_new_data,#1。 testis_new_data==1? ccfir,tc。 ==1,thencallfir! newADdatainnew_ad(0x64> bagain 。 ********************************************************************* 。 Thefollowingcodesareserivedfo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dsp 实现 fir 数字滤波器