一、 设计要求
设计一个通带截止频率为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。通带最大衰减为
pp=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(n1)b2x(n2)b3x(n3)b4x(n4)b5x(n5)
(a1y(n1)a2y(n2)a3y(n3)a4y(n4)a5y(n5))
(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. 本次设计的滤波器类型为直接型,也即经典型,虽然从概念上理解较容易,但是结构不稳定,误差相对较大,应当进一步改进,如采用级联型或并联型。 因篇幅问题不能全部显示,请点此查看更多更全内容