南理工DSP应用技术实验四.docx
- 文档编号:4285053
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:17
- 大小:5.31MB
南理工DSP应用技术实验四.docx
《南理工DSP应用技术实验四.docx》由会员分享,可在线阅读,更多相关《南理工DSP应用技术实验四.docx(17页珍藏版)》请在冰豆网上搜索。
南理工DSP应用技术实验四
DSP应用技术
实验报告<四>
题目:
DSP应用技术实验报告
院系:
电子工程与光电技术学院
姓名(学号):
***********************************
实验日期:
2015年12月11号
实验四FIR滤波器的DSP实现
一、实验目的
1.巩固数字FIR滤波器的概念
2.理解定点DSP中数的定标、有限字长、溢出等概念
3.理解算法实现中实时的概念
4.掌握DSP开发过程以及基本调试方法
5.理解汇编以及高级语言开发DSP实现算法的区别
二、实验仪器
计算机,C2000DSP教学实验箱,XDS510USB仿真器,示波器,信号源
三、实验内容
针对FIR算法,设计滤波器系数,完成数据的定标,查看滤波器特性曲线。
建立工程,编写DSP的主程序,并对工程进行编译、链接,利用现有DSP平台实现FIR滤波器算法,通过信号源、示波器理解滤波器特性,验证实现与理论设计的一致性。
四、实验准备
1、实验流程
实验之前首先必须对FIR滤波器的设计、实现算法有所了解,必要时通过计算机算法仿真,理解FIR滤波器特性。
由于计算机仿真属于浮点运算,而TMS320F2812是定点DSP,因此需要针对所设计的FIR滤波器系数进行定标,随后对定标后的数据再次进行仿真,以验证定点实现的性能是否满足系统指标。
根据FIR滤波器算法,编写C源程序或者汇编程序,实现算法功能。
并验证DSP实现时算法的正确性以及精度的要求。
这种算法功能上的仿真可以利用CCS集成开发环境中数据IO来模拟信号的输入,完成验证算法精度与功能的正确。
验证了算法的功能正确之后,可以将程序下载到DSP上运行,观察现象。
更为重要的是,在硬件
平台上验证系统的实时性,以及评估资源的使用情况。
若满足实时性要求,则测试各项指标,应该与原理设计相吻合。
如果实现与理论不一致,则首先检查算法的实时性,以及资源使用是否冲突等原因,对程序进行优化后再次编译链接,重新验证直至正确。
算法的优化有时会贯穿于整个设计之中。
图4.1算法流程实现
2、程序流程
FIR滤波器算法属于典型的数据流处理方式,每到达一个新数据,就必须进行一次计算,更新输出。
因此,当一次采样完成之后,就可以进行FIR核心算法,并将计算结果输出给DAC。
因此,和DSP的数据采集实验类似,用DSP实现实时的FIR信号处理算法必须依赖于ADC、DSP以及DAC三大基本部件。
充分利用DSP片上ADC外设,实现模拟信号的采样,并由DSP完成FIR核心算法,由DSP2000实验箱中DAC1(AD768)来完成数字到模拟的还原。
在数据采集实验基础上,我们对程序流程稍加改动,就可实现完整数字FIR滤波器功能。
程序流程如图4.2所示。
图二FIR滤波器程序流程
3、FIR滤波器设计
数字滤波器用于完成信号的滤波处理功能,是用有限精度算法实现的离散时间非时变系统。
用DSP实现数字FIR滤波算法,具有稳定性强、精度高、实时性好、灵活性大、实现简单等优点。
有限长的单位冲击响应滤波器(FIR)差分方程可表示为:
其中,h是滤波器系数,x为输入的数字信号,y为FIR滤波器计算输出。
N为滤波器阶数。
由此可得,一个N阶的滤波器计算,需要N+1个滤波器系数,N+1个数字输入,每得到一个y值,需要N+1次乘法以及N次加法。
另外,N阶滤波器需要保存当前的N+1个输入信号数值,以及事先设计的N+1个滤波器系数。
滤波器系数的设计有很多方式,这里我们采用MATLAB软件来对FIR滤波器算法进行仿真并验证性能。
在MATLAB界面中,利用fir1命令来设计滤波器系数。
fir1的完整命令如下:
其中,n为滤波器阶数,Wn为归一化截止频率(这里的归一化指与采样频率一半进行归一化),Wn对应了在幅频曲线上-6dB点的频率数值,ftype为滤波器类型,可以是低通、带通、高通、带阻等形式。
window是使用的窗函数,可以是hamming、hanning、chebwin等形式。
h为产生的滤波器系数。
详细说明可在MATLAB中输入helpfir1或docfir1查看。
对产生的滤波器系数可以用
freqz命令查看幅频、相频特性曲线。
具体命令如下:
freqz(h),其中h为设计的滤波器系数。
当然也可以使用fvtool(h)命令,验证滤波器设计是否满足系统指标要求,例如通带范围、阻带衰减、过渡带宽度等。
4、DSP的算法实现
TMS320F2812是定点型DSP,存储器字长16bit,可进行32bit的运算。
而仿真计算中得到的数据大多是浮点型,因此将算法用定点DSP实现时,必须进行数据格式的定标。
比如对FIR滤波器系数的定标可以参照“实验10任意信号发生器”中介绍的方法来完成。
对系数定标后,还要进行仿真以验证性能。
另外,由于TMS320F2812的数据字长只有32bit,DAC1接受的字长为16bit,因此有限字长带来精度的损失。
更为重要的是当加法的结果超过16位表示范围时,数据产生了溢出,这是有限字长带来的第二个问题。
再者,数据的计算结果存放在32bit的寄存器中,但DAC却是16bit,取高位输出还是低位输出,还是取一个合适的范围,这是数据截取的问题。
因此在编写程序时,必须考虑定点数据的运算效应,由数据的动态范围来确定截取、定标等问题。
定点DSP内部一般有溢出保护功能,可以查看溢出标志位及时发现溢出现象,其次用溢出模式位来使ACC结果控制在最大值范围之内,以达到防止溢出引起精度严重恶化的目的。
具体的实现编程,可以采用C语言或者汇编语言。
C语言描述算法较为简单,在此不作详细叙述。
若用汇编语言实现,必须结合算法特点和汇编指令,充分利用片内多功能单元同时执行的特点,提高程序的执行效率,比如在TMS320F2812的汇编指令有XMACD指令,支持在单周期内完成数据的加、乘以及数据搬移功能,或者使用DMAC指令在单周期内实现双乘与双加运算。
采用不同的指令,必须辅以不同的数据编排方式,因此需要综合考虑选取最优的实现方案。
5、算法实时性测试
算法的实时性测试主要指该算法能否在规定的时间内完成FIR运算,规定时间在此是指采样周期。
FIR的运算必须在两次采样间隔内完成,否则会造成数据的丢失。
这是数据流处理的特点,数据的运算速度必须大于数据的更新速度。
在实验平台中,我们可以利用GPIO管脚来实测采样周期和算法执行时间。
添加程序,当程序进入断点时,将GPIO的某一个引脚输出置高,完成算法退出中断时再置低。
由此当全速执行程序时,测量该GPIO引脚上的周期,便是采样周期,高电平持续时间即为FIR滤波器算法执行时间,由此判断计算法实现是否实时。
TMS320F2812的通用数字输入输出引脚是复用的,即可以作为通用IO口使用,又可以作为外设引脚使用,这是由GPxMUX寄存器来控制切换。
如果是数字IO模式,方向控制寄存器GPxDIR用来配置引脚信号的传输方向,另外GPxDAT寄存器用来反映当前对应引脚的电平,GPxSET用来设置引脚的高电平(置高),GPxCLEAR寄存器用来设置引脚的低电平(清零),GPxTOGGLE寄存器用来反相引脚电平(取反)。
C2000实验箱中可用的GPIO口在“附录C3C2000DSP教学实验箱介绍”中有所介绍,下面以GPAIO为例简单介绍一下相关寄存器含义。
(1)通用IO口多路切换控制寄存器GPAMUX(地址@0x70C0)
如果GPAMUX.y位=0,则对应引脚配置为通用IO口;如果GPAMUX.y位=1,则对应引脚配置为专用功能外设口;
(2)通用IO口方向控制寄存器GPADIR(地址@0x70C1)
如果GPADIR.y位=0,则对应通用IO口配置为输入;
如果GPADIR.y位=1,则对应通用IO口配置为输出;
(3)通用IO数据寄存器GPADAT(地址@0x70E0)
这是一个可读可写的寄存器,读访问能返回当前输入IO引脚的信号电平状态,写操作能设置对应输出IO引脚的电平。
如果GPADAT.y位=0,则表示引脚为低电平;如果GPADAT.y位=1,则表示引脚为高电平;由于不同引脚读写的同时发生,引起冲突,所以一般不使用该寄存器改变输出引脚的电平,而使用下述GPASET、GPACLEAR、GPATOGGLE寄存器来解决。
(4)通用IO口置位寄存器GPASET(地址@0x70E1)
这是一个只写寄存器,读操作总是返回0。
如果GPASET.y位=0,则表示引脚没有变化;如果GPASET.y位=1,则表示引脚电平置高(前提是该端口作为输出);
(5)通用IO口清零寄存器GPACLEAR(地址@0x70E2)
这是一个只写寄存器,读操作总是返回0.如果GPACLEAR.y位=0,则表示引脚没有变化;如果GPACLEAR.y位=1,则表示引脚电平清零(前提是该端口作为输出);
(6)通用IO口反相寄存器GPATOGGLE(地址@0x70E3)
这是一个只写寄存器,读操作总是返回0.如果GPATOGGLE.y位=0,则表示引脚没有变化;如果GPATOGGLE.y位=1,则表示引脚电平反转(前提是该端口作为输出);
五、实验步骤
1.系数设计
利用MATLAB设计滤波器系数,并对系数进行数据定标,完成浮点到定点的转换。
分别作出两组系数的幅频、相频特性曲线,看是否满足设计要求。
2.设备检查
检查仿真器、C2000DSP实验箱、计算机之间的连接是否正确,打开计算机和实验箱电源。
3.启动集成开发环境
点击桌面CCS2(C2000)快捷方式,进入集成开发环境CCS。
4.建立工程
新建一个DSP工程,编辑源程序、配置命令等相关文件,并在工程中添加这些程序文件。
在上次实验程序的基础上加以修改,在中断程序内添加FIR算法模块,完成FIR算法程序。
设置GPIO的输出控制,使之能够完成算法执行时间测量的工作。
建立工程(build),若出错,则根据错误提示,修改源程序文件或者配置命令文件,直至编译链接正确,生成可执行的.out文件。
5.加载程序
在主菜单下,选择“File→LoadProgram”,将程序下载到DSP内部。
6.算法功能验证
在中断服务子程序恰当的地方,设置探针点,利用文件IO的方式,输入x数据(具体方法参见“实验9DSP开发基础实验”);在FIR算法结束处设置断点,验证FIR滤波器算法的正确性。
输入的数据可具有一定的特殊性,进行特例验证。
若计算结果不正确,则进行程序的调试。
调试关键在于现象重现、错误定位,可以利用各种调试手段,比如打开寄存器窗口、变量窗口等辅助手段,根据数值以及实验原理,查找错误原因,修改程序直至正确为止。
解决错误后,再重新恢复原错误程序,观察错误现象是否重现,以确定错误的唯一性。
7.算法实时性验证
去除程序中的探针点以及断点重新全速运行程序,测量采样频率以及FIR算法的核心执行时间,判断该系统是否实时。
若非实时,则优化程序,甚至修改滤波器系数,直至满足实时要求。
8.连接外部电路
打开信号源,产生一个合适频率(ADC的采样频率必须满足奈奎斯特采样定律)的正弦信号,信号幅度控制在±0.5V以内,验证后将信号通过INPUT1接口输入到DSP中。
打开示波器,将C2000实验箱中的OUT3接口输出到示波器上,并正确设置。
全速运行程序,调节信号源(正弦信号)的输出频率(正弦信号),记录各频点的示波器上输出幅度。
描点作图,与理论幅频特性曲线比较,分析是否满足设计要求。
六、数据、波形记录与分析
1、50阶带阻滤波器
图三50阶带阻滤波器幅频相频曲线(定标前)
图三50阶带阻滤波器幅频相频曲线(定标后)
二者除了在增益上有所差别外,波形几乎一致,说明定标后的系数满足要求。
用MATLAB生成N=50,归一化截止频率为[0.3,0.5]的带阻滤波器的系数,并用Q15定标,得到数据如下:
h={-67,-21,56,51,-13,0,22,-136,-236,132,554,199,-538,-471,114,0,-163,977,1628,-896,-3813,-1448,4413,4898,-1989,26265,-1989,4898,4413,-1448,-3813,-896,1628,977,-163,0,114,-471,-538,199,554,132,-236,-136,22,0,-13,51,56,-21,-67};
MATLAB程序如下:
h=fir1(50,[0.3,0.5],'stop');
h=h*2^15;
A=round(h);
freqz(A);
2、在程序中实现FIR滤波器功能,其中核心代码如下:
voidfilter()
{y=0;
for(j=0;j {y+=(int)x[j]*h[j]} } voidshift() {for(k=N-1;k>0;k--) {x[k]=x[k-1]; } } interruptvoidadc_isr(void) {EALLOW; GpioDataRegs.GPASET.all=0xFFFF; filter(); shift(); AdIndex=0; x[AdIndex]=(AdcRegs.ADCRESULT0>>4); *DA1OUT=(unsignedint)((y>>10)+0x8000); AdcRegs.ADCTRL2.bit.RST_SEQ1=1; AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; GpioDataRegs.GPACLEAR.all=0xFFFF; EDIS; } 3、调试程序,验证滤波器功能 输入信号为正弦信号时,改变正弦信号频率,观察示波器,记录各频点对应的幅度。 采样频率为: 27.91KHz 图四采样频率显示图 正弦信号频率为1KHz: 图五1KHz正弦信号频率通过FIR滤波器 正弦信号频率为2KHz: 图六2KHz正弦信号频率通过FIR滤波器 正弦信号频率为3KHz: 图七3KHz正弦信号频率通过FIR滤波器 正弦信号频率为4KHz: 图八4KHz正弦信号频率通过FIR滤波器 正弦信号频率为5KHz: 图八5KHz正弦信号频率通过FIR滤波器 正弦信号频率为6KHz: 图八6KHz正弦信号频率通过FIR滤波器 正弦信号频率为7KHz: 图九7KHz正弦信号频率通过FIR滤波器 正弦信号频率为8KHz: 图十8KHz正弦信号频率通过FIR滤波器 正弦信号频率为9KHz: 图十一9KHz正弦信号频率通过FIR滤波器 经过对不同频率下,电压的幅值衰减情况如下表: 信号频率(KHz) 电压峰峰值(V) 信号频率(KHz) 电压峰峰值(V) 1 7.36 2 7.28 3 7.36 4 0.36 5 0.71 6 0.36 7 7.44 8 7.28 9 7.52 图十二实测的幅频曲线 实测的幅频曲线如上所示,根据设计参数可得,我们设计的带阻滤波器的截止频率为: [4.2KHz,7KHz],参考图表发现,基本符合设计的要求。 信号失真的原因: TMS320F2812的数据字长只有32bit,DAC1接受的字长为16bit,首先在y[n]计算的过程中,对便产生了一定的数据损失,关键是在于对y移位以达到DA接受的字长时,移位过大会导致信号的急剧失真,移位的过小会导致滤波器设计的失败。 而即便移位达到了理想的最大位置,但是经过而产生的数据损失已经是存在了的。 这些都导致了信号的失真。 4、实时性验证 图十三采样频率显示图 采样频率为27.9KHz,采样周期为35.84us,指令执行时间为20us,满足实时性要求。 七、实验思考题 1.观察各种输入信号通过数字滤波器系统之后的输出波形,解释信号失真原因。 信号失真的原因: TMS320F2812的数据字长只有32bit,DAC1接受的字长为16bit,首先在y[n]计算的过程中,对便产生了一定的数据损失,关键是在于对y移位以达到DA接受的字长时,移位过大会导致信号的急剧失真,移位的过小会导致滤波器设计的失败。 而即便移位达到了理想的最大位置,但是经过而产生的数据损失已经是存在了的。 这些都导致了信号的失真。 2.加载其他格式编写程序所产生的FIR 滤波器程序,测量运算时间,比较分析C语言效率低的原因。 经过加载实验所给的参考汇编程序,发现数据的处理速度大大提高,几乎和比自己的程序处理速度快了一个数量级。 经过参考汇编程序和自己编写的C语言程序所转成的汇编程序的对比,发现C语言程序所转成的汇编程序里面所产生的冗余操作依旧过多,根本无法参考汇编程序相比。 分析原因认为,C语言程序所转成的汇编程序只是将C语言的程序机械的逐句翻译了一遍而已,而直接使用汇编语言来编写,每一个操作都是针对算法的要求采用的最优的指令和存储空间, 是软件和硬件的最大程度的利用。 这样将会使得计算时间大大降低。 3.以该FIR 滤波器系统为例,总结分析系统实时性的取决因素。 (1)芯片速度: 显然,在采样率不变的情况下,DSP芯片的处理速度越快,必然使得数据处理时间的降低,使得实时性更为可靠。 (2)运算量: a.数据率 由上式可知,运算量必定和算法的复杂程度有关系,即和N有关。 这里通过改变采样速率和h因子的参数,均会改变运算量,即改变数据率能够影响系统的实时性。 b.算法负载程度 与实验三对比,当程序中不添加算法,仅是ADC输入DAC输出时,中断程序处理的速度为1us<<20us,可见,算法的复杂程度也会影响到程序处理时间,从而影响实时性。 八、实验总结 至此5次实验课,一共4个实验全部结束了,回顾四次实验,在充分预习的前提下,前三个实验较为轻松的完成了实验要求,第四个实验第一次花了很多的时间在编写程序上,所编的程序在CCS上运行仿真后还是有点问题,最后还是按照设计要求实现了带阻滤波器的功能。 从第一次的基础实验到任意信号发生器,再由数据采集到最后的FIR带阻滤波器,由浅入深的让我体验了一个数字信号处理系统从软件到硬件的实现过程。 说到这次DSP实验,我不得不提这学期我在卓越工程师班学习的创新设计实践课程,它和本次的实验在同一个实验室,但是用的是不同的软件跟硬件,首先它用的硬件是C5402,其次对应的CCS软件用的是C5000,在DSP课上我们也已经学过了C5000系列与C2000系列的区别,这里我不再赘述。 当然实验内容也和DSP实验有很大差别,用C5402开发板做实验时更多侧重于存储器和中断以及FFT实验等等,而本次的DSP实验则是侧重于数据采集以及FIR滤波器的设计等,因此通过本次的DSP实验,让我对DSP芯片有了更加全面的认识和了解,对不同DSP芯片的硬件和外设更加熟悉,在掌握原理的基础上,对硬件内部有了更深的认识。 同时我对这两次使用的软件CCS系列的C2000和C5000有了进一步的了解,如新建一个工程,添加文件,建立编译,生成.out文件,加载到开发板上,这些过程在C2000和C5000上都是一样的。 所以通过这次的DSP实验,让我对DSP系列的软硬件有了更深的理解,掌握的知识也更加的全面。 具体到本次实验的收获有哪些,首先在数码管显示实验中,我学会了通过对数码管管脚进行分析,然后定义不同的显示数字的值,这个在以前我是没有遇到过的,算是新学习到的知识。 后面实验中有个是需要对小数进行定标,这个虽然在DSP课上已经学过,但是具体到实验的部分还是很陌生,因此自己也是花了很长的时间去完成小数的定标。 最后实验中最难的就是FIR带阻滤波器的程序调试,反反复复好多次的改动,最终终于完成了一个50阶的带阻滤波器,归一化截止频率在0.3和0.5,采样频率为27.9KHz,在改变输入的正弦波信号频率时,从1KHz到9KHz范围变化,示波器上的输出波形基本符合设计的要求,因此我觉得本次的FIR实验还算是比较成功的。 通过历时一个星期的DSP实验,在李老师的指导下,我基本掌握了整个DSP硬件连接和软件调试部分,相信通过后续的学习,一定会有更加长足的进步!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理工 DSP 应用技术 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)