您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页南理工DSP应用技术实验四

南理工DSP应用技术实验四

来源:五一七教育网


DSP应用技术

实验报告<四>

题目: DSP应用技术实验报告 院系: 电子工程与光电技术学院

姓名(学号): 指导教师: *** 实验日期: 2015年12月11号

实验四 FIR滤波器的DSP实现

一、实验目的

1. 巩固数字 FIR 滤波器的概念

2. 理解定点 DSP 中数的定标、有限字长、溢出等概念 3. 理解算法实现中实时的概念

4. 掌握 DSP 开发过程以及基本调试方法

5. 理解汇编以及高级语言开发 DSP 实现算法的区别

二、实验仪器

计算机,C2000 DSP 教学实验箱,XDS510 USB 仿真器,示波器,信号源

三、实验内容

针对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)差分方程可表示为:

𝑁

y[n]=∑ℎ[𝑘]𝑥[𝑛−𝑘]

𝑘=0

其中,h是滤波器系数,x为输入的数字信号,y为 FIR滤波器计算输出。N 为滤波器阶数。由此可得,一个 N 阶的滤波器计算,需要N+1个滤波器系数,N+1个数字输入,每得到一个y值,需要N+1次乘法以及N次加法。另外,N阶滤波器需要保存当前的 N+1 个输入信号数值,以及事先设计的 N+1 个滤波器系数。滤波器系数的设计有很多方式,这里我们采用MATLAB软件来对FIR滤波器算法进行仿真并验证性能。在MATLAB 界面中,利用 fir1 命令来设计滤波器系数。fir1 的完整命令如下:

h = fir1(n,Wn,′ftype′,window)

其中,n为滤波器阶数,Wn为归一化截止频率(这里的归一化指与采样频率一半进行归一化),Wn对应了在幅频曲线上-6dB点的频率数值,ftype为滤波器类型,可以是低通、带通、高通、带阻等形式。window 是使用的窗函数,可以是

hamming、hanning、chebwin等形式。h为产生的滤波器系数。详细说明可在 MATLAB 中输入 help fir1 或 doc fir1 查看。对产生的滤波器系数可以用 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口在“附录C3 C2000 DSP 教学实验箱介绍”中有所介绍,下面以 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.设备检查

检查仿真器、C2000 DSP 实验箱、计算机之间的连接是否正确,打开计算机和实验箱电源。

3.启动集成开发环境

点击桌面CCS 2(C2000)快捷方式,进入集成开发环境 CCS。 4. 建立工程

新建一个DSP工程,编辑源程序、配置命令等相关文件,并在工程中添加这些程序文件。

在上次实验程序的基础上加以修改,在中断程序内添加FIR算法模块,完成 FIR算法程序。设置GPIO的输出控制,使之能够完成算法执行时间测量的工作。

建立工程(build),若出错,则根据错误提示,修改源程序文件或者配置命令文件,直至编译链接正确,生成可执行的.out 文件。 5.加载程序

在主菜单下,选择“File → Load Program”,将程序下载到 DSP 内部。 6.算法功能验证

在中断服务子程序恰当的地方,设置探针点,利用文件IO 的方式,输入 x 数据(具体方法参见“实验9 DSP 开发基础实验”);在 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,-6,-3813,-1448,4413,48,-19,26265,-19,48,4413,-1448,-3813,-6,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滤波器功能,其中核心代码如下: void filter() { y=0;

for(j=0;jvoid shift()

{ for(k=N-1;k>0;k--) { x[k]=x[k-1]; }

}

interrupt void adc_isr(void) { EALLOW;

GpioDataRegs.GPASET.all = 0xFFFF; filter(); shift(); AdIndex = 0;

x[AdIndex]=(AdcRegs.ADCRESULT0>>4); * DA1OUT= (unsigned int)((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) 1 7.36 2 3 7.36 4 5 0.71 6 7 7.44 8 9 7.52 电压峰峰值(V) 7.28 0.36 0.36 7.28

图十二 实测的幅频曲线

实测的幅频曲线如上所示,根据设计参数可得,我们设计的带阻滤波器的截止频率为:[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.数据率

𝑁

y[n]=∑ℎ[𝑘]𝑥[𝑛−𝑘]

𝑘=0

由上式可知,运算量必定和算法的复杂程度有关系,即和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硬件连接和软件调试部分,相信通过后续的学习,一定会有更加长足的进步!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务