您的当前位置:首页正文

IIR数字低通滤波器设计及DSP实现

2021-04-27 来源:个人技术集锦
IIR数字低通滤波器的设计及DSP实现

一、 设计要求

设计一个通带截止频率为5KHz的数字低通滤波器,其中采样频率为100KHz,其它设计参数自拟。并利用DSP编程实现对输入为1.5KHz、10KHz、20KHz的合成波形的滤波。

二、 设计过程

1. 设计目标

根据所给的设计要求,确定设计目标如下:

在通带截止频率5KHz处的衰减不大于3dB,在阻带截止频率10KHz处的衰减不小于30dB,A/D采样频率为100KHz。

用双线性变换法进行设计,巴特沃斯型低通滤波器。

2. 模拟参数转化为数字参数

s通带截止频率p= Fs=0.1,阻带截止频率s= Fs=0.2。通带最大衰减为

pp=3dB,阻带最小衰减为s=30dB,同时根据巴特沃斯滤波器的“通带最平幅度”特性可

以定出通带最大衰减在

p处,而阻带最小衰减在s处。

3.利用MATLAB获取滤波器的参数

(1)MATLAB程序如下:

clear;close;

Fs=100000; Ap=3;As=30;

Wp=2*Fs*tan(pi/20);Ws=2*Fs*tan(pi/10);%预畸变处理

[n,Wn]=buttord(Wp,Ws,Ap,As,'s');

[b,a]=butter(n,Wn,'s');%离散化处理

[bn,an]=bilinear(b,a,Fs) %没有加分号,方便获取参数

[H1,W]=freqz(bn,an);

plot(W*50/pi,20*log10(abs(H1)/max(H1)));grid;

xlabel('频率(KHz)');ylabel('幅度(dB)');

(2)得到参数如下:

bn =

1.0e-003 *

0.0678 0.3388 0.6776 0.6776 0.3388 0.0678

an =

1.0000 -3.9564 6.3496 -5.1551 2.1137 -0.3497

(3)得到差分方程为:

y(n)b0x(n)b1x(n1)b2x(n2)b3x(n3)b4x(n4)b5x(n5)

(a1y(n1)a2y(n2)a3y(n3)a4y(n4)a5y(n5))

(4)得到的滤波器的幅频特性图如图1:

0-50-100幅度(dB)-150-200-250-300-350051015202530频率(KHz)35404550

图1

(5)对幅频特性图局部放大以查看其是否满足设计的要求

-5-2.35-10-15-2.4-20幅度(dB)幅度(dB)-25-30-35-40-2.45-2.5-45-50-2.554.9854.994.99555.005频率(KHz)5.015.015-55

7891011频率(KHz)121314

图2 (5KHz处放大图) 图3 (10KHz处放大图)

从以上两张图中可以读出所设计的滤波器在10KHz处恰好满足衰减30dB,而在5KHz处的衰减为2.45dB,小于3dB,有富裕产生,满足要求。

三、 用CCS2进行仿真测试

1. 用C语言编程实现第二步设计的低通滤波器,其中,滤波器的差分方程已经在第二步的3.(3)中给出。设计的C语言程序如下:

#include \"myapp.h\"

#include \"csedu.h\"

#include \"scancode.h\"

#include

#define PI 3.1415926

double a[6]={ 1.0000,-3.9564,6.3496,-5.1551,2.1137,-0.3497};

double

b[6]={0.0000678,0.0003388,0.0006776,0.0006776,0.0003388,0.0000678};

float fXn[6]={ 0.0 },fYn[6]={0.0};

float fInput,fOutput;

int i;

float fIn[1024],fOut[1024]; //1024个点,便于对信号进行谱分析

int nIn,nOut;

/**************************************************************************/

/*信号采集程序 采样频率为100KHz*/

/**************************************************************************/

float InputWave() //采样离散信号(IIR --连续信号)并进行叠加

{

for ( i=5;i>0;i-- )

fXn[i]=fXn[i-1]; //将采到的信号依次移入下一个存储单元

fXn[0]=sin(0.03*PI*nIn)+sin(0.2*PI*nIn)+sin(0.4*PI*nIn);

//x(t)=sin(3000*PI*t)+sin(20000*PI*t)+sin(40000*PI*t)

return(fXn[0]);

}

float IIR() //对叠加信号进行低通滤波

{

double b_sum,a_sum;

fXn[0] = fInput;

for (i=0; i<5; i++) //将缓存到fXn[6]和fYn[6]中的信号值按照差分方程求和

{

b_sum = b[i]*fXn[i] + b_sum;

a_sum = a[i+1]*fYn[i+1] + a_sum;

}

fYn[0] = b_sum - a_sum;

for (i=5; i>=1; i--) //将信号值更新

{

fXn[i] = fXn[i-1];

fYn[i] =fYn[i-1];

}

return(fYn[0]);

}

main()

{

nIn=0; nOut=0;

while ( 1 )

{

fInput=InputWave(); //输入叠加以后的波形

fIn[nIn]=fInput;

nIn++; nIn%=1024;

fOutput=IIR(); //

fOut[nOut]=fOutput; //输出经过滤波的波形

nOut++; /* break point */

if ( nOut>=1024 )

{

nOut=0;

}

}

}

2. 编译运行程序,观察输入输出波形

(1)输入输出的信号波形如图4(其中上半部分为叠加的输入波形,下半部分为滤波后的波形)。

图4

(2)输入波形的频谱如图5

图5

(3)输出波形频谱如图6

图6

四、 数据分析及评价

1.就图4可以看出,三频率成分的叠加信号(上部分)经过所设计的低通滤波器后波形明显改善,可以直观的看出高频成分被滤除掉了。

2. 对比图5、图6可以明显的看出,输入的波形有三个频率成分(横坐标对应于0.015、0.100、0.200),而经过低通滤波后,10KHz(图中坐标0.100)和20KHz(图中坐标对应于0.200)的频率成分较好的被滤除,完全达到设计要求了!

3. 本次设计的滤波器类型为直接型,也即经典型,虽然从概念上理解较容易,但是结构不稳定,误差相对较大,应当进一步改进,如采用级联型或并联型。

因篇幅问题不能全部显示,请点此查看更多更全内容