FIR滤波器设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FIR高通滤波器设计
南京师范大学物理科学与技术学院
专业:电子信息工程
姓名:陈实,07080518
指导教师:马青玉
日期:2011年6月
摘要:数字信号处理器(DSP)拥有强大的数字信号处理能力,FIR数字滤波器广泛地应用于数字信号处理领域,本设计基于FIR滤波器的原理,应用MATLAB软件设计FIR数字滤波器,应用DSP集成开发环境——CCS调试程序,用TMS320F2812来实现了FIR数字滤波。

具体工作包括:系统学习了TMS320F2812数字信号处理器的硬件结构、性能和DSP的集成开发环境CCS;复习FIR数字滤波器的基本知识,用窗函数法设计滤波器,基于MATLAB来计算数字滤波器的系数,对FIR滤波器进设计和仿真;应用DSP“集成开发环境”调试C语言程序,用TMS320F2812来实现了FIR数字滤波。

关键词:FIR滤波窗函数法CCS TMS320F2812 窗函数 matlab
目录1. 设计要求
2. FIR滤波器的设计原理
2.1数字滤波器的设计原理
2.2 FIR滤波器的基本结构
2.3 FIR滤波器的主要特点
3. FIR滤波器的设计方法及MATLAB实现3.1利用窗函数法设计滤波器的基本思想3.2 窗函数发设计高通滤波器
3.2.1常用的窗函数
3.2.2窗的选择与高通滤波器指标转换3.3 滤波器的MATLAB实现
3.3.1用MATLAB函数设计FIR滤波器
3.3.2 高通滤波器参数
3.4高通滤波器特性曲线
4. FIR滤波器的DSP实现
4.1 DSP实现FIR滤波器
4.2 滤波结果检验
4.3 与MATLAB计算结果比较
5. 讨论和结论
6. 参考文献
7. 附录(程序)
1、设计要求
1)产生一个多频信号,设计FIR 高通滤波器消除其中一些成分。

2)通过CCS 的graph view 波形和频谱显示,并和MATLAB 计算结果比较。

根据教学课件上要求,设计FIR 高通滤波器:阻带边缘频率10kHz ,通带边缘频率22kHz ,阻带衰减75dB ,采样频率50kHz 。

2、FIR 滤波器设计原理
2.1 数字滤波器的设计原理
数字滤波器的设计问题就是寻找一组系数ai 和bi ,使得其性能在某种意义上逼近所要求的特性。

如果在s 平面上去逼近,就得到模拟滤波器,如果在z 平面上去逼近,则得到数字滤波器。

数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。

一个线性位移不变系统的输出序列y (n )和输入序列x (n )之间的关系,
应满足常系数线性差分方程:
(2.1.1)
x (n )为输入序列,y (n )为输出序列,ai 、bi 为滤波器系数,N 为滤波器的阶数。

2.2 FIR 滤波器的基本结构
设h(n)(n =0,1,2⋯一1)为滤波器的冲激响应,输入信号为x(n),则FIR 滤波器就是要实现下列差分方程:
(2.2.1) 对式(2.2.1)进行z 变换,可得FIR 滤波器的传递函数:
(2.2.2) 由此可得到FIR 滤波器的结构如图1
所示
图1.FIR 滤波器直接型结构
0 )()()(110
≥---=∑∑=-=n i n y a i n x b n y M
i i N i i
)()()(1
0∑-=-=N i i n x i h n y )()()()(1
∑-=-==N i i z i h z X z Y z H
FIR 滤波器的单位冲击响应h(n)是一个有限长序列。

若h(n)为实数,且满足偶对称或奇对称的条件,即h(n)=h(N-1-n)或h(n)=-h(N-1-n),则FIR 滤波器具有线性相位特性。

2.3 FIR 滤波器的主要特点
1)单位冲击响应只有有限项;
2)FIR 滤波器无反馈回路,是一种无条件稳定系统; 3)FIR 滤波器可以设计成具有线性相位特性。

3、FIR 滤波器设计方法及MATLAB 实现 3.1 利用窗函数法设计滤波器的基本思想
FIR 滤波器的设计问题在于寻求一系统函数 ,使其响应 逼近滤波器要求的理想频率响应 。

窗函数设计的基本思想是要选取某一种合适的理想频率选择性滤波器,然后将它的脉冲响应截断以得到一个线性相位和因果的FIR 滤波器。

因此这种方法的重点在于选择某种合适的窗函数和一种理想滤波器。

对于给定的滤波器技术指标,选择滤波器长度和具有最窄主瓣宽度和尽可能小的旁瓣衰减的某个窗函数。

