DSP课程设计FIR高通滤波器设计.docx
《DSP课程设计FIR高通滤波器设计.docx》由会员分享,可在线阅读,更多相关《DSP课程设计FIR高通滤波器设计.docx(17页珍藏版)》请在冰豆网上搜索。
DSP课程设计FIR高通滤波器设计
FIR高通滤波器设计
师大学物科院
摘要
从实现方法方面考虑,将滤波器分为两种,一种是IIR滤波器,另一种是FIR滤波器。
FIRDF的最大优点是可以实现线性相位滤波。
而IIRDF主要对幅频特性进行逼近,相频特性会存在不同程度的非线性。
我们知道,无失真传输与滤波处理的条件是,在信号的有效频谱围系统幅频响应应为常数,相频响应为频率的线性函数。
另外,FIR是全零点滤波器,硬件和软件实现结构简单,不用考虑稳定性问题。
所以,FIRDF是一种很重要的滤波器,在数字信号处理领域得到广泛应用。
FIRDF设计方法主要分为两类:
第一类是基于逼近理想滤波器特性的方法,包括窗函数法、频率采样法和等波纹最佳逼近法;第二类是最优设计法。
其中窗函数计法的基本思想是用FIRDF逼近希望的滤波特性。
本次设计主要采用窗函数设计法,对理想滤波器进行逼近,从而实现高通滤波器的设计。
在MATLAB软件中,有一系列函数用于设计滤波器,应用时十分方便。
因此,在本次设计中,滤波器的设计主要采用MATLAB软件,编写适当的程序,得到滤波器的单位脉冲响应。
本设计对滤波器的硬件仿真主要使用CCS软件,通过对滤波器的硬件仿真,可以较为真实的看出滤波器的滤波效果。
关键字:
高通、FIRDF、线性相位、Hanning窗、MATLAB、CCS
正文
1.设计目标
产生一个多频信号,设计一个高通滤波器消除其中的低频成分,通过CCS的graphview波形和频谱显示,并和MATLAB计算结果比较
2.设计原理
1
2
2.1数字滤波器
数字滤波器(digitalfilter)是由数字乘法器、加法器和延时单元组成的一种装置。
其功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。
由于电子计算机技术和大规模集成电路的发展,数字滤波器已可用计算机软件实现,也可用大规模集成数字硬件实时实现。
数字滤波器广泛用于数字信号处理中,如电视、VCD、音响等。
按照滤波电路的工作频带为其命名:
设截止频率为fp,频率低于fp的信号可以通过,高于fp的信号被衰减的电路称为低通滤波器,频率高于fp的信号可以通过,低于fp的信号被衰减的电路称为高通滤波器;而带通吗,就是频率介于低频段截止频率和高频段截止频率的信号可以通过的电路。
2.2高通滤波器
高通滤波器是容许高频信号通过、但减弱(或减少)频率低于截止频率信号通过的滤波器。
对于不同滤波器而言,每个频率的信号的减弱程度不同。
它有时被称为低频剪切滤波器;在音频应用中也使用低音消除滤波器或者噪声滤波器。
高通滤波器与低通滤波器特性恰恰相反。
这样的滤波器能够把高频率的声音引导至专用高音喇叭(tweeter),并阻止可能干擾或者损害喇叭的低音信号。
使用线圈而不是电容的低通滤波器也可以同时把低频信号引导至低音喇叭(woofer)。
高通和低通滤波器也用于数字图像处理中在频域中进行变换。
2.3高通滤波器的分析
2.3.1高通滤波器的时域分析
在时域,信号经过系统的响应y(n)体现为激励x(n)跟系统单位抽样响应h(n)的卷积和y(n)=(n)×h(n)=ΣN–1m=0h(m)x(n-m)[223]。
对于长度为N的FIR系统,h(n)可以看成一个长度为N点的固定窗口,而x(n)则看成一个队列以齐步走的方式穿过h(n)窗口,每走一步,位于窗口中的x(n)部分的点跟h(n)的对应点的值相乘(即加权)再求和,所得结果构成此时系统的响应值y(n),x(n)队列每走一步就得到一个响应值y(n),即y(n)是h(n)对位于其窗口中的x(n)的加权求和。
高通滤波要求h(n)窗口具有波形锐化作用,即利用h(n)窗口加权和使得变化快的(即高频)正弦分量保留(理想高通)或衰减幅度小(实际高通),而变化缓慢(即低频)的正弦分量正负抵消(理想高通)或衰减幅度大(实际高通)。
设
其中N必须取奇数,
其中:
fs=11kHz,n为整数,即x(n)由100Hz的
x1(n)和1kHz的x2(n)两种频率的信号组成。
高通滤波的目的就是要尽可能地去掉x(n)中的低频分量x1(n),同时尽可能地保留x(n)中的高频分量x2(n)。
2.3.2高通滤波器的频域分析
在频域,信号经过系统的响应y(n)的频谱Y(ejω)体现为激励x(n)的频谱X(ejω)跟系统单位抽样响应h(n)的频谱H(ejω)(即系统的频谱)的乘积Y(ejω)=|H(ejω)|×|X(ejω)|×ejφH+φx,即响应的频谱Y(ejω)的幅值由系统频谱H(ejω)的幅值对激励频谱X(ejω)的幅值相乘(加权)得到,响应的频谱Y(ejω)的幅角由系统的频谱H(ejω)的幅角跟激励频谱X(ejω)的幅角相加(移相)得到[122]。
高通滤波要求系统幅度函数|H(jf)|对需要保留的高频信号频谱加权权重较大(理想时为1),对需要滤除的低频信号频谱加权权重较小(理想时为0)。
其中L为x(n)的长度(L=100),0≤k≤L-1,N为h(n)的有值长度,m、k均为整数,跟数字频率k相对应的模拟频率为f=fs×k/L(Hz)。
h(n)在不同N值时的频谱如图2所示(横轴单位为kHz),当N=11时,在f=m(kHz)即f=1kHz、2kHz、3kHz等处为1,而在f=(2m-0.5)(kHz)即f=1.5kHz、3.5kHz等处幅度最大。
而在f=(2m+0.5)(kHz)即f=2.5kHz、4.5kHz等处幅度最小,如图2(b);当N=5时,在f=mfs/5处为1,即f=2.2kHz、3.3kHz等处为1,在f=(4m-1)fs/10即f=3.3kHz处幅度最大。
而在f=(4m+1)fs/10即f=5.5kHz处幅度最小,如图2(c);当N=21时,在f=mfs/21即f=524Hz、1047Hz等处为1,在f=(4m-1)fs/42处幅度最大,而在f=(4m+1)fs/42处幅度最小,如图1
图1
用不同宽度的h(n)对x(n)的滤波在频域上表现如图2.2.1所示,图2.2.1(a)为x(n)的频谱|X(jf)|,从图2中可以看出x(n)中含有100Hz和1kHz两种频率的信号,图1(b)~(d)为不同长度的h(n)对同一x(n)的滤波情况,这跟在时域中分析的结论是一致的。
2.4FIR滤波器
从实现方法方面考虑,将滤波器分为两种,一种是IIR滤波器,另一种是FIR滤波器。
IIR滤波器保留了模拟滤波器较好的幅度特性,设计简单有效。
但这些特性是以牺牲相位特性为代价而获得的,然而现在许多数据传输,图像处理系统都越来越多的要求系统具有线性相位特性。
FIRDF的最大优点是可以实现线性相位滤波。
而IIRDF主要对幅频特性进行逼近,相频特性会存在不同程度的非线性。
我们知道,无失真传输与滤波处理的条件是,在信号的有效频谱围系统幅频响应应为常数,相频响应为频率的线性函数。
另外,FIR是全零点滤波器,硬件和软件实现结构简单,不用考虑稳定性问题。
所以,FIRDF是一种很重要的滤波器,在数字信号处理领域得到广泛应用。
FIRDF设计方法主要分为两类:
第一类是基于逼近理想滤波器特性的方法,包括窗函数法、频率采样法和等波纹最佳逼近法;第二类是最优设计法。
其中窗函数计法的基本思想是用FIRDF逼近希望的滤波特性。
本次设计主要采用窗函数设计法,对理想滤波器进行逼近,从而实现高通滤波器的设计。
2.5各种窗函数参数
各种窗函数的基本参数
窗函数类型
旁瓣峰值
(dB)
过渡带宽度
阻带最小衰减
(dB)
近似值
精确值
矩形窗
-13
4π/N
1.8π/N
-21
三角窗
-25
8π/N
6.1π/N
-25
汉宁窗
-31
8π/N
6.2π/N
-44
哈明窗
-41
8π/N
6.6π/N
-74
布莱克曼窗
-57
12π/N
11π/N
-80
Hanning(汉宁)窗的窗函数为:
图2汉宁窗
3.设计流程
1
2
3
1
2
3
3.1应用MATLAB设计滤波器:
为了满足高通滤波的效果,设置线性相位高通FIR的参数为:
通带截止频率
,阻带截止频率
,通带最大衰减
,阻带最小衰减
。
由以上参数,通过查表可得,hanning窗和haming窗都满足条件,我们选择hanning窗。
过渡带宽
,hanning窗的精确过渡带宽为
=6.2π/N,所以要求
,解之得N=25。
输入程序:
从而得到满足条件的高通FIRDF:
h(n)=[-0.0004,-0.0006,0.0028,0.0071,-0.0000,-0.0185,-0.0210,0.0165,0.0624,
0.0355,-0.1061,-0.2898,0.6249,-0.2898,-0.1061,0.0355,0.0624,0.0165,
-0.0210,0.0185,-0.0000,0.0071,0.0028,-0.0006,-0.0004]
其波形如图3所示,频谱如图4,其幅频特性和相频特性如图5。
图3图4
图5
3.2用CCS对高通滤波器进行仿真
设置输入信号fIn=sin(2πn/30)/2+cos(2πn*1.6),使用MATLAB运算得到的高通FIR滤波器进行滤波,滤去低频分量。
选择“Debug”菜单的“RUN”项,或按F12键运行程序。
观察“fin”、“fout”窗口中时域图形;观察滤波效果。
鼠标右键单击“Input”和“Output”窗口,选择“Properties…”项,设置“DisplayType”为“FFTMagitude”,再单击“OK”按钮结束设置。
观察“Input”、“Output”窗口中频域图形;理解滤波效果。
4.仿真波形
1
2
3
4
4.1MATLAB对高通FIRDF的设计
4.2CCS对高通FIRDF的应用仿真
5.设计结果
由MATLAB和CCS的仿真结果可以看出,此高通FIRDF可以实现高通滤波的功能,在输入为fIn=sin(2πn/30)/2+cos(2πn*1.6)时,输出波形中已不含w=1/30的低频分量,滤波效果良好,输出频谱中低频部分基本没有信号。
6.心得
通过这次课程设计,使我掌握了课程设计的基本思路和方法,掌握了课程设计说明书的基本撰写方法,了解了基本的设计思想和设计方法。
同时此次课程设计使我课程的基础知识和基本理论有了更深的理解和掌握,锻炼了我们综合运用所学知识的能力,并在理论分析设计、计算制图运用标准和规查阅设计手册与资料以及计算机应用能了等方面得到了初步的训练和提高,培养了我们严谨的科学态度。
这次课程设计使我进一步熟悉了计算工具软件---MATLAB.并进一步掌握了MATLAB的使用方法.对MATLAB语言的发展和特点有了更深的了解,熟悉其工作环境,在其应用方面也有了更深的了解,了解了MATLAB程序书写的一般思路及一般步骤,学会了用MATLAB解决复杂信号处理等问题的方法。
在课程设计的这段时间里,我认为收获还是很多的,不但进一步掌握了数字信号处理的基础知识及一门专业仿真软件的基本操作,还提高了自己的设计能力及动手能力,同时对于模拟滤波器来了个系统的总结。
更多的是让我看清了自己,明白了凡事需要耐心,实践是检验学习的唯一标准。
理论知识的不足在这次课设中表现的很明显。
这将有助于我今后的学习,端正自己的学习态度,从而更加努力的学习。
参考文献
1泉阙大顺主编.数字信号处理原理与实现.:
电子工业,2005
2程佩青.数字信号处理教程(第二版).:
清华大学,2001
3高西全数字信号处理-原理、实现及应用.:
电子工业,2010
附录
MATLAB程序------生成高通FIRDF
wp=pi/2;ws=pi/4;
DB=wp-ws;
N0=ceil(6.2*pi/DB);
N=N0+mod(N0+1,2);
m=1:
N;
wc=(wp+ws)/2/pi;
hn=fir1(N-1,wc,'high',hanning(N));
fw=abs(fft(hn));
figure
(1)
subplot(1,2,1)
plot(m,hn);grid;
subplot(1,2,2)
plot(m,fw);grid;
figure
(2)
freqz(hn)
xlabel('\omega^pi')
ylabel('|H(e^j\omega|dB)')
subplot(2,1,2)
xlabel('\omega^pi')
CCS程序
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
#include"f2812a.h"
#include"math.h"
#defineFIRNUMBER25
#defineSIGNAL1F1000
#defineSIGNAL2F4500
#defineSAMPLEF10000
#definePI3.1415926
floatInputWave();
floatFIR();
floatfHn[FIRNUMBER]={-0.0004,-0.0006,0.0028,0.0071,-0.0000,-0.0185,-0.0210,0.0165,0.0624,
0.0355,-0.1061,-0.2898,0.6249,-0.2898,-0.1061,0.0355,0.0624,0.0165,
-0.0210,0.0185,-0.0000,0.0071,0.0028,-0.0006,-0.0004
};
floatfXn[FIRNUMBER]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,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.6;
while
(1)
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++;nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if(nOut>=256)
{
nOut=0;/*请在此句上设置软件断点*/
}
}
}
floatInputWave()
{
for(i=FIRNUMBER-1;i>0;i--)
fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)/2.0+cos(fSignal2);
fSignal1+=fStepSignal1;
if(fSignal1>=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>=f2PI)fSignal2-=f2PI;
return(fXn[0]);
}
floatFIR()
{
floatfSum;
fSum=0;
for(i=0;i{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}