DSP课程设计FIR高通滤波器设计.docx
《DSP课程设计FIR高通滤波器设计.docx》由会员分享,可在线阅读,更多相关《DSP课程设计FIR高通滤波器设计.docx(16页珍藏版)》请在冰豆网上搜索。
DSP课程设计FIR高通滤波器设计
FIR高通滤波器设计之五兆芳芳创作
南京师范大学物科院
摘要
从实现办法方面考虑,将滤波器分为两种,一种是IIR滤波器,另一种是FIR滤波器.
FIRDF的最大优点是可以实现线性相位滤波.而IIRDF主要对幅频特性进行迫近,相频特性会存在不合程度的非线性.我们知道,无失真传输与滤波处理的条件是,在信号的有效频谱范围内系统幅频响应应为常数,相频响应为频率的线性函数.另外,FIR是全零点滤波器,硬件和软件实现结构复杂,不必考虑稳定性问题.所以,FIRDF是一种很重要的滤波器,在数字信号处理领域得到普遍应用.
FIRDF设计办法主要分为两类:
第一类是基于迫近理想滤波器特性的办法,包含窗函数法、频率采样法和等波纹最佳迫近法;第二类是最优设计法.其中窗函数计法的根本思想是用FIRDF迫近希望的滤波特性.本次设计主要采取窗函数设计法,对理想滤波器进行迫近,从而实现高通滤波器的设计.
在MATLAB软件中,有一系列函数用于设计滤波器,应用时十分便利.因此,在本次设计中,滤波器的设计主要采取MATLAB软件,编写适当的程序,得到滤波器的单位脉冲响应.
本设计对滤波器的硬件仿真主要使用CCS软件,通过对滤波器的硬件仿真,可以较为真实的看出滤波器的滤波效果.
关头字:
高通、FIRDF、线性相位、Hanning窗、MATLAB、CCS
正文
1.设计目标
产生一个多频信号,设计一个高通滤波器消除其中的低频成分,通过CCS的graphview波形和频谱显示,并和MATLAB计较结果比较
2.设计原理
1.1数字滤波器
数字滤波器(digitalfilter)是由数字乘法器、加法器和延时单元组成的一种装置.其功效是对输入离散信号的数字代码进交运算处理,以达到改动信号频谱的目的.由于电子计较机技巧和大范围集成电路的成长,数字滤波器已可用计较机软件实现,也可用大范围集成数字硬件实时实现.数字滤波器普遍用于数字信号处理中,如电视、VCD、音响等.
依照滤波电路的任务频带为其命名:
设截止频率为fp,频率低于fp的信号可以通过,高于fp的信号被衰减的电路称为低通滤波器,频率高于fp的信号可以通过,低于fp的信号被衰减的电路称为高通滤波器;而带通吗,就是频率介于低频段截止频率和高频段截止频率的信号可以通过的电路.
1.2高通滤波器
高通滤波器是容许高频信号通过、但削弱(或削减)频率低于截止频率信号通过的滤波器.对于不合滤波器而言,每个频率的信号的削弱程度不合.它有时被称为低频剪切滤波器;在音频应用中也使用低音消除滤波器或噪声滤波器.高通滤波器与低通滤波器特性恰恰相反.这样的滤波器能够把高频率的声音引导至专用低音喇叭(tweeter),并阻止可能干擾或损害喇叭的低音信号.使用线圈而不是电容的低通滤波器也可以同时把低频信号引导至低音喇叭(woofer).高通和低通滤波器也用于数字图像处理中在频域中进行变换.
1.3高通滤波器的阐发
1.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).
1.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)的滤波情况,这跟在时域中阐发的结论是一致的.
1.4FIR滤波器
从实现办法方面考虑,将滤波器分为两种,一种是IIR滤波器,另一种是FIR滤波器.
IIR滤波器保存了模拟滤波器较好的幅度特性,设计复杂有效.但这些特性是以牺牲相位特性为代价而取得的,然而现在许多数据传输,图像处理系统都越来越多的要求系统具有线性相位特性.
FIRDF的最大优点是可以实现线性相位滤波.而IIRDF主要对幅频特性进行迫近,相频特性会存在不合程度的非线性.我们知道,无失真传输与滤波处理的条件是,在信号的有效频谱范围内系统幅频响应应为常数,相频响应为频率的线性函数.另外,FIR是全零点滤波器,硬件和软件实现结构复杂,不必考虑稳定性问题.所以,FIRDF是一种很重要的滤波器,在数字信号处理领域得到普遍应用.
FIRDF设计办法主要分为两类:
第一类是基于迫近理想滤波器特性的办法,包含窗函数法、频率采样法和等波纹最佳迫近法;第二类是最优设计法.其中窗函数计法的根本思想是用FIRDF迫近希望的滤波特性.
本次设计主要采取窗函数设计法,对理想滤波器进行迫近,从而实现高通滤波器的设计.
1.5各类窗函数参数
各类窗函数的根本参数
窗函数类型
旁瓣峰值
(dB)
过渡带宽度
阻带最小衰减
(dB)
近似值
精确值
矩形窗
-13
4π/N
π/N
-21
三角窗
-25
8π/N
π/N
-25
汉宁窗
-31
8π/N
π/N
-44
哈明窗
-41
8π/N
π/N
-74
布莱克曼窗
-57
12π/N
11π/N
-80
Hanning(汉宁)窗的窗函数为:
图2汉宁窗
3.设计流程
1.1应用MATLAB设计滤波器:
为了满足高通滤波的效果,设置线性相位高通FIR的参数为:
通带截止频率
,阻带截止频率
,通带最大衰减
,阻带最小衰减
.
由以上参数,通过查表可得,hanning窗和haming窗都满足条件,我们选择hanning窗.过渡带宽
,hanning窗的精确过渡带宽为
π/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,
]
其波形如图3所示,频谱如图4,其幅频特性和相频特性如图5.
图3图4
图5
1.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.1MATLAB对高通FIRDF的设计
1.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
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,
};
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);
}