实验五 IIR滤波器实验
一 实验目的
(1) 了解IIR滤波器的原理及使用方法;
(2) 了解使用Matlab语言设计IIR滤波器的方法; (3) 了解DSP对IIR滤波器的设计及编程方法; (4) 熟悉对IIR滤波器的调试方法;
二 实验内容
本试验要求设计滤波器采样频率为600hz,截止频率200hz的高通滤波器。设计IIR滤波器实现上面要求。
输入信号频率为100HZ和300HZ的合成信号,目的是通过我们设计的滤波器将100HZ的信号滤掉,余下300HZ的信号成分,达到滤波的效果。
三 实验原理
数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:
NMiy[k]ai0x[ki]bi1iy[ki]
系统的转移函数为:
MH(z)Y(z)X(z)bk1Nkzk1k0akzk设N=M,则传输函数变为:
H(z)a0a1z1b1z1anzbnzN1N转换成极零点表示为:
NH(z)Cj1zzzpjj式中,zj表示零点,pj表示极点,它具有N个零点和N个极点,如果任何一个极点在Z平面单位圆外,则系统不稳定。如果系数bj全部为0,滤波器成为非递归的FIR滤波器,这时系统没有极点,因此FIR滤波器总是稳定的。对于IIR滤波器,有系数量化敏感的缺点。由于系统 对序列施加的算法,是由加法、延时和常系数乘三种基本运算的组合,所以
40
可以用不同结构的数字滤波器来实现而不影响系统总的传输函数。图 5.1是四阶直接型IIR滤波器的结构。
图 5.1 四阶直接型IIR滤波器的结构
四 实验步骤
1. 滤波器的Matlab语言设计
在Matlab中使用滤波器设计工具箱(FDA)设计滤波器。
图 5.2 打开的FDA主界面图
41
上图 5.2是打开的滤波器设计的主界面图,在图 5.2上可以设计各种满足用户要求的滤波器,包括滤波器的类型(IIR或 FIR)、滤波器的阶数、滤波器的种类、滤波器的截至频率、带宽、纹波系数、采样频率等各种和设计滤波器有关的所有参数。
图中,我们设计IIR型的3阶切比雪夫I型的采样频率为600HZ,截至频率为200HZ的低通滤波器。图中中间显示的数据为设计好的滤波器参数。
下图 5.3是对应频率特性图。
图 5.3 滤波器的频率特性图
下图 5.4是对应的冲击响应特性图。
图 5.4 滤波器的冲击响应特性图
图 5.5是对应的滤波器阶跃特性图。 图 5.6是对应的滤波器极零点示意图。 图 5.7是对应的滤波器结构示意图。
42
图 5.5 滤波器阶跃特性图。
图 5.6 滤波器的极零点示意图
图 5.7 滤波器的结构示意图
43
2. 从Matlab语言转换成通用语言
使用Matlab语言设计出滤波器的参数之后,紧接着需要编写通用的语言,以便向DSP所需要的汇编语言转换,也直接使用C语言,然后调用CCS自带的C编译器将C语言转换成汇编语言,但一般情况下,滤波器对实时要求比较高,而整个滤波器的程序编写也不是很大,所以建议采用汇编语言编写。
滤波器设计的第二步需要编写通用的语言,在这里,我们仍然使用Matlab语言编写易懂的语句。下面程序是编写后的程序。浅显易懂,移值性强。
************************* 滤波器程序 ************************
clear all;
clf; N=256; fs=600; dt=1/fs;
for k=1:N;
f1=300; f2=100; end
lp=200; wn1=2*lp/fs;
[z1,p1,k1] = CHEBY1(3,0.5,wn1,’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;
for i=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); pyy=y.*conj(y); f=(0:(N/2-1)); figure(1);
44
清寄存器值 清屏
数据点数 采样频率
信号频率 信号频率
y(k)=sin(2*pi*f1*k*dt)+sin(2*pi*f2*k*dt)+sin(2*pi*(f1+20)*k*dt); 产生信号
截止频率
函数的参数
滤波器的极零点表示
[B,A] = CHEBY1(3,0.5,wn1,’high’); 滤波器的传递函数表示
滤波
将信号做FFT变换 做功率谱分析
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滤波器,其中产生极点和零点; 第三部分是进行滤波;
第四部分画出信号的功率谱图。
图 5.8和图 5.9分别是滤波前和滤波后的信号功率谱图。
将滤波后数据做功率谱分析
图 5.8 滤波前的信号功率谱图
45
图 5.9 滤波后的信号功率谱图
3. 范例程序说明
该范例程序运行环境为CCS2.2for2000, 如果用户所用的开发环境为CC的话,可以自行创建工程文件,再将原文件导入。
用CCS2.2的load workspace 打开fir目录下的iir.wks,然后build all,程序将自动load(option\\customize\\program load option\\下的load program after…)打勾。运行后图标如图5.10所示
图5.10 范例程序图表
46
范例程序模拟120点的正弦基波双周期,叠加30次和40次谐波,滤波传递参数在iircoeff.h头文件中定义,滤波前和滤波后的数据时域和频域图如图5.10所示。用户可自行在MATLAB中验证。
关于IIR的参数设置,用户可参考TI的IIR库函数说明(TI文档SPRC072)。
47