无限长单位脉冲响应IIR滤波器的设计
一.设计目的
1.掌握数字滤波器的设计过程; 2.了解IIR的原理和特性;
3.熟悉设计IIR数字滤波器的原理和方法; 4.学习IIR滤波器的DSP实现原理;
5.学习使用CCS的波形观察窗口观察输入/输出信号波形和频谱变化情况。
二.设计内容
1.通过MATLAB来设计一个低通滤波器,对它进行模拟仿真确定IIR滤波器系数。
2.用DSP汇编语言及C语言进行编程,实现IIR运算,对产生的合成信号,滤除信号中高频成分,观察滤波前后的波形变化。
三.设计原理
IIR滤波器与FIR滤波器相比具有相位特性差的特点,但它的结构简单,运算量小,具有经济高效的特点,并且可以用较少的阶数获得很高的选择性,因此也得到了广泛的应用。IIR数字滤波器系统的传递函数为:
Y(z)b0b1z1bNzNH(z)= X(z)1a1z1aNzN它具有N个极点和N个零点,如果任何一个极点在单位圆外,则系统不稳定。如果系数aj(j=1,… ,N)全部为0,则滤波器变成
非递归的FIR滤波器,系统总是稳定的。对于IIR滤波器,有系数量化敏感的缺点。由于系统对序列施加的算法是由加法、乘法和延时的基本运算的组合,所以可以用不同结构的数字滤波器来实现而不影响系统总的传输函数。
四.MATLAB设计IIR滤波器的方法
我们所用滤波器设计方法为巴特沃夫Butterworth滤波器设计和切比雪夫Chebyshev滤波器设计。
MATLAB的butter函数可以设计低通、带通、高通和带阻数字滤波器,其特征可以使通带内的幅度响应最大限度的平坦,但会损失截止频率处的下降斜度,使幅度响应衰减较慢,因此butter函数主要用于设计通带平坦的数字滤波器。如果期望幅度响应下降斜度大,衰减快,可以使用Elliptic(椭圆)或Chebyshev(切比雪夫)滤波器。 Buttord函数可以在给定滤波器性能的情况下,选择 Butterworth 数字滤波器的最小阶数。
这两个函数的使用格式如下:
[N,wc]= Buttord(wp,ws,Rp,Rs),根据滤波器wp,ws,Rp,Rs指标,求出巴特沃夫数字滤波器的阶数N和频率参数wc。
[b,a]=butter(N, wc),设计低通或带通数字滤波器; [b,a]=butter(N, wc,’high’),设计高通数字滤波器; [b,a]=butter(N ,wc,’stop’),设计带阻数字滤波器;
切比雪夫滤波器可分为ChebyshevI型和ChebyshevⅡ型两种类型,分别具有通带等波纹和阻带等波纹性能。Cheby1函数可设计低
通、带通、高通和带阻ChebyshevI型数字滤波器,其通带内为等波纹,阻带内为单调。ChebyshevI型滤波器的下降斜度比ChebyshevⅡ型大,但其代价是在通带内的波纹较大。Cheby1ord函数可以在给定滤波器性能的情况下,选择ChebyshevI型数字滤波器的最小阶数。
cheby1函数与cheby2函数基本相同,只是用cheby2所设计的滤波器,其通带内为单调的,阻带内为等波纹。cheby2函数可以设计低通、带通、高通和带阻ChebyshevⅡ型数字滤波器。Cheby2ord函数与cheby2函数配合使用,可设计出最低阶数的ChebyshevⅡ型数字滤波器。
这两个函数的使用格式如下:
[N,wn]=cheby1ord(wp,ws,Rp,Rs),根据滤波器wp,ws,Rp,Rs指标,求出ChebyshevI型数字滤波器的阶数N和频率参数wn。
[b,a]= cheby1(N,Rp,wn),设计低通或带通数字滤波器; [b,a]= cheby1(N,Rp,wn, ’high’),设计低通或带通数字滤波器; [b,a]= cheby1(N,Rp,wn,’stop’),设计带阻数字滤波器;
五.设计步骤
1.利用MATLAB来确定IIR滤波器的参数;
2.启动CCS,在CCS中建立一个汇编源文件,建立一个命令文件,并将这三个文件添加到工程,再编译并装载程序;
3.设置波形时域观察窗口,得到其滤波前后波形变化图; 4.设置频域观察窗口,得到其滤波前后频谱变化图。
六.设计源程序及信号波形、频谱变化图
源程序
#include \"math.h\" #define signal_1_f 500 #define signal_2_f 10000 #define signal_sample_f 25000 #define pi 3.1415926 #define IIRNUMBER_L 2 #define bufer_L 256 int N_L=IIRNUMBER_L; int data_in[bufer_L]; int out[bufer_L] ; int x[IIRNUMBER_L+1]; int y[IIRNUMBER_L+1]; int k=0;
int bufer=bufer_L;
int fBn[IIRNUMBER_L]={0,0x634a}; int fAn[IIRNUMBER_L]={0xe5c,0xe5c};
extern int iir(int *x,int *y,int *fAn,int *fBn,int N_L); extern int init(int *,int *,int); extern int outdata(int *,int,int); void inputwave();
void main() {
Int iirout; inputwave(); 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; } } }
void inputwave() {
float wt1; float wt2; int i;
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; } }
输入时域图形
]
输出时域图形
输入频域图形
输出频域图形
七.课设心得
通过此次课程设计,收获良多:
1.掌握了数字滤波器的设计过程; 2.了解了IIR的原理和特性;
3.熟悉了设计IIR数字滤波器的原理和方法; 4.学习了IIR滤波器的DSP实现原理; 5.练习了MATLAB的使用方法;
6.学习了使用CCS的波形观察窗口观察输入/输出信号波形和频谱变化情况。
IIR数字滤波器设计让我对数字信号处理有了更深的理解,虽然时间短暂,但是设计的过程使我体会到理论加实践对文化课的学习所产生的不一般的效果.在接下来的学习中,我会更加努力,力争取得更大的学习成果!
因篇幅问题不能全部显示,请点此查看更多更全内容