DSP IIR滤波器设计.docx
《DSP IIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《DSP IIR滤波器设计.docx(13页珍藏版)》请在冰豆网上搜索。
![DSP IIR滤波器设计.docx](https://file1.bdocx.com/fileroot1/2023-1/4/3fc0f4ca-7230-4007-9921-c5b3e575ee92/3fc0f4ca-7230-4007-9921-c5b3e575ee921.gif)
DSPIIR滤波器设计
成绩
中国农业大学
课程设计
(2010-2011学年春季学期)
论文题目:
IIR滤波器设计
课程名称:
DSP课程设计
任课教师:
杨卫中
班 级:
自动化081
学 号:
0808140823
姓 名:
李璐
IIR滤波器设计实验报告
一、实验目的:
1、用MATLAB仿真软件完成各种滤波器的仿真实验。
2、在DSPCCS中用C语言完成滤波器的设计。
3、观察波形。
二、实验原理:
1.IIR数字滤波器的系统函数可以写成封闭函数的形式。
2.IIR数字滤波器采用递归型结构,即结构上带有反馈环路。
IIR滤波器运算结构通常由延时、乘以系数和相加等基本运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。
由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。
3.IIR数字滤波器在设计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,其设计工作量比较小,对计算工具的要求不高。
在设计一个IIR数字滤波器时,我们根据指标先写出模拟滤波器的公式,然后通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。
4.IIR数字滤波器的相位特性不好控制,对相位要求较高时,需加相位校准。
在MATLAB下设计IIR滤波器可使用Butterworth函数设计出巴特沃斯滤波器,使用Cheby1函数设计出契比雪夫I型滤波器,使用Cheby2设计出契比雪夫II型滤波器,使用ellipord函数设计出椭圆滤波器。
下面主要介绍前两个函数的使用。
与FIR滤波器的设计不同,IIR滤波器设计时的阶数不是由设计者指定,而是根据设计者输入的各个滤波器参数(截止频率、通带滤纹、阻带衰减等),由软件设计出满足这些参数的最低滤波器阶数。
在MATLAB下设计不同类型IIR滤波器均有与之对应的函数用于阶数的选择。
、巴特沃斯IIR滤波器的设计
在MATLAB下,设计巴特沃斯IIR滤波器可使用butter函数。
Butter函数可设计低通、高通、带通和带阻的数字和模拟IIR滤波器,其特性为使通带内的幅度响应最大限度地平坦,但同时损失截止频率处的下降斜度。
在期望通带平滑的情况下,可使用butter函数。
butter函数的用法为:
b,a]=butter(n,Wn,/ftype/)
其中n代表滤波器阶数,Wn代表滤波器的截止频率,这两个参数可使用buttord函数来确定。
buttord函数可在给定滤波器性能的情况下,求出巴特沃斯滤波器的最小阶数n,同时给出对应的截止频率Wn。
buttord函数的用法为:
[n,Wn]=buttord(Wp,Ws,Rp,Rs)
其中Wp和Ws分别是通带和阻带的拐角频率(截止频率),其取值范围为0至1之间。
当其值为1时代表采样频率的一半。
Rp和Rs分别是通带和阻带区的波纹系数。
不同类型(高通、低通、带通和带阻)滤波器对应的Wp和Ws值遵循以下规则:
1.高通滤波器:
Wp和Ws为一元矢量且Wp>Ws;
2.低通滤波器:
Wp和Ws为一元矢量且Wp3.带通滤波器:
Wp和Ws为二元矢量且Wp4.带阻滤波器:
Wp和Ws为二元矢量且Wp>Ws,如Wp=[0.1,0.8],Ws=[0.2,0.7]。
、契比雪夫I型IIR滤波器的设计
在期望通带下降斜率大的场合,应使用椭圆滤波器或契比雪夫滤波器。
在MATLAB下可使用cheby1函数设计出契比雪夫I型IIR滤波器。
cheby1函数可设计低通、高通、带通和带阻契比雪夫I型滤IIR波器,其通带内为等波纹,阻带内为单调。
契比雪夫I型的下降斜度比II型大,但其代价是通带内波纹较大。
cheby1函数的用法为:
[b,a]=cheby1(n,Rp,Wn,/ftype/)
在使用cheby1函数设计IIR滤波器之前,可使用cheblord函数求出滤波器阶数n和截止频率Wn。
cheblord函数可在给定滤波器性能的情况下,选择契比雪夫I型滤波器的最小阶和截止频率Wn。
cheblord函数的用法为:
[n,Wn]=cheblord(Wp,Ws,Rp,Rs)
其中Wp和Ws分别是通带和阻带的拐角频率(截止频率),其取值范围为0至1之间。
当其值为1时代表采样频率的一半。
Rp和Rs分别是通带和阻带区的波纹系数。
三、Matlab滤波器的实现
1、低通滤波器的实现
CCS仿真滤波:
2、带通滤波器的实现
带通的中心频率为wp0=0.5pi,通带截止频率为wp1=0.4pi,wp2=0.6pi;通带最大衰减ap=3dB;阻带最小衰减as=15dB;阻带截止频率ws2=0.3pi,ws2=0.7pi.
3、高通滤波器的实现
4、程序清单
、主程序iir55.c
#include“math.h”
#definesignal_1_f500;
#definesignal_2_f10000;
#definesignal_sample_f25000;
#definepi3.1415926
#defineIIRNUMBER_L2
#definebufer_L256
intN_L=IIRNUMBER_L;
intdata_in[bufer_L];
intout[bufer_L];
intx[IIRNUMBER_L+1];
inty[IIRNUMBER_L+1];
intk=0;
intbufer=bufer_L;
intfBn[IIRNUMBER_L]={0,0x634a};//滤波系数Bi
intfAn[IIRNUMBER_L]={0xe5c,0xe5c};//滤波系数Ai
externintiir(int*xint*y,int*fAn,int*fBn,intN_L);
externintinit(int*,int*,int);
externintoutdata(int*,int,int);
voidintputwave();
voidmain()
{
intiirout;
intputwave();
init(x,y,N_L);
while
(1)
{
x[0]=data_in[k];
iirout=iir(x,y,fAn,fBn,N_L);//滤波
outdata(out,iirout,bufer) ;
k++ ;//断点,动画运行
if(k>=bufer_L)
{
k=0;
}
}
}
voidinputwave
{
floatwt1;
floatwt2;
inti;
for(i=0;i<=bufer_L;i++)
{wt1=2*pi*i*signal_1_f;
wt1=wt1/signal_sample_f;
wt2=2*pi*i*signal_2_f;
wt2=wt2/signal_sample_f;
data_in[i]=(cos(wt1)+cos(wt2))/2*32768;
}
}
、滤波子程序iir.asm
.global_iir,_init,_outdata
-iirbestfrct;
*ar0=x[0],*ar1=y[0],*ar2=fAn[0],*ar3=fBn[0],t0=N_L
sub#1,t0;N-1
movt0,mmap(csr)
addt0,ar0
movxar2,xdp
movar2,cdp
mov#0,ac0
rptcsr
macmz*ar0-,*cdp+,ac0
addt0,ar1
movxar3,xdp
movar3,cdp
rptcsr
macmz*ar1-,*cdp+,ac0
mar*ar1+
movhi(ac0),*ar1
movhi(ac0),t0
bclrfrct
ret
_init ;clearx,ylenghtisN_L
sub#1,t0
movt0,mmap(csr)
mov#0,ac0
rptcsr
movac0,*ar0+
rptcsr
movac0,ar1
ret
_outdatamovt1,ac0
sub#2,ac0
movac0,mmap(csr)
addac0,ar0
rptcsr
delay*ar0-
mar*ar0+
movt0,*ar0
ret
.end
、链接命令文件Ink.cmd
-stack0x0500
-sysstack0x0500
-heap0x1000
-c
-u_Rest
-1rts55.lib
MEMORY
{
PAGE0:
RAM(RWIX):
origin=0x000100,length=0x01ff00
ROM(RIX):
origin=0x020100,length=0x01ff00
VECS(RIX):
origin=0xffff00,length=0x000200
PAGE2:
IOPORT(RWI):
origin=0x00000,length=0x020000
}
SECTIONS
{.text>ROMPAGE0
.data>ROMPAGE0
.bss>RAMPAGE0
.const>RAMPAGE0
.sysmem>RAMPAGE0
.stack>RAMPAGE0
.sysstack>RAMPAGE0
.cio>RAMPAGE0
.switch>RAMPAGE0
.cinit>RAMPAGE0
.pinit>RAMPAGE0
.vectors>VECSPAGE0
.ioport>IOPORTPAGE2
}
四、脉冲响应不变法及双线性变换法的优缺点:
脉冲响应不变法使得数字滤波器的单位脉冲响应完全模拟滤波器的单位冲激响应,也就是时域逼近良好,而且模拟频率Ω和数字频率ω之间呈线性关系。
ω=ΩT。
因而,一个线性相位的模拟滤波器(例如贝赛尔滤波器)通过脉冲响应不变法得到的仍然是一个线性相位的数字滤波器。
脉冲响应不变法的最大缺点是有频率响应的混叠效应。
所以,脉冲响应不变法只是用于限带的滤波器(例如,衰减特性很好的低通或带通滤波器),而且高频衰减越快,混叠效应越小。
至于高通和带阻滤波器,由于它们在高频部分不衰减,因此将完全混淆在低频响应中。
如果要对高通和带阻滤波器采用脉冲响应不变法,就必须先对高通和带阻滤波器加一保护滤波器,滤掉高于折叠频率以上的频率,然后再使用脉冲响应不变法转换为数字滤波器。
当然这样会进一步增加设计复杂性和滤波器的阶数。
双线性变换法优缺点:
双线性变换法与脉冲响应不变法相比,其主要的有点是避免了频率响应的混叠现象。
这是因为S平面与Z平面是单值的一一对应关系。
S平面整个jΩ轴单值地对应于Z平面单位圆一周,即频率轴是单值变换关系。
各种滤波器的技术指标:
(1)低通滤波器的技术指标:
H(ejw)=1,0(2)带通滤波器的技术指标:
H(ejw=0,0(3)高通滤波器的技术指标:
H(ejw)=0,0(4)带阻滤波器的技术指标:
H(ejw)=1,0五、实验中遇到的问题
在学习DSP课程时只是详细了解低通滤波器的设计,这次的小学期课程设计中还加入了带通和高通滤波器,在设计过程中参数的选择非常重要,经常在调试中达不到应有的效果,在反复的实验中才能得到应有的平滑的滤波结果。
在Matlab仿真软件中使用fdatool仿真出的参数分析时,会有负数出现,然而在CCS6000中运行中却不能出现负数使用其相反数也能达到应有的效果。
没有分析出具体原因,会在日后的学习中注意此类问题。