基于DSP的FIR滤波器的设计报告.docx
《基于DSP的FIR滤波器的设计报告.docx》由会员分享,可在线阅读,更多相关《基于DSP的FIR滤波器的设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
基于DSP的FIR滤波器的设计报告
学号成绩
《DSP技术》课程论文
题目数字滤波器的DSP实现
作者班级
院别专业
完成时间2011年6月15日
目录
1概述…………………………………………………………………2
1.1数字滤波器的研究现状………………………………………………………2
1.2论文主要完成的工作…………………………………………………………2
2系统硬件设计………………………………………………………3
2.1系统设计方案…………………………………………………………………3
2.2主控模块………………………………………………………………………5
3系统软件设计………………………………………………………6
3.1软件整体设计…………………………………………………………………6
3.2测量模块………………………………………………………………………10
4系统测试与总结……………………………………………………10
4.1系统测试………………………………………………………………………10
4.2总结体会………………………………………………………………………12
参考文献………………………………………………………………12
附录……………………………………………………………………13
1概述
1.1数字滤波器的研究现状
20世纪60年代起由于计算机技术、集成工艺和材料工业的发展,滤波器发展上了一个新台阶,并且朝着低功耗、高精度、小体积、多功能、稳定可靠和价廉方向努力,其中小体积、多功能、高精度、稳定可靠成为70年代以后的主攻方向。
导致RC有源滤波器、数字滤波器、开关电容滤波器和电荷转移器等各种滤波器的飞速发展,到70年代后期,上述几种滤波器的单片集成已被研制出来并得到应用。
80年代,致力于各类新型滤波器的研究,努力提高性能并逐渐扩大应用范围。
90年代至现在主要致力于把各类滤波器应用于各类产品的开发和研制。
当然,对滤波器本身的研究仍在不断进,在国内外的研究中,设计FIR滤波器所涉及的乘法运算方式有:
并行乘法、位串行乘法和采用分布式算法的乘法。
并行乘法运行速度快,但占用的硬件资源极大。
如果滤波器的阶数增加,乘法器位数也将变大,硬件规模将变得十分庞大。
位串行乘法器的实现方法主要是通过对乘法运算进行分解,用加法器来完成乘法的功能,也即无乘法操作的乘法器。
位串行乘法器使得乘法器的硬件规模达到了最省,但是由于是串行运算,使得它的运算周期过长,运算速度与硬件规模综合考虑时不是最优的。
1.2论文主要完成的工作
本文主要应用软件设计FIR数字滤波器,并对所设计的滤波器进行仿真。
应用DSP集成开发环境—CCS调试汇编程序,用TMS320C5402来实现了FIR数字滤波。
具体内容有:
(1)研究数字滤波器的基本理论和实现方法,从原理上理解和分析数字滤波器,并通过对数字滤波器的结构和设计方法的学习,为设计数字滤波器奠定理论基础。
(2)研究FIR数字滤波器的设计方法,及如何用滤波器设计工具设计各种类型的数字滤波器,并进行仿真和分析。
(3)对数字滤波器的DSP实现进行研究。
2系统硬件设计
2.1系统设计方案
FIR滤波器的设计方法主要有窗函数设计法和频率抽样设计法等,其中窗函
数设计法是最基本的设计方法。
在设计FIR滤波器中,一个最重要的计算就是加
窗,采用矩形窗是最直接和简便的方法,但采用矩形窗存在较大的Gibbis效应,
且矩形窗的第一旁瓣与主瓣相比仅衰减13dB,因此实际设计中一般采用其他窗
函数。
主要介绍几种常用的窗函数和频率抽样设计法等。
利用窗函数设计FIR
(一)窗函数法的基本思想
窗函数设计的基本思想是要选取某一种合适的理想频率选择性滤波器,然后将它的脉冲响应截断以得到一个线性相位和因果的FIR滤波器。
因此这种方法的重点在于选择某种合适的窗函数和一种理想滤波器。
对于给定的滤波器技术指标,选择滤波器长度和具有最窄主瓣宽度和尽可能小的旁瓣衰减的某个窗函数。
任何数字滤波器的频率响应都是周期函数,它的傅立叶级数展开式为:
(2.1)
(二)几种常用的窗函数
工程中比较常用的窗函数有:
矩形窗函数、三角窗函数、汉宁窗函数、海明窗函数、布莱克曼窗函数和凯塞窗函数。
窗函数的选择原则是:
(1)具有较低的旁瓣幅度,尤其是第一旁瓣幅度:
(2)旁瓣幅度下降速度要大,以利增加阻带衰减;
(3)主瓣的宽度要窄,以获得较陡的过渡带。
通常上述三点很难同时满足。
当选用主瓣宽度较窄时,虽然得到较陡的过渡
带,但通带和阻带的波动明显增加;当选用最小的旁瓣幅度时,虽能得到匀滑的
幅度响应和较小的阻带波动,但过渡带加宽。
因此,实际选用的窗函数往往是它
们的折衷。
在保证主瓣宽度达到一定要求的条件下,适当牺牲主瓣宽度来换取旁
瓣波动的减少。
表2.1几种常用的窗函数对比
窗函数旁瓣峰值衰减过渡带阻带最小衰减
矩形窗-13
-21
三角形-27
-25
汉宁窗-31
-44
海明窗-41
-53
布莱克曼窗-57
-74
凯瑟窗-57
-80
比较可得:
凯塞窗可提供变化的过渡带宽,通过改变B的值可达到最陡的过渡带:
凯塞窗具有与海明窗相匹敌的特性,通过调整p的值,可将凯塞窗完全等价海明窗;
凯塞窗最大旁瓣值比主瓣约低80dB,在所有的窗函数中旁瓣抑制度最高[2]。
2.2.2用频率抽样法设计FIR滤波器
所谓频率抽样法就是从频域出发,根据频域的采样定理,对给定的理想滤波器的频域响应进行等间隔采样。
(2.2)
其中k=0,1,2……N-1
把
当作待设计的滤波器频率响应的采样值
通过下式可以求出滤波器的系统函数
和频率响应
:
(2.3)
(2-3)(2.4)
其中,
是一个内插函数:
(2.5)
由于频谱的有限个采样值恢复出来的频率响应实际上是对理想频率响应的逼近,因此,这种方法必然有一定的逼近误差。
若被逼近的频率响应比较平滑,则各采样点之间的逼近误差较小;反之,则逼近误差较大。
2.2主控模块
TMS320C5402的主要特性:
TMS320C5402是TI公司于1996年推出的一种定点DSP芯片,采用先进的修正哈佛结构和8总线结构,使处理器的性能大大提高。
其独立的程序和数据总线,允许同时访问程序存储器和数据存储器,实现高速并行操作。
例如,可以在一条指令中,同时执行3次读操作和1次写操作。
TMS320C5402的运行速度为40MIPS(每秒执行40百万条指令)。
指令周期为25ns。
此外,还可以在数据总线与程序总线之间相互传送数据。
从而使处理器具有在单个期内同时执行算术运算,逻辑运算,位移操作,乘法累加运算以及访问程序和数据存储器的强大功能。
包括:
CPU,总线,存储器,在片外围电路,串行口,以及外部总线接口等部分组成。
1CPU
40位算数逻辑运算单元(ALU),包括1个40位桶形移位寄存器和2个独立的40位累加器。
17位X17位并行乘法器,与40位专用加法器相连,用于非流水线式单周期乘法/累加(MAC)运算。
比较,选择,存储单元(CSSU),用于加法/比较选择。
双地址生成器,包括8个辅助寄存器和2个辅助寄存器算数运算单元(ARAU)。
2、总线结构
程序总线(PB)传送取自程序存储器的指令代码和立即数。
3条数据总线(CB,DB和EB)将内部各单元连接在一起。
4条地址总线(PAB,CAB,DAB和EAB)传送执行指令所需的地址。
3存储器
192K字可寻址存储空间(64K字程序存储器,64K字数据存储器,以及64K字I/O空间)。
片内2K字ROM。
片内10K字双存取RAM。
4在片外围电路
用来周期产生中断的定时器。
8位主机接口(HPI),用来与主设备或主处理器接口。
一个自动缓冲串口(BSP)和时分多路串行口(TPM),都可用作标准同步串口。
图1TMS320C5402DSP的内部硬件组成框图
3系统软件设计
3.1软件整体设计
总体设计方案
FIR滤波器的实现结构有以下几种形式
(1)直接型结构
该种结构实现时需N个乘法器、N-1个延迟器和N-1个加法器。
结构图如下:
图3.1直接型结构图
(2)级联型结构
FIR系统函数H(z)是z-1的N-1次多项式,其分解为实系数二阶因子的乘积形式为:
H(z)=
(β0k+β1kz-1+β2kz-2)
根据上式就可画出级联结构如下图。
其中Nc为N/2的最大整数。
该结构即是把H(z)的共轭零点或两个单个零点组成基本二阶节,H(z)为基本二阶因子的子系统函数积。
图3.2级联型结构图
从图3.2中可看出,每个二阶因子用直接型实现,每一节控制一对零点,便于传输零点的控制。
但系数β1k的个数比h(n)的个数多,其乘法次数比直接型多。
(3)线性相位型结构
线性相位特性是指滤波器对不同频率的正弦波所产生的相移和正弦波的频率成直线关系。
在滤波器通带内的信号通过滤波器后,除了由相频特性的斜率决定的延迟外,可以不失真地保留通带以内的全部信号。
线性相位的因果的FIR系统的单位取样响应具有如下特性
h(n)=±h(N-1-n)
当N为偶数时,式变为
H(z)=
h(n)[z-n+z-(N-1-n)]
当N为奇数时,此式为
H(z)=
h(n)[z-n+z-(N-1-n)]+h(
)z-(
)
由上面两个式子可知:
实现直接形式的结构网络只需要N/2(N为偶数)或(N十1)/2次乘法(N为奇数),利用h(n)的对称比直接卷积形式少用一半的乘法器。
图3.3N为偶数,线性相位结构
图3.4N为奇数,线性相位结构
(4)频率取样结构
系统函数H(z)在单位圆上作N等分取样的值得到h(n)的离散傅立叶变换值H(k):
H(k)=H(
)=|H(k)|
=
h(k)
根据内插公式,得
H(z)=
(1-z-N)
上式即为频率取样结构的系统函数其中,
=
,H(k)为单位圆上的频率取样值。
可见,该系统是由一个子FIR系统(1-z-N)和一个子IIR系统
级联组成的。
图3.5频率取样结构图
FIR滤波器的实现方法
数字滤波器的实现方法一般有以下几种
(1)用计算机软件实现
软件实现方法即是在通用的微型计算机上用软件实现。
利用计算机的存储器、运算器和控制器把滤波所要完成的运算编成程序通过计算机来执行,软件可由使用者自己编写,也可以使用现成的。
但是这种方法速度慢,难以对信号进行实时处理,虽然可以用快速傅立叶变换算法来加快计算速度,但要达到实时处理要付出很高的代价。
(2)采用DSP(DigitalSignalProcessing)处理器来实现
DSP处理器是专为数字信号处理而设计的,它的主要数字运算单元是一个乘累加器,能够在一个机器周期内完成一次乘累加运算,配有适合于信号处理的指令,具备独特的循环寻址和倒序寻址能力。
这些特点都非常适合数字信号处理中的滤波器设计的有效实现,并且它速度快,成本低。
用DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响外,还具有灵活性好的特点。
(3)采用固定功能的专用信号处理器实现
专用信号处理器采用专用集成电路ASIC来实现,适用于过程固定而又追求高速的信号处理任务,是以指定的算法来确定它的结构,使用各种随机逻辑器件组成的信号处理器。
它们体积小、保密性好,具有极高的性能,然而灵活性差。
(4)用FPGA等可编程器件实现
使用相关开发工具和VHDL等硬件开发语言,通过软件编程用硬件实现特定的数字滤波算法。
这一方法由于具有通用性的特点并可以实现算法的并行运算,无论是作为独立的数字信号处理,还是作为DSP芯片的协作处理器都是比较活跃的研究领域。
可以采用DSP或FPGA来实现硬件电路。
3.2测量模块
CCS算法流程图
4系统测试与总结
4.1系统测试
在View的Graph中单击Time/frequency出现graphpropertydialog框。
将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置,输出各种波形。
输出滤波前的信号时域波形。
首先,设置如图4.1所示,输出滤波前的信号时域波形。
图4.1Graphpropertydialog设置框图
单击OK后生成如下图4.2波形。
图4.2滤波前信号波形图
图4.2为滤波前的信号,波形很杂乱,从时域上很难看出信号的周期性。
修改相应设置,输出如图4.3所示滤波前信号频谱。
图4.3滤波前信号频谱波形图
经过滤波后,时域波形频谱波形如图4.4和4.5所示。
图4.4滤波后信号时域波形图
图4.5滤波后信号频谱图
4.2总结体会
通过本次课程设计,让我了解了数字滤波是信号处理技术中的重要部分,研究了数字滤波器的基本理论知识以及它实现方法。
学习了数字滤波器的结构、设计理论,掌握了各种数字滤波器的原理和特性。
并且复习了MATLAB的相关知识,并且利用MATLAB与CCS设计了低通滤波器以及高通滤波器,还研究了如何在定点DSP中实现数字滤波器的算法,掌握了CCS环境下的程序开发方法、调试工具的使用及优化级别的选择等。
研究了MATLAB环境下FIR数字滤波器的设计方法,利用MATLAB软件编程实现FIR滤波器设计。
DSP作为一门新兴学科,越来越引起人们的关注,目前已广泛应用在各个领域。
所以在今后的工作和学习生活中,综合运用模拟电子、数字电子和DSP基本原理等课程中所学的理论知识去独立完成一个项目的设计。
不仅要完善以上的MATLAB设计方法,更要学会利用多种途径设计各种DSP最小系统,熟练C语言编程,用DSP芯片实现低通FIR数字滤波,除了具有准确度高、不受环境影响等优点外。
通过对本课题的研究,关于数字滤波器理论知识得到了丰富和提高,熟悉了课题研究的整体思路和方法,认识到进行课题研究应具备的素质。
第一,对一个课题的研究必须要阅读大量的文献和书籍,第二,理论基础知识的重要性,第三,掌握各种设计软件的必要性。
最后,研究工作要有信心,要虚心,要不畏困难、不断进取,这样才可以保证课题研究工作的圆满完成。
参考文献
[1]王念旭.DSP基础与应用系统设计.北京:
北京航空航天大学出版社,2001
[2]张雄伟.DSP集成开发与应用实例.北京:
电子工业出版社,2002
[3]张雄伟.DSP芯片的原理与开发应用(第二版).北京:
电子工业出版社,2000
[4]彭宗启.DSP技术原理及应用.北京:
电子工业出版社,1998
[5]朱铭铭.基于模糊的DSP系统设计.北京:
电子工业出版社,2003
[6]李真芳,苏涛等.DSP程序开发一MATLAB调试及直接目标代码生成「M].西安:
西安电子科技大学出版社,2003
附录
用线性缓冲区实现FIR滤波器程序清单:
.title“FIR1.ASM”
.mmregs
.defstart
x.usect“x”,8
PA0.set0
PA1.set1
.data
COEF:
.word1*32768/10
.word2*32768/10
.word-4*32768/10
.word3*32768/10
.word-4*32768/10
.word2*32768/10
.word1*32768/10
.text
start:
SSBXFRCT
STM#x+7,AR2
STM#6,AR0
LD#x+1,DP
PORTRPA1,@x+1
FIR1:
RPTZA,#6
MACD*AR2-,COEF,A
STHA,*AR2
PORTW*AR2+,PA0
BDFIR1
PORTRPA1,*AR2+0
.end
用循环缓冲区实现FIR滤波器程序清单:
.title“FIR2.ASM”
.mmregs
.defstart
.bssy,1
xn.usect“xn”,7
b0.usect“b0”,7
PA0.set0
PA1.set1
.data
table:
.word1*32768/10
.word2*32768/10
.word3*32768/10
.word4*32768/10
.word5*32768/10
.word6*32768/10
.word7*32768/10
.text
start:
SSBXFRCT
STM#b0,AR1
RPT#6
MVPDtable,*AR1+
STM#xn+6,AR2
STM#b0+6,AR3
STM#7,BK
STM#-1,AR0
LD#xn,DP
PORTRPA1,@xn
FIR2:
RPTZA,#6
MAC*AR2+0%,*AR3+0%,A
STHA,@y
PORTW@y,PA0
BDFIR2
PORTRPA1,*AR2+0%
.end
汇编程序清单
lhm.h文件内容:
.data
coeff.word-85,-64,-61,-36,8,62,110,136,131
.word96,42,-11,-44,-44,-11,39,85,106
.word88,37,-29,-83,-101,-73,-7,70,124
.word131,82,-5,-96,-151,-144,-72,37,140
.word191,162,61,-76,-191,-231,-174,-35,132
.word256,278,180,-7,-208,-337,-330,-176,72
.word316,445,392,156,-178,-475,-599,-470,-108
.word361,745,857,594,-6,-748,-1336,-1456,-893
.word386,2192,4154,5816,6768,6768,5816,4154,2192
.word386,-893,-1456,-1336,-748,-6,594,857,745
.word361,-108,-470,-599,-475,-178,156,392,445
.word316,72,-176,-330,-337,-208,-7,180,278
.word256,132,-35,-174,-231,-191,-76,61,162
.word191,140,37,-72,-144,-151,-96,-5,82
.word131,124,70,-7,-73,-101,-83,-29,37
.word88,106,85,39,-11,-44,-44,-11,42
.word96,131,136,110,62,8,-36,-61,-64
.word-85
Fir.asm内容:
.title"fir.asm"
.mmregs
.global_c_int00
ORDER.set154
D_LEN.set1024;TheLengthofInputData
xn.usect"xn",(ORDER-1)
a0.usect"a0",(ORDER-1)
input.usect"input",D_LEN
output.usect"output",D_LEN
.copy"HM.h";Getcoefsfrom"coef.h"
.text
.asgAR0,FIR_INDEX
.asgAR2,FIR_DATA
.asgAR3,FIR_COEF
.asgAR5,DATA_IN
.asgAR6,DATA_OUT
_c_int00:
SSBXFRCT
STM#a0,FIR_COEF;Copya0(coefs)toFIR_COEF(AR3)
RPT#ORDER-1
MVPD#coeff,*FIR_COEF+
STM#1,FIR_INDEX
STM#xn,FIR_DATA;Copyxn(data)toFIR_DATA(AR2)
RPTZA,#ORDER-1
STLA,*FIR_DATA+
STM#(xn+ORDER-1),FIR_DATA
STM#(a0+ORDER-1),FIR_COEF
STM#input,DATA_IN;Getdatafrom"input"
STM#output,DATA_OUT;Writedatato"output"
STM#D_LEN-1,BRC
RPTBDnext-1
STM#ORDER,BK
LD*DATA_IN+,A
FIR:
STLA,*FIR_DATA+%
RPTZA,(ORDER-1)
MAC*FIR_DATA+0%,*FIR_COEF+0%,A;FIRS
STHA,*DATA_OUT+
next
FIR_END:
BFIR_END
.end
FIR.m的程序如下:
fs=40000;%/采样Hz
N=1024%数据个数
T=1/fs;%采样周期
n=0:
N-1;
df=n*(fs/N)%待滤波信号波形
xin=randn(1,1024)
figure
(1)
plot(xin)%待滤波信号频谱
xinff=abs(fft(xin));
figure
(2)
plot(df,xinff)%滤波后信号波形
y_filter_out=filter(B,1,xin)%Y=FILTER(B,A,X)
figure(3)
plot(y_filter_out)%滤波后信号频谱
yff=fft(y_filter_out);
figure(4)
plot(df,yff)
xin=xin/max(xin);%归一化
xto_ccs=round(32767*xin)%取整
fid=fopen('input1.dat','w');%打开文件
fprintf(fid,'16511000\n');%输出文件头
fprintf(fid,'%d\n',xto_ccs);%输出
fclose(fid