任何数字滤波器的频率响应 都是 的周期函数,它的傅立
叶级数展开式为:设理想滤波器的单位脉冲响应为hd(n),则有
(3.1.1) (3.1.2) 所求得的 一般是无限长的,且是非因果的。

从时域出发,设计h(n)逼近理想hd(n),获得有限冲激响应数字滤波器的一种可能方法就是把无穷级数截取为有限项级数来近似。

3.2 窗函数法设计高通滤波器 3.2.1常用的窗函数
比较常用的窗函数有:矩形窗函数、三角窗(Bartlett)函数、汉宁(Hanning)窗函数、海明(Hamming)窗函数、布莱克曼(Blackman)窗函数、凯瑟(Kaiser)窗函数。

几种窗函数对比如下表:
ω
ω
j e
z j z H e H ==|)()()(ω
j d
e H ω
ωj e z j z H e H ==|)()(⎰∑--∞
-∞===ππω
ωω
ωωπ
d e e H n h e
n h e H jn j d
d jn n d j d )(21)()()()(n h d )(ωj
e A w
表1.几种窗函数对比
3.2.2 窗函数选择与高通滤波器指标转换
用窗函数设计法,阻带达到最小衰减75dB根据要求,选择布莱克曼窗,窗函数长度为:N=5.98fs/过渡带宽度=5.98*50/12=24.9,可得出需要阶数N=25。

根据设计指标:阻带边缘频率10kHz,通带边缘频率22kHz,阻带衰减75dB,采样频率50kHz。

可以确定相对应的数字滤波器指标:f1=通带边缘频率-(过渡带宽度)/2=22000-12000/2=16kHz
通带截止频率:Ω1=2πf1/fs=0.64π
阻带最小衰减:αS=75dB
3.3 滤波器的MATLAB实现
FIR滤波器的设计,可以采用MATLAB的数字信号处理软件包所提供的专用函数方便地来设计,直接求取FIR滤波器系数。

MATLAB 中的工具箱(Toolbox)包含了许多实用程序。

它提供了多种FIR滤波器设计方法。

3.3.1用fir1函数设计FIR滤波器
MATLAB提供了相应的子程序来实现窗函数,例如:
wd=boxcar(N) %数组wd中返回N点矩形窗函数
wd=triang(N) %数组wd中返回N点三角窗函数
wd=hanning(N) %数组wd中返回N点汉宁窗函数
wd=hamming(N) %数组wd中返回N点哈明窗函数
wd=blackman(N) %数组wd中返回N点布莱克曼窗函数
wd=kaiser(N,beta)%数组wd中返回给定beta值时N点凯塞窗函数fir1函数用来设计标准频率响应的基于窗函数的FIR滤波器,可实现加窗线性相位FIR数字滤波器的设计。

具体语法如下:
b=fir1(n,wn)
b=fir1(n,wn,‘ftype’)
b=fir1(n,wn,window)
b=fir1(n,wn,‘ftype’,window)
其中n为滤波器的阶数;wn为滤波器的通带截止频率;ftype为用来决定滤波器的类型,当ftype=high时,可设计高通滤波器;当
ftype=stop时,可设计带阻滤波器。

window为用来指定滤波器采用的窗函数类型,window参数可采用的窗口函数有:Boxcar,Hanning,
Bartlett,Blackman,Kasier和chebwin等,其默认时为Hamming窗。

从而得到高通滤波器的冲激响应参数。

3.3.2 高通滤波器参数
根据计算所得指标,N=25,wn=0.64,ftype=‘high’,window=blackman,利用MATLAB设计窗函数与滤波器设计函数得到滤波器,所设计的数字滤波器脉冲响应系数如下表
h(0)=-0.0000 h(2)=0.0000 h(3)=-0.0008 h(4)=0.0016 h(5)=0.0019 h(6)=-0.0100 h(7)=0.0087 h(8)=0.0180 h(9)=-0.0492 h(10)=0.0204 h(11)=0.1095 h(12)=-0.2800 h(13)=0.3599 h(14)=-0.2800 h(15)=0.1095 h(16)=0.0204 h(17)=-0.0492 h(18)=0.0180 h(19)=0.0087 h(20)=-0.0100 h(21)=0.0019 h(22)=0.0016 h(23)=-0.0008 h(24)=0.0000 h(25)=-0.0000
表2.高通滤波器冲激响应系数
3.4高通滤波器特性曲线
通过以上所设计得到的高通滤波器幅频相频特性曲线如图:
图3.4.1 所设计的高通滤波器幅频相频特性曲线
4、FIR滤波器的DSP实现
DSP的实现过程主要包括:程序编写、在CCS环境下进行汇编语言编程调试和程序的下载。

4.1 DSP实现FIR滤波器
4.1.1程序设计步骤如图所示:
4.1.1程序设计步骤结构图
根据MATLAB得到的h[n],然后将脉冲响应值移位为因果序列。

完成的滤波器的差分方程为:
y[n]= -0.0008x[n-2]+0.0016x[n-3]+0.0019x[n-4]-0.0100x[n-5]
+0.0087x[n-6]+0.0180x[n-7]-0.0492x[n-8]+0.0204x[n-9]
+0.1095x[n-10]-0.2800x[n-11]+0.3599x[n-12]-0.2800x[n-13]
+0.1095x[n-14]+0.0204x[n-15]-0.0492x[n-16]+0.0180x[n-17]
+0.0087x[n-18]-0.0100x[n-19]+0.0019x[n-20]+0.0016x[n-21]
-0.0008x[n-22]
4.2 FIR滤波器结果检验
在CCS环境的view-->graph-->time/frequent下分别观看输入输出的时域图、频谱图,设置相关参数为32bit floating point,可以观察到滤波的结果。

左边fin为输入时域图,fout输出时域图,右边fin为输入频域图,fout输出频域图。

如下图所示:
图4.2.1 DSP滤波结果
4.3 MATLAB仿真结果对比
图4.3.1 MATLAB仿真滤波结果
从MATLAB仿真图和CCS环境下DSP的滤波结果对比,都达到了高通滤波的效果。

较为理想。

5、讨论和结论
从FIR高通滤波器滤波的结果可以看出,所得的滤波器对低频信号产生了一定的抑制作用,但是并不是完全理想的高通滤波器,低通的成分还是存在的,但是相对高通而言,从原来的低频信号比高频信号大相当多的倍数,到以高频信号为主,低频信号比高频信号校很多。

低频部分得到了相当大的抑制。

如果滤波得到的结果不太理想,若再将滤波器串联,再经过一次滤波,则可以得到滤波效果更好的结果。

同样,设计其他类型的FIR滤波器:FIR低通滤波器、FIT带通滤波器,或者其他指标的FIT滤波器,其原理和设计与此设计相似,只需要根据指标改变窗函数,得到相应的参数,设计滤波器的参数,都可以实现。

通过对本课题的研究,关于数字信号处理方面的知识得到了丰富和提高,尤其是数字信号处理从理论到实践操作提升了一个平台,熟悉了课题研究的整体思路和方法,认识到进行课题研究应具备的素质。

第一,对一个课题的研究必须要阅读大量的文献和书籍来获得一定的感性认识,然后才会有一定的思路和设计方法。

第二,理论基础知识的重要性。

论文涉及许多算法,会用到很多理论知识,需要日积月累、不断的学习。

第三,掌握各种设计软件的必要性。

应用功能强大的软件来进行计算、设计和仿真,可使研究工作得到事半功倍的效果。

研究工作要有信心,要虚心,要不畏困难、不断进取,这样才可以保证课题研究工作的圆满完成。

最后,感谢马老师这学期以来的耐心教导。

6、参考文献
[1] 高全西《数字信号处理——原理实现及应用》北京:电子工业出版社2006
[2] 《ICETEK-F2812-A评估板及教学试验箱实验指导书》
[3] 丁美玉《数字信号处理》西安:西安电子科技大学出版社2001
[4] DSP程序开发--MATLAB调试及直接目标代码生成.西安:西安电子科技大学出版社,2003
7、附录(程序)
MATLAB窗函数法设计滤波器得参数b:
n=[25];wnz=0.64;
window=blackman(n);
b=fir1(n-1,wnz,'high',window)
DSP实现滤波程序:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "f2812a.h"
#include"math.h"
#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF 10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
-0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
float fXn[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
main(void)
{
nIn=0; nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while ( 1 )
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if ( nOut>=256 )
{
nOut=0;
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if ( fSignal1>=f2PI ) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn[0]);
}
float FIR()
{
float fSum;
fSum=0;
for ( i=0;i<FIRNUMBER;i++ )
{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
MATLAB仿真程序:
clear;
close;
n=[25];wnz=0.64;
window=blackman(n);
b=fir1(n-1,wnz,'high',window)
figure;
freqz(b,1);
%不同颁率成分
fl=1/30;
f2=1.4;
T=1;%采样间隔
n=0:T:400;%采样间隔T=I:采样频率fs=l/T=l
fs=1/T;
kf=fs/2; %采样频牢的一半。

用于设计呼旨标归一化
x=sin(2*pi*fl*n)+(cos(2*pi*f2*(n-2)))/6;%产生输入信号xk=fft(x); %输入信号的频谱分析
y=filter(b,1,x);
yk=fft(y);
figure;
subplot(2,1,1);
plot(n,abs(xk));
subplot(2,1,2);
plot(n,abs(yk));。

相关文档
最新文档