DSP课程设计报告刘雅琪.docx
《DSP课程设计报告刘雅琪.docx》由会员分享,可在线阅读,更多相关《DSP课程设计报告刘雅琪.docx(21页珍藏版)》请在冰豆网上搜索。
DSP课程设计报告刘雅琪
一、课程设计的目的和要求
1.1课程设计目的:
本课程是DSP技术类课程配套的课程设计,要求学生通过高级语言或汇编语言编程实现较复杂的功能。
通过课程设计,使学生加深对DSP芯片
TMS320C54的结构、工作原理的理解,获得DSP应用技术的实际训练,掌握设计较复杂DSP系统的基本方法。
1.2课程设计要求
1、认真查阅资料
2、课程设计前认真预习
3、遵守课程设计时间安排
4、认真保质保量完成设计要求
5、认真书写报告
二、系统功能介绍及总体设计方案
2.1功能介绍
随着信息技术和计算机技术的飞速发展,数字信号处理技术在众多领域得到广泛应用。
数字滤波器由于其精度高、稳定性好、使用灵活等优点,广泛应用在各种数字信号处理领域。
数字滤波器根据冲击响应函数的时域特性,可以分为FIR(有限长冲激响应滤波器)和IIR(无限长冲激响应滤波器)。
FIR滤波器与IIR滤波器相比,具有严格的线性相位,幅度特性可任意等优点。
而且,FIR滤波器的单位抽样响应是有限长的,故一定是稳定的,他又可以用快速傅里叶变换(FFT)算法来实现过滤信号,可大大提高运算效率。
本课程设计的是一个等波纹FIR低通滤波器,其具体参数为:
采样频率
Fs=1000Hz,通带频率Fpass=150Hz截止频率Fsg=250Hz,通带衰减Apass=0.5dB
阻带衰减Astop=80dB。
2.2总体设计方案:
先进行Matlab程序设计产生待滤波数据(借助设计工具FDATOOL产生设计系数),将其导入CCS在CCS!
进行仿真调试运行,得到了输入和输出的波形及
其频谱。
三、主要设计内容和步骤
3・1FIR数字滤波器的原理分析
3.1.1FIR数字滤波器
数字滤波器原理一般具有如下差分方程
NAN-1
y(n)fakX(n-k)、bky(n-k)
kz0k=0
式中x(n)为输入序列,y(n)为输出序列,兔和bk为滤波器系数,N是滤波器阶
NJ
数。
当所有的bk均为零,则有y(n)八时(n-k)⑵
k=0
(2)式是FIR滤波器的差分方程,其一般形式为
N-1
y(n)「hkx(n-k)(3)
k£
对(3)式进行z变换,整理后可得FIR滤波器的传递函数
FIR的直接型结构:
x(n)
——B——
h(0)
n
"
(2)'
b——■——
1h(N£3)
»_m
h(N£2)I
■—1
・■”
£■1
h(N£l)
z£i
z£i
y(n)
图2FIR的直接型结构
FIR滤波器最主要的特点是没有反馈回路,因此它是无条件稳定系统。
它
的单位冲激响应h(n)是一个有限长序列。
如果h(n)是实数,且满足偶对称或奇
对称的条件,即h(n)二h(N^-n)或h(n)二-h(N-仁n),则滤波器具有线性相
位特性。
偶对称线性相位FIR滤波器(N为偶数)的差分方程表达式为:
N/2J
y-q[x(n—i)x(n-NVi)]
iQ
线性相位FIR滤波器是用得最多的FIR滤波器。
FIR滤波器不断地对输入样本x(n)延时后,再作乘法累加算法,将滤波结
果y(n)输出,因此fir滤波算法实际上是一种乘法累加运算。
在数字滤波器中,
FIR滤波器的最主要特点是没有反馈回路,故不存在不稳定的问题。
同时可以在随意设置幅度特性的同时,保证精确无误的线性相位。
稳定的线性相位特性是FIR滤波器的突出优点。
3.1.2系数对称的FIR滤波器
对于系数对称的FIR滤波器,由于其具有线性相位特性,因此应用很广,
特别是对相位失真要求很高的场合,如调制解调器(MODEM
一个N=8的FIR滤波器,若a(n)=a(N“-n),就是对称FIR滤波器,其
输出方程为:
y(n)=aox(n)aix(n-1)a2x(n-2)a3x(n-3)a3X(n-4)a2x(n-5)®x(n-6)a°x(n-6)
总共有8次乘法和7次加法。
如果改写成:
y(n)=a°[x(n)x(n-7)]a1[x(n-1)x(n-6)]a2[x(n-2)x(n-5)]a3[x(n-3)x(n-4)]
则变成4次乘法和7次加法。
可见乘法运算的次数减少了一半。
这是对称FIR
的有一个优点。
对称FIR滤波器的C54x实现的要点
(1)在数据存储区中开辟两个循环缓冲区,New循环缓冲区中存放N/2=4个
新数据;Old循环缓冲区中存放老数据。
循环缓冲区的长度为N/2。
数据存储器
NeW循环缓冲区Old循环缓冲区
80h
x(n)
J"AR2
88h
x(n-4)
81h
x(n-3)
89h
x(n-5)
82h
x(n-2)
8Ah
x(n-6)
83h
x(n-1)
8Bh
x(n-7)
—AR3
程序存储器
系数表
低地址
咼地址
(2)设置循环缓冲区指针,AR2指向中最新的数据,AR3指向中最老的数据
(3)在程序存储器中设置系数表。
(4)(AR2)(AR3)>AH(累加器A的高位)
(AR2)-1>AR2(AR3)-1》AR3
⑸将累加器B清0,重复执行4次(i=0,1,2,……)
(AH)*系数ai+(B)tB系数指针(PAR加1
(AR2)(AR3)>AHAR2和AR3减1
(6)保存和输出结果(结果在BH中)
(7)修正数据指针,让AR2和AR3分别指向NeW爰冲区中最新的数据和Old缓冲区中最老的数据。
(8)用NeW爰冲区中最老的数据替代Old缓冲区中最老的数据。
Old缓冲区指针减1。
(9)输入一个新数据替代New缓冲区中最老的数据
重复执行第(4)~(9)步
3.1.3关键指令
在编程中要用到FIRS(系数对称有限冲激响应滤波器)指令,其操作如
下:
FIRSXmem,Ymem,Pmad
执行Pmad》PAR
当(RC)=0
(B)+(A(32-16))*(由PAR#址Pmem)》B
((Xmem+(Ymer)<<16tA
(PAR+1>PAR
(RC)-1>RC
FIRS指令在同一个机器周期内,通过C和D总线读2次数据存储器,同时通过P总线读一个系数。
3.2Matlab的仿真及滤波器系数的确定
设计FIR滤波器,关键是得到正确的滤波器系数。
按照技术指标的要求,
进行Matlab程序设计。
运行后生成的图像如下:
观察图像可知在频率为50和
350Hz上有波形,后面为镜像显示。
利用Matlab中FDATOO工具设计好滤波器,从FDATOO向CCS输出滤波器系数。
Matlab中FDATOOLX具设计好滤波器以后,可以利用C语言头文件输出滤波器系数,将头文件添加到工程中,编译连接生成可执行文件。
在把可执
行文件加载到目标DSP后,会给头文件中的滤波器系数分配一个静态存储空间,滤波器系数就放入此存储空间中。
或者可以直接把滤波器系数输出到DSP的存
储器中。
FDATOO设计分析后产生的幅频特性及滤波器系数表
输出的滤波器系数为:
.word
15,
-3,-158,-448,-583,-172,663,1008,
2
.word
-1764,
-2046,1075,6744,11298,11298,6744,1075,
-2046
.word
-1764,
2,1008,663,-172,-583,-448,-158,
-3
.word
15
四、详细设计
给定FIR数字低通滤波器的技术指标为分别为50Hz和350Hz采样频
率均为1kHz。
利用Matlab设计FIR低通滤波器的系数得DSP中滤波器系数列表.用.word汇编命令将各滤波器系数直接输入到DSP程序中;模拟输入数据由
C语言程序实现,然后用.copy命令将C语言程序生成的数据文件拷贝到DSP程序中。
DSP程序实现读入数据、滤波、显示波形等方面的任务。
完成FIR滤
波器的程序框图如图4所示,可知FIR滤波器的DSP实现主要由以下4方面的内容组成:
(1)模拟输入数据的生成用C语言程序生成输入数据,通过.copy汇编
命令将生成的数据文件拷贝到汇编程序中,作为FIR滤波器的输入数据。
(2)DSP初始化程序
.title"FIR.asm".mmregs
.def
_c_int00
N
.set
28
size
.set
N/2
;FIR滤波器阶数
x_new
.usect
"x_new",N/2
;自定义数据空间
x_old
.usect
"x_old",N/2
;自定义数据空间
KS
.set
256
;输入样本数据个数
input
.usect
"input",KS
output
.usect
"output",KS
.data
.copy
"fdacoefs4.h"
;FIR滤波器系数
.text
图4主程序流程图
(3)滤波算法子程序:
滤波算法流程图滤波算法子程序代码:
FIR:
SSBXFRCT
STM
#x_new,AR2
STM
#x_old+(size-1),AR3
STM
#-1,AR0
STM
#output,AR5
STM
#input,AR4
STM
#KS-1,BRC
RPTBDLOOP-1
STM
#size,bk
LD
*AR4+,A
STL
A,*AR2
ADD
*AR2+0%,*AR3+0%,A
RPTZ
B,#size-1
FIRS
*AR2+0%,*AR3+0%,COEF
STH
B,*AR5+
MAR
*+AR2
(2)%
MAR
*AR3+%
MVDD*AR2,*AR3+0%
(4)复位程序:
中断流程图复位程序代码:
.title"FIR_V.asm"
.ref_c_intOO
.sect"VECTORS"
reset:
b_c_int00
.end
五、调试过程
编辑好.asm和.cmd文件之后并加入工程中进行编译,修改出现的错误直至
无误,然后加载.out文件。
选择File菜单下的data,加入.dat文件,运行程
序并打开CCS的输入输出图形界面,观察对比滤波前后的时域波形与频谱图调试过程中出现的错误及警告:
(1)warning:
creatingoutputsectionnewdatawithoutSECTIONS
specification
分析:
汇编语言源程序中的未初始化段名newdata与链接命令文件不
一致
解决:
将链接命令文件中相应的未初始化段名改为newdata
(2)"fir.asm",ERROR!
atline13:
[E1000]Include/Copyfilenotfound
oropened
分析:
用FDATOO工具产生的系数表文件名与源程序中引用的不一致
解决:
保持产生的系数表文件名与源程序中引用的一致
(3)分析产生的波形图不理想,有时是因为不同的参数设计出的滤波器的阶数可能不同,要注意修改源程序中滤波器阶数值
(4)在CCS程序中,应先加载正确的中断向量文件,所用芯片的CMD配置文件,编译才会有效。
编译成功后加载.out文件后才可以运行,查看运行结果。
若发现程序语法本身正确,编译也没有错误,可以加载.out文件,但查看输出波形始终与Matlab的波形无法吻合,则应考虑重置CPU再重新进行操作。
调试后运行出的波形如下:
输入与输出的时域波形:
N3ztosdT…tiH:
hiiH|诫氓idfft#Scdt
输入与输出的频谱图:
滤波后信号的时域空频谱图分别如上图所示.对比CCS所显示的滤波前和滤波后信号的时域和频谱图可以看出:
由频率分别为50Hz,350Hz这2个正弦信号组成的混合信号,经过FIR低通滤波后,相对应频率的信号被保留,
另外1个信号得到压制,基本上达到了预期的滤波效果。
改变程序中的滤波器系数,即可实现不同类型的滤波器。
六、结论与体会
6.1设计结论
本设计为FIR低通滤波器,其要求实现功能是在多个混合的频率中可以把其中高于截止频率Fc的频率分量滤除掉,通过matlab中的FDATOO工具可以很方便地进行设计,输入相应的参数输入是采样频率Fs=1000Hz,通带频率为150Hz,阻带频率250Hz,输出滤波器系数表,它们作为CCS仿真时的输入,调试修改程序,从所得到的图形中观察分析可以得知该滤波器实现了滤波效果,达到了预期的目的。
6.2实验心得
通过这次基于DSP的数字滤波器设计与仿真,我学会了应用Matlab和CCS进行DSP设计的实践操作。
应用Matlab对FIR数字滤波器比传统的方法设计滤波器速度提高了很多,设计过程得到了很大的简化。
熟悉了DSP集成开发环境
(CCS)基于窗函数法设计,掌握了FIR数字滤波器原理和方法。
通过对系统的调试,对线性相位FIR数字滤波器特性及不同阶数对滤波器特性的影响进行了研究。
通过观察时域和频域图,对FIR数字滤波器特性进行了验证,在应用DSP对数字滤波器实现的过程中,体会到了DSP在数字滤波实现中的优缺点。
在使用Matlab时,熟悉了如何运用Matlab进行滤波器的设计,可以是编写程序直接针对某所需参数的滤波器进行,也可以运用Matlab中的一个滤波器的专用设计工具FDATOOL对其进行设计,简单方便。
在数字滤波器设计时要注意以下几点:
(1)在用Matlab设计滤波器时采样频率一定要满足奈奎斯特准则。
抽样频率必须大于两倍信号谱的最高频率,即Fs>=2Fh来设置混合波的相应频率,以取得准确的滤波效果。
(2)使用探针方法输入数据时,一般要求输入数据是16进制的小数表示,但如果输入10进制的也可以,但需在两次确认之后才可以输入。
(3)在图形窗口观察结果时,如果所观察的图形不明显,可以通过设置幅度值来改善效果。
(4)在程序中对输入的数据处理时,因注意在Matlab得到的小数要在CCS中得以应用必须符合小数运算的规则。
当发生溢出时,则用其最大正数或者最大负数加载累加器。
总之,滤波器设计是我们实际系统应用中重要的一方面,相比传统的R,L,C元件和运算放大器组成的块滤波器,更有发展的潜力。
相信这次课程设计,对于我以后的学习和工作会带来很大的帮助!
七、参考文献
[1]程佩青.数字信号处理教程.北京:
清华大学出版社,1995
[2]戴明帧.TMS320C54XDSP结构原理以应用.北京.北京航空航天大学出版社,
2007
[3]DSP原理及应用.北京.中国水利水电出版社,2004
附录一:
源程序清单(.asm文件)
.title
.mmregs
.def
"FIR.asm"
_c_int00
N
.set
28
size
.set
N/2
;FIR滤波器阶数
x_new
.usect
"x_new",N/2
;自定义数据空间
x_old
.usect
"x_old",N/2
;自定义数据空间
KS
.set
256
;输入样本数据个数
input
.usect
"input",KS
output
.usect
"output",KS
.data
.copy
"fdacoefs4.h"
;FIR滤波器系数
***********
系数对称的FIR滤波器设计***********
.text
_c_int00:
SSBX
FRCT
;设置FRCT(小数方式)位
STM
#x_new,AR2
;AR2指向New缓冲区第一个单元
STM
#x_old+(size-1),AR3
;AR3指向Old缓冲区最后一个单元
STM
#-1,AR0
;AR0=-1,双操作数减量
STM
#output,AR5
STM
#input,AR4
STM
#KS-1,BRC
;块重复计数GS次
RPTBD
LOOP-1
STM
#size,bk
;循环缓冲区块大小BK=size
LD
*AR4+,A
STL
A,*AR2
;输入样本值
FIR:
ADD
*AR2+0%,*AR3+0%,A
;AH=x(n)+x(n-N+1)
RPTZ
B,#size-1
;B=0,下条指令执行size次
FIRS*AR2+0%,*AR3+0%,COEF;B=B+AH*h(0),AH=x(n-1)+x(n-N+2)
;执行该指令size次
STHB,*AR5+
MAR*+AR2
(2)%
;保存滤波输出数据到AR5所指向单元
;老的数据
.end
;修正AR2指向New缓冲区最老的数
.title"FIR_V.asm"
.ref_c_int00
.sect"VECTORS"定义向量表,紧随其后的是名为VECTOR的复位向量reset:
b_c_int00
.end
附录二:
链接命令文件(.cmd文件)
MEMORY
{
PAGE0:
ROM:
org=0x0E00,len=0x1000
VEC:
org=0xff80,len=0x0080
PAGE1:
SPRAM:
org=0x0060,len=0x0020
DARAM:
org=0x0080,len=0x2000
}
SECTIONS
{
.text
>ROMPAGE0
.data
>ROMPAGE0
VECTORS
>VECPAGE0
.bss
>SPRAMPAGE1
x_new
>DARAMPAGE1
x_old:
>DARAMPAGE1
output:
>DARAMPAGE1input:
>DARAMPAGE1}附录三:
滤波器系数表(.h文件)
COEF.word15,-3,-158,-448,-583,-172,663,1008,2
.word-1764,-2046,1075,6744,11298,11298,6744,1075,-2046
.word-1764,2,1008,663,-172,-583,-448,-158,-3.word15
附录四:
Matlab程序(.m文件)
f11=50;%/Hz
f12=350;%/Hz
fs=1000;%/采样Hz
N=256;%数据个数
T=1/fs;%采样周期
n=0:
N;x11=sin(2*pi*f11*n*T);x12=0.7*sin(2*pi*f12*n*T);x_base=(x11+x12);
%待滤波信号波形
figure
(1)plot(x_base)%待滤波信号频谱
figure
(2)
yff=abs(fft(x_base))
df=n*(fs/N)plot(df,yff)xout=x_base/max(x_base);%归一化xto_ccs=round(32767*xout)fid=fopen('input.dat','w');%打开文件fprintf(fid,'16511000\n');%输出文件头
输出
fprintf(fid,'%d\n',xto_ccs);%fclose(fid);