电子科技大学通信与信息工程学院标准实验报告
(实验)课程名称DSP设计与实践
电子科技大学教务处制表
电子科技大学
实验报告
学生姓名:学号:指导教师:向超
实验地点:实验时间:
一、实验室名称:科B341
二、实验项目名称:FIR数字滤波器设计与实现
三、实验学时:4课时
四、实验原理:
FIR滤波器的实现
如果FIR滤波器的冲激响应为h(0),h(1),...,h(N-1)。
X(n)表示滤波器在n时刻的输入,则n时刻的输出为:
y(n) = h(0)x(n) + h(1)x(n-1)+ ... + h(N-1)x[n-(N-1)]
使用MAC或FIRS指令可以方便地实现上面的计算。
图4-1说明了使用循环寻址实现FIR滤波器的方法。
为了能正确使用循环寻址,必须先初始化BK,块长为N。
同时,数据缓冲区和冲激响应(FIR滤波器的系数)的开始地址必须是大于N的2的最小幂的倍数。
例如,N=11,大于N 的最小2的幂为16,那么数据缓冲区的第一个地址应是16的倍数,因此循环缓冲区起始地址的最低4位必须是0。
图4-1 FIR滤波器存储器里的数据存储方式
在图4-1中,滤波系数指针初始化时指向h(N-1),经过一次FIR滤波计算后,在循环寻址的作用下,仍然指向h(N-1)。
而数据缓冲区指针指向的是需要更新的数据,如x(n)。
在写入新数据并完成FIR运算后,该指针指向x(n-(N-1))。
所以,使用循环寻址可以方便地完成滤波窗口数据的自动更新.
使用带MAC指令的循环寻址模式实现FIR滤波器,程序片段如下:(输入数据在AL中,滤波结果在AH中)
STM #1,AR0 ; AR0=1
STM #N,BK ; BK=N,循环寻址BUFFER大小为N
STL A,*FIR_DATA_P+% ; 更新滤波窗口中的采样数据
RPTZ A,#(N-1) ;重复MAC指令N次,先将A清零
MAC *FIR_DATA_P+0%,*FIR_COFF_P+0%,A ; 完成滤波计算。
;注意FIR滤波系数存放在数据存储区
另一种方法是利用C54x系列芯片的提供的FIRS指令来实现FIR滤波器。
图4-2为一种有限单位冲激响应呈现对中心点对称的FIR滤波器。
长度为N 的线性相位FIR滤波器的输出表达式为:
∑-=
-
-
-
+
-
=
1
2/
))]
1
(
(
)
(
)[
(
)
(
N
k
k
N
n
x
k
n
x
k
h
n
y
图4-2 N阶均衡FIR滤波器框图
要利用FIRS指令,需要将输入数据缓冲分成两个,循环缓冲区大小寄存器的值设为N/2。
图4-3显示了输入序列在两个循环缓冲器里的存储情况。
设辅助寄存器AR2指到缓冲区1(Buffer1)的顶部,AR3指到缓冲区2(Buffer2)的底部。
每次进行滤波之前,应先将缓冲区1顶部的数据移到缓冲区2的底部,新来的一个样本存储到缓冲区1中时,并对缓冲区1指针AR2加1(使用循环寻址)。
处理器然后使用FIRS指令进行乘加运算,即h(0){x(0)+x(-N+1}。
当然,在使用FIRS 指令前,需要预先计算一次求和,以初始化A 。
在RPTZ重复指令和循环寻址的配
合下,完成FIR滤波.滤波完成后,需要对两个数据缓冲的指针进行修正,以便对下一个点进行处理。
将Buffer1的指针减1和Buffer2的指针减2,使他们指向各自缓冲的数据队列的最后。
使用带FIRS指令的循环寻址模式实现FIR滤波器,程序片段如下:(输入数据在AL中,滤波结果在B中)
STM #1,AR0 ;AR0=1
STM #(N/2),BK ;BK=N/2,循环寻址BUFFER大小为N MVDD *ar2, *ar3 ;更新Buffer2
STL A, *ar2+% ;更新滤波窗口中的采样数据
ADD *ar2+0% , *ar3+0% ;初始化A
RPTZ B, #(N/2-1) ;重复FIRS指令N/2次,先将B清零
FIRS *ar2+0%, *ar3+0%,filter_coff+N/2 ;完成滤波计算。
注意FIR
;滤波系数存放在程序存贮区,filter_coff为系数起始地址
MAR *ar2-% ;修改Buffer1指针
MAR *+ar3(-2)% ;修改Buffer2指针
图4-3 16点FIRS滤波数据存放
五、实验目的:
学习数字滤波器的DSP实现原理和C54X编程技巧。
通过CCS的图形显示工具观察输入/输出信号的波形以及频谱的变化。
六、实验内容:
本实验需要使用C54X汇编语言实现FIR数字滤波器,并通过CCS的图形显示工具观察输入/输出信号波形以及频谱的变化。
实验分以下几步完成:
(1)启动CCS,在Project选项中新建fir5402.prj文件,添加相应模块程序。
(2)使用Build选项完成编译、连接,然后使用File菜单中的Load Program将OUT文件装入。
图4-4 图形查看工具设置
(4)在程序中“bitf is_new_data,#1”语句处设置断点,在断点处设置Action 为读取数据格式,然后选择从给出的文档中读出方波信号,并选择重复执行。
设置起点位置为0x64,每次读取长度为1,设置完成后提交设置。
(5)选择View -> Graph -> Time/Frequency菜单打开一个图形显示窗口,参见上图。
将“Display Type”项设置为Dual Time,将“Start Address-upper display”项改为地址0x68,将“Start Address-lower display”项改为地址0x64,将“Acquisition Buffer Size”项改为1,将“Display Data Size,”项设置为128,将“DSP Data Type”改为“16-bit signed integer”。
这样,将在图形显示窗口中显示从分别从0x64与
0x68开始显示图像。
(6)在程序中“b again”语句处设置断点,在断点处设置Action为Refresh A Window,然后选择显示的窗口,设置完成后提交设置。
(7)选择Debug -> Animate项运行程序。
Animate运行和Run运行基本一致,只是使用Run运行时,若遇到断点,将停下来,直到用户再次使用Run命令才恢复运行。
而使用Animate运行时,若遇到断点,CCS刷新所有的显示窗口,如寄存器、CPU、MEM、图形显示等,然后自动恢复运行。
所以,你能看到连续更新的滤波输出。
思考题:
(1)以给出一组FIR带通滤波器系数文件DESPASS.INC,请在CCS的图形显示窗口中显示出来。
滤波器为42阶对称结构FIR滤波器,参数为采样频率fs=25kHz,带通中心频率为3kHz,通带为2.5kHz – 3.5kHz,上下过度带分别为1kHz – 2.5kHz 和3.5kHz – 5kHz。
(提示:你可以直接使用.include “despass.inc”语句,将参数文件导入主程序)
七、实验器材(设备、元器件):
电脑一台,C54x模拟软件
八、实验步骤:
(1)打开C54x simulator 软件,加载exe1.out 文件,并按照实验内容中的步奏逐步实现,观察运行结果。
(2)完成思考题(1)中的问题。
从Despass.inc文件中得到42阶对称结构FIR滤波器的设置参数。
参数为采样频率fs=25kHz,带通中心频率为3kHz,通带为2.5kHz – 3.5kHz,上下过度带分别为1kHz – 2.5kHz 和3.5kHz – 5kHz。
(3)在源程序中找到fir_coef模块,此模块为FIR滤波器的参数设置。
把Despass.inc.文件中的数据参数替换此处的参数,即实现带通FIR滤波器的设置。
(4)选择Debug -> Animate项运行程序,观察滤波出现的波形情况并记录。
九、实验数据及结果分析:
采样频率fs=25KHz,带通中心频率为1.5KHz,通带为1.2kHz – 2.8kHz的FIR 滤波器输出图像:
采样频率fs=25KHz,带通中心频率为3KHz,通带为2.5kHz – 3.5kHz的FIR滤波器输出图像:
十、实验结论:
十一、总结及心得体会:
十二、对本实验过程及方法、手段的改进建议:无
报告评分:
指导教师签字:。