IIR 滤波器实验.docx
《IIR 滤波器实验.docx》由会员分享,可在线阅读,更多相关《IIR 滤波器实验.docx(14页珍藏版)》请在冰豆网上搜索。
![IIR 滤波器实验.docx](https://file1.bdocx.com/fileroot1/2022-11/28/115e2732-dead-4678-a02e-4469b08202d3/115e2732-dead-4678-a02e-4469b08202d31.gif)
IIR滤波器实验
实验五IIR滤波器实验
一实验目的
(1)了解IIR滤波器的原理及使用方法;
(2)了解使用Matlab语言设计IIR滤波器的方法;
(3)了解DSP对IIR滤波器的设计及编程方法;
(4)熟悉对IIR滤波器的调试方法;
二实验内容
本试验要求设计滤波器采样频率为600hz,截止频率200hz的高通滤波器。
设计IIR滤
波器实现上面要求。
输入信号频率为100HZ和300HZ的合成信号,目的是通过我们设计的滤波器将100HZ
的信号滤掉,余下300HZ的信号成分,达到滤波的效果。
三实验原理
数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:
系统的转移函数为:
设N=M,则传输函数变为:
转换成极零点表示为:
式中,
表示零点,
表示极点,它具有N个零点和N个极点,如果任何一个极点在Z平面单位圆外,则系统不稳定。
如果系数bj全都为0,滤波器成为非递归的FIR滤波器,这时系统没有极点,因此FIR滤波器总是稳定的。
对于IIR滤波器,有系数量化敏感的缺点。
由于系统对序列施加的算法,是由加法、延时和常系数乘三种基本运算的组合,所以可以用不同结构的数字滤波器来实现而不影响系统总的传输函数。
图4.1是四阶直接型IIR滤波器的结构。
图4.1四阶直接型IIR滤波器的结构
四实验步骤
1.滤波器的Matlab语言设计
在Matlab中使用滤波器设计工具箱(FDA)设计滤波器。
图4.2打开的FDA主界面图
上图4.2是打开的滤波器设计的主界面图,在图4.2上可以设计各种满足用户要求的
滤波器,包括滤波器的类型(IIR或FIR)、滤波器的阶数、滤波器的种类、滤波器的截至频率、带宽、纹波系数、采样频率等各种和设计滤波器有关的所有参数。
图中,我们设计IIR型的3阶切比雪夫I型的采样频率为600HZ,截至频率为200HZ的低通滤波器。
图中中间显示的数据为设计好的滤波器参数。
下图4.3是对应频率特性图。
图4.3滤波器的频率特性图
下图4.4是对应的冲击响应特性图。
图4.4滤波器的冲击响应特性图
图4.5是对应的滤波器阶跃特性图。
图4.6是对应的滤波器极零点示意图。
图4.7是对应的滤波器结构示意图。
图4.5滤波器阶跃特性图。
图4.6滤波器的极零点示意图
图4.7滤波器的结构示意图
2.从Matlab语言转换成通用语言
使用Matlab语言设计出滤波器的参数之后,紧接着需要编写通用的语言,以便向DSP
所需要的汇编语言转换,也直接使用C语言,然后调用CCS自带的C编译器将C语言转换
成汇编语言,但一般情况下,滤波器对实时要求比较高,而整个滤波器的程序编写也不是很
大,所以建议采用汇编语言编写。
滤波器设计的第二步需要编写通用的语言,在这里,我们仍然使用Matlab语言编写易
懂的语句。
下面程序是编写后的程序。
浅显易懂,移值性强。
*********************滤波器程序*****************************************
clearall;清寄存器值
clf;清屏
N=256;数据点数
Fs=600;采样频率
dt=1/fs
forK=1:
N
f1=300;信号频率
f2=100;信号频率
y(k)=sin(2*pi*f1*k*dt)+sin(2*pi*f2*k*dt)+sin(2*(f1+20)*k*dt);产生信号
end
lp=200;截止频率
wn1=2lp/fs;函数的参数
[zl,pl,kl]=CHEBY1(3,0.5,wnl,’high’);滤波器的极零点表示
[B,A]=CHEBY1(3,0.5,wnl,’high’);滤波器的传递函数表示
yy1
(1)=0;
yy1
(2)=0;
b
(1)=0.0580;b
(2)=-0.1741;b(3)=0.1741;b(4)=-0.058;
a
(1)=1;a
(2)=1.1795;a(3)=0.918;a(4)=0.2742
n=254;
fori=1:
n
yy1(i)=b(4)*y(i+3)+b(3)*y(i+2)+b
(2)*y(i+1)+
b
(1)*y(i)+a(4)*yy1(i+2)+a(3)*yy1(i+1)+a
(2)*yy1(i);
end
滤波
y=fft(y,N);将信号做FFT变换
pyy=y.*conj(y);做功率谱分析
f=(0:
(N/2-1));
figure
(1);
plot(f,pyy(1:
N/2))
y=fft(yy1,N);将滤波后数据做功率谱分析
pyy=y.*conj(y);
f=(0:
(N/2-1));
figure
(2);
plot(f,pyy(1:
N/2))
对程序的说明:
程序有四个部分,
第一部分是用for循环产生需要滤波的信号;
第二部分是生成Cheby1滤波器,其中产生极点和零点;
第三部分是进行滤波;
第四部分画出信号的功率谱图。
图4.8和图4.9分别是滤波前和滤波后的信号功率谱图。
图4.8滤波前的信号功率谱图
图4.9滤波后的信号功率谱图
3.滤波器的汇编语言设计
在编写汇编程序之前,首先将滤波器的参数写出,从上面滤波器的设计中我们得出滤
波器的参数如下,这些参数从图4.2打开的FDA主界面图可以看到。
图4.10是滤波器的
参数显示图。
图4.10滤波器的参数图
显然,图4.10所提供的滤波器的参数不能直接拿到DSP汇编语言中去,图4.10中的
设计有大于1的数据,例如分母中的第二个参数,这样一个大于1的数据,直接放入DSP
中,需要进行数据格式的浮点运算。
将导致编程的复杂程度,而且也会导致DSP运行程序
速度的降低。
一般情况下我们都不这样使用,而是将数据做一定比例的压缩后计算(当然
如果一定需要这样做,也是可以的,对浮点数据的处理可以参考我们的实验1)。
将数据做8倍的压缩,得到新的数据为:
分子:
0.00725-0.0276250.027625-0.00725
分母:
1.0000.14743750.114750.034275
可以注意到只有一个参数没有压缩,就是分母的第一个参数。
请读者思考。
针对以上滤波参数,编写汇编语言程序如下:
.mmregs
.reffilter_start
K_DATA_SIZE.set256;输入数据个数
K_BUFFER_SIZE.set8
K_STACK_SIZE.set256;堆栈
K_A.set3;a的个数
K_B.set4;b的个数
K_CIR.setK_BUFFER_SIZE
STACK.usect"stack",K_STACK_SIZE
SYSTEM_STACK.setK_STACK_SIZE+STACK
DATA_DP.usect"filter_vars",0
filterdata.usect"filter_vars",K_DATA_SIZE
bufferdatay.usect"filter_vars",K_BUFFER_SIZE*2
bufferdatax.usect"filter_vars",K_BUFFER_SIZE*2
.data
.globalinputdata
inputdata
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16305
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16304
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16304
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16304
.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957
.WORD12879,-1643,-5536,11893,19128,4966,428,16304
.text
.asgAR2,ORIGIN
.asgAR3,INPUT
.asgAR4,FILTER
.asgAR5,OUTPUT
START:
SSBXFRCT
SSBXINTM
LD#DATA_DP,DP
STM#STACK,SP
CALLfilter_start
NOP
NOP
NOP
LOOP
BLOOP
.defb1,b2,b3,a1,a2
.deffilter_start
b1.set00EDH;b1=0.00725
b2.set-02C9H;b2=-0.027625
b3.set02C9H;b3=0.02762
b4.set-00EDH;b4=-0.00725
a1.set12DFH
a2.set0ED0H
a3.set0463H
.text
filter_start:
STM#K_CIR,BK
STM#1,AR0;设置循环缓冲区大小和步长
STM#inputdata,ORIGIN
STM#bufferdatax,INPUT
STM#bufferdatay,FILTER
STM#filterdata,OUTPUT
;初始化
RPT#K_A-1;a1,a2,a3的个数
MVDD*ORIGIN+,*INPUT+0%;初始化头3个Ys
STM#bufferdatax,INPUT
;设置初始化滤波数据
RPT#K_A-1;a1,a2,a3的个数
MVDD*INPUT+0%,*FILTER+0%;初始化3个Ys
STM#bufferdatay,FILTER
STM#bufferdatax,INPUT
;滤波
STM#K_DATA_SIZE-3-1,BRC;头3个值直接通过
RPTBfilter_end-1
;等待硬件中断
MVDD*ORIGIN+,*INPUT
RPT#K_B-1-1;b1,b2,b3,b4的个数
MAR*INPUT-0%;调整输入到相应位置
MPY*INPUT+0%,#b4,B;B=b4*x(i)
LDB,A
MPY*INPUT+0%,#b3,B;B=b3*x(i+1)
ADDB,A
MPY*INPUT+0%,#b2,B;B=b2*x(i+2)
ADDB,A
MPY*INPUT+0%,#b1,B;B=b1*x(i+3)
ADDB,A;y(x+3)=A
MPY*FILTER+0%,#a3,B;B=y(i)*a3
ADDB,A;A=A+B
MPY*FILTER+0%,#a2,B;B=y(i+1)*a2
ADDB,A;A=A+B
MPY*FILTER+0%,#a1,B;B=y(i+2)*a1
ADDB,A;y(x+3)=A+B
STHA,*FILTER-0%;FILTER++
STHA,*OUTPUT+
MAR*FILTER-0%;调整滤波器到相应位置
NOP
RET
.end
配置文件:
MEMORY{
PAGE0:
PARAM:
org=3000hlen=4000h
PAGE1:
DARAM:
org=100hlen=4000h
}
SECTIONS{
.text:
>PARAMPAGE0
stack:
>DARAMPAGE1
filter_vars:
>DARAMPAGE1
.bss:
>DARAMPAGE1
.data:
>DARAMPAGE1
}
程序运行结果如下:
如果使用我们提供的配置文件,其中滤波前的数据首地址放在数据存储空间的地址
320H处,滤波后的数据首地址放在数据存储空间的地址200H。
图4.11滤波前CCS中的数据时域波形
图4.12滤波前CCS中的数据频域波形
图4.13滤波后CCS中的数据时域波形
图4.14滤波后CCS中的数据频域波形