实验六 FIR 数字滤波器
6.1 实验目的
数字滤波的作用是滤除信号中某一部分频率分量。信号经过滤波处理,就相当于信
号频谱与滤波器的频率响应相乘的结果。从时域来看,就是输入信号与滤波器的冲激响
应作卷积和。数字滤波器在各种领域由广泛的应用,例如数字音响、音乐和语音合成、
躁声消除、数据压缩、频率合成、谐波消除、过载检测、相关检测等。
本实验主要学习数字滤波器的DSP 实现原理和C54X 编程技巧,并通过CCS 的图
形显示工具观察输入/输出信号波形以及频谱的变化。该实验应该安排在串口和定时器操
作实验之后进行。
6.2 实验要求
该实验涉及到 DSP 的串口、中断响应等复杂操作,应该在完成前面的串口和定时器
实验后完成。
本实验重点研究FIR 滤波器的DSP 实验方法,没有讨论FIR 滤波器的设计原理和方
法。你可以使用数字滤波器辅助设计软件包或自行计算FIR 滤波器的系数。本实验例子
利用DES320PP-U 评估板的模拟信号输出通道产生一个1KHz 的方波,然后利用信号输入
通道对产生的方波进行低通滤波,得到一个1KHz 的正弦信号,并使用CCS 的图形显示工
具显示输入和输出的波形。这里我们使用的是一个38 阶的对称结构的FIR 低通滤波器,
其采样频率Fs 为25KHZ,通带截止频率 1.2KHZ,阻带截止频率为2.8KHZ,阻带衰减
为-40dB。
6.3 实验原理
1) 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)]
DES320PP-U 数字信号处理仿真/教学实验系统使用与实验指导
www.dspsolution.com 73
使用MAC 或FIRS 指令可以方便地实现上面的计算。
图 6-1 说明了使用循环寻址实现FIR 滤波器的方法。为了能正确使用循环寻址,必
须先初始化BK,块长为N。同时,数据缓冲区和冲激响应(FIR 滤波器的系数)的开始
地址必须是大于N 的2 的最小幂的倍数。例如,N=11,大于N 的最小2 的幂为16,那
么数据缓冲区的第一个地址应是16 的倍数,因此循环缓冲区起始地址的最低4 位必须是
0。
图6-1 FIR 滤波器存储器里的数据存储方式
在图6-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 滤波器。图6-2
为一种有限单位冲激响应呈现对中心点对称的FIR 滤波器。长度为N 的线性相位FIR
滤波器的输出表达式为:
Σ?
=
= ? + ? ? ?
/ 2 1
0
( ) ( )[ ( ) ( ( 1 ))]
N
k
y n h k x n k x n N k
图6-2 N 阶均衡FIR 滤波器框图
要利用FIRS 指令,需要将输入数据缓冲分成两个,循环缓冲区大小寄存器的值设为N/2。
图6-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,
使他们指向各自缓冲的数据队列的最后。
图6-3 16 点FIRS 滤波数据存放
使用带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 清零
DES320PP-U 数字信号处理仿真/教学实验系统使用与实验指导
www.dspsolution.com 76
FIRS *ar2+0%, *ar3+0%,filter_coff+N/2 ;完成滤波计算。注意FIR 滤波系数存放在程序
;存贮区,filter_coff 为系数起始地址
MAR *ar2-% ; 修改Buffer1 指针
MAR *+ar3(-2)% ; 修改Buffer2 指针
2) AC01 的初始化
DSE320PP-U 使用AC01 作为模拟信号接口。AC01 提供一个14bit 的D/A 和一个14bit
的A/D 通道。AC01 与VC5402 通过串口0 连接。DSP 通过串口可以控制AC01 的采样
频率、增益、低通/高通滤波器的截止频率等参数。这一步是通过读写AC01 的寄存器来
实现的。下面是初始化AC01 的代码,有关AC01 的详细介绍请参考AC01 的技术手册。
;----------------------------------------------------------------------
; The following codes are initalized AC01, ALL AC01 setup same !
;----------------------------------------------------------------------
idle 1 ;初始化AC01 时仅仅打开串口0 的发送中断,而且中断服
务
idle 1 ;程序中简单地将A 寄存器的值写入到串口0 发送寄存器。
idle 1 ;开始初始化时,将A 寄存器设置为0 !
idle 1
ld #600h,a
idle 1 ;wait for int .....
ld #3,a
idle 1 ;send #3,AC01 的1 号寄存器为采样率控制寄存器
ld #00105h,a ;fs=10M/2/A/B= 25k,采样率设置为25KHz
;flp=10M/2/40/A= 25k (all pass)
;fhp=fs/200= 125Hz (not use !)
;A=05,B=40(0x28)
idle 1 ;send 1th regs -> 05h
ld #3,a
idle 1 ;send #3
ld #00228h,a
idle 1 ;send 2th regs -> 28h
ld #3,a
idle 1 ;send #3
ld #00300h,a
idle 1 ;send 3th regs -> 00h
ld #3,a
idle 1 ;send #3
ld #00405h,a
idle 1 ;send 4th regs -> 05h (AD & DA 0 dB)
ld #3,a
idle 1 ;send #3
ld #00505h,a
idle 1 ;send 5th regs -> 05h (highpass filter disable)
ld #3,a
idle 1 ;send #3
ld #00600h,a
idle 1 ;send 6th regs -> 00h
ld #3,a
idle 1 ;send #3
ld #00700h,a
idle 1 ;send 7th regs -> 0
ld #3,a
idle 1 ;send #3
ld #800h,a
idle 1 ;send 8th regs -> 0
ld #0h,a
;---------------------------------------------------------------------------------------------------------
; 初始化 AC01 完成!
利用 AC01 的D/A 通道产生一个1KHz 的方波,作为FIR 滤波器的输入信号。由于
串口发送中断将每0.04ms(25KHz)产生一次,所以我们将一个周期的方波信号分25
次送出,这样经D/A 变化后便可得到1KHz 的方波。产生方波的数据参见如下:
;************************************************************************
; The following data is used by make wave ! when using, must copy to wave buffer
;************************************************************************
wave_data: ;freq about 1k Hz
.word 03ffch ;+2 volt
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 03ffch
.word 0c000h ;-2 volt
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
.word 0c000h
4) 串口的初始化和串口中断服务程序
本实验通过 DSP 的串口0 输入/输出数据。在串口通讯中,数据时钟和帧同步信号
都由AC01 产生,所以VC5402 将使用外部时钟和帧同步信号。串口设置代码如下,详
细介绍请参见串口操作实验:
;******************************************************************
; The following codes are used to initalize McBSP0 !
;******************************************************************
stm #0,spsa0 ;choose SPCR10
stm #2000h,spcr10 ; receive sign_extend in DRR
stm #1,spsa0 ; choose SPCR20
stm #0c0h,spcr20 ; fs -> int !
stm #2,spsa0 ; choose RCR10
stm #40h,39h
stm #3,spsa0 ; choose RCR20
stm #0,39h
stm #4,spsa0 ;choose XCR10
stm #40h,xcr10
stm #5,spsa0 ; choose XCR20
stm #0,39h
stm #0eh,spsa0 ; choose PCR0
stm #0dh,pcr0 ; fs is low active, rise edge of clkx, falling edge
; of clkr
stm #7h,spsa0
stm #8000h,39h
rpt #0ffffh
nop
stm #00h,dxr10
ldm 22h,a
stm #1,38h
stm #0c1h,39h ; start McBSP0 send !
完成串口设置后,还需要修改中断向量表以便正确响应串口0 的接收和发送中断请
求。本实验中使用发送中断产生方波信号和完成对AC01 的初始化;使用接收中断存贮
输入的数据,并设置新数据到达标志。主循环在检测到该标志后,调用FIR 滤波程序,
完成对输入数据的处理。另外,为了方便观察,我们还使用了一个定时器,交替使XF
为高和低。所以,在滤波程序正常运行时,你会看到D2 在不停地闪烁。
6.4 实验内容
本实验需要使用‘C54X 汇编语言实现FIR 滤波器,并通过CCS 的图形显示工具观
察输入/输出信号波形以及频谱的变化。实验分以下几步完成:
1) 短接 JP12,使得DES320PP-U 的模拟信号输出通道与模拟信号输入通道相连。
2) 启动 CCS,在Project 选项中打开fir5402.pjt 文件。
3) 使用 Build 选项完成编译、连接,然后使用File 菜单中的Load Program 将OUT 文
件装入。按F5 键启动程序运行,若有示波器,可以观察DSE320PP-U 板上的JP12
的引脚输出的1KHz 的方波。
DES320PP-U 数字信号处理仿真/教学实验系统使用与实验指导
www.dspsolution.com 81
图 6-4 图形显示窗口
4) 请使用 Debug -> Halt 暂停程序的执行。在Project 管理栏中打开fir5402.asm 文件,
并在ccs_show(在fir 子程序中)行后的nop 语句处上增加一个断点。添加断点的
方法是先用鼠标单击某行,将光标移动到需要增加断点的行上,然后选择工具栏的
手状图标。当该行被设置了一个断点后,可以看到红色的圆点。
5) 选择 View -> Graph -> Time/Frequency 菜单打开一个图形显示窗口,参见图6-4。将
“Start Address”项改为地址0x1800,将“Display Data Size”项设置为128,将“DSP
Data Type”改为“16-bit signed integer”。这样,将在图形显示窗口中显示从0x1800
(信号输入缓冲)开始的128 个点的16 位有符号整数。再打开一个图形窗口,显示
从地址0x1020(滤波信号输出缓冲)开始的128 点的16 位有符号整数。
6) 选择 Debug -> Animate 项运行程序。Animate 运行和Run 运行基本一致,只是使用
Run 运行时,若遇到断点,将停下来,直到用户再次使用Run 命令才恢复运行。而
使用Animate 运行时,若遇到断点,CCS 刷新所有的显示窗口,如寄存器、CPU、
MEM、图形显示等,然后自动恢复运行。所以,你能看到连续更新的滤波输出。
6.5 思考题
1) 请说明下面的辅助寄存器的操作意义:
*ar0(#0100), *ar3+%, *ar3+0%, *ar2-%, *+ar3(-2)%
答:8个辅助寄存器(AR0--AR7),由一个辅助寄存器指针(ARP 3-bit)来指定一个辅助寄存器算术单元(ARAU)作16-bit无符号数运算,决定一个新的地址,装入辅助寄存器中,AR0--AR7的内容相当灵活,可以装入立即数,加上立即数,减去立即数;也可以从数据存储器装入地址;还可以作以下的变址寻址:
将该AR的内容加1或减1,再寻址(循环常用)
将该AR的内容加上或减去AR0的内容,再寻址
将该AR的内容逆向进位加上或减去AR0的内容,再寻址,由于采用反向进位,得以实现位倒序寻址 。
2) 本实验程序使用 ar2 和ar3 作为指针,能否使用其它的辅助寄存器,如ar0 和ar1?
3) 在 DES320PP-U 板上,‘C5402 的片内RAM 被同时映射为数据存贮区和程序存贮区,
若将两者分离,该程序将如何修改?
4) 本程序使用了循环寻址,使用循环寻址的数据缓冲区的地址能否任意设置?
5) 已给出一组 FIR 带通滤波器系数文件DESPASS.INC,请在DES320PP-U 实验系统
上实现,并观察输入和输出的波形以及频谱。滤波器为42 阶对称结构FIR 滤波器,
参数为采样频率fs=25kHz,带通中心频率为3kHz,通带为2.5kHz – 3.5kHz,上下
过渡带分别为1kHz – 2.5kHz 和3.5kHz – 5kHz。(提示:可以直接使用.include
“despass.inc”语句,将参数文件导入主程序。)
6) 修改滤波子程序,使用 C54X 的FIR 指令而不是MAC 指令完成滤波运算。
7) 若条件允许,请修改程序:利用 DES320PP-U 的输入通道接收外部信号源的输入,
然后将滤波后的信号从输出通道输出,并通过示波器观察结果。
6.6 实验结果
数字滤波器设计实验报告刘古城65100609一实验目的研究数字滤波器的设计思想理解数字频域模拟频域的关系掌握数字系统处理模拟信号的…
计算机与信息工程学院验证性实验报告一实验目的1熟悉用双线性变换法设计IIR数字滤波器的原理与方法2学会调用MATLAB信号处理工具…
实验六FIR数字滤波器61实验目的数字滤波的作用是滤除信号中某一部分频率分量信号经过滤波处理就相当于信号频谱与滤波器的频率响应相乘…
学生实验报告注学生做每个实验都必须填写实验报告实验报告可以是纸质的也可以是电子形式的凡电子文本形式的实验报告须在学期末刻录进该学期…
THBCC1实验平台错误未找到引用源计算机控制技术实验错误未找到引用源错误未指定书签数字滤波器实验报告实验指导老师万敏成绩姓名刘真…
重庆交通大学综合性设计性实验报告班级学号姓名实验项目名称滤波器设计综合实验应用实验项目性质综合性设计实验所属课程数字信号处理实验室…
数字信号处理实验报告姓名班级学号指导教师实验目的1熟悉用双线性变换法设计IIR数字滤波器原理和试验方法2掌握数字滤波器的计算机仿真…
实验六IIR数字滤波器的设计一实验目的从理论上讲任何的线性是不变LTI离散时间系统都可以看做一个数字滤波器因此设计数字滤波器实际就…
物理与电子信息工程学院实验报告实验课程名称数字信号处理实验名称FIR数字滤波器设计与软件实现班级姓名学号101234153成绩实验…
实验二数字图像的空间域滤波平滑滤波1实验目的1掌握图像滤波的基本定义及目的2理解空间域滤波的基本原理及方法3掌握进行图像的空域滤波…