哈工大数字信号处理实验二.docx
《哈工大数字信号处理实验二.docx》由会员分享,可在线阅读,更多相关《哈工大数字信号处理实验二.docx(17页珍藏版)》请在冰豆网上搜索。
哈工大数字信号处理实验二
HarbinInstituteofTechnology
数字信号处理实验报告
(二)
学生姓名:
江世凯
学号:
1122110307
班级:
1221103
专业:
电子科学与技术
任课教师:
李杨
所在单位:
电子工程系
2014年11月
实验二、函数法设计FIR数字滤波器
一、实验目的
(1)熟悉矩形窗、汉宁窗、海明窗和布莱克曼窗。
(2)掌握用上述窗函数法设计FIR数字滤波器的原理和方法。
(3)熟悉线性相位FIR数字滤波器特性。
(4)了解各种窗函数对滤波特性的影响。
二、实验原理与方法
如果所希望的滤波器的理想频率响应函数为Hd(ejω),则其对应的单位脉冲响应为
用窗函数w(n)将hd(n)截断,并进行加权处理,得到:
h(n)就作为实际设计的FIR数字滤波器的单位脉冲响应序列,其频率响应函数H(ejω)为
如果要求线性相位特性,则h(n)还必须满足:
根据上式中的正、负号和长度N的奇偶性又将线性相位FIR滤波器分成四类。
要根据所设计的滤波特性正确选择其中一类。
例如,要设计线性相位低通特性,可选择h(n)=h(N-1-n)一类,而不能选h(n)=-h(N-1-n)一类。
三、实验内容及步骤
(1)复习用窗函数法设计FIR数字滤波器一节内容,阅读本实验原理,掌握设计步骤。
2)编写程序。
①编写能产生四种窗函数的子程序。
②编写主程序。
主程序框图如下,仅供参考。
其中幅度特性要求用dB表示。
设:
画图时,用打印幅度特性。
第k点对应的频率为为使曲线包络更接近的幅度特性曲线,DFT变换区间要选大些。
例如窗口长度N=33时,可通过在h(n)末尾补零的方法,使长度变为64,再进行64点DFT,则可得到更精确的幅度衰减特性曲线。
四、上机实验内容
①设计低通FIR数字滤波器时,一般以理想低通滤波特性为逼近函数,即
用四种窗函数设计线形相位低通滤波器。
要求在两种窗口长度下,绘制相应的幅频和相频特性曲线,观察3dB和20dB带宽以及阻带最小衰减,比较四种窗函数对滤波器特性的影响。
五、实验运行及结果
1、矩形窗设计FIR滤波器
图1a矩形窗在N=15时的特性曲线
图1b矩形窗在N=33时的特性曲线
2.汉宁窗设计FIR滤波器
图2a汉宁窗在N=15时的特性曲线
图2b汉宁窗在N=33时的特性曲线
3.海明窗设计FIR滤波器
图3a海明窗在N=15时的特性曲线
图3b海明窗在N=33时的特性曲线
4.布莱克曼窗设计FIR滤波器
图4a布莱克曼窗在N=15时的特性曲线
图4b布莱克曼窗在N=33时的特性曲线
5.三角窗设计FIR滤波器
图5a三角窗在N=15时的特性曲线
图5b三角窗在N=33时的特性曲线
六、实验结果及误差分析
1.对于低通滤波器来说,过渡带宽大小依次为布莱克曼窗>海明窗>汉宁窗>矩形窗;阻带衰减的绝对值大小依次为布莱克曼窗>海明窗>汉宁窗>矩形窗。
2.对比N=15,N=33,明显N=33的幅频特性优于N=15的幅频特性,更为接近理想滤波器。
分析可知,N的值增大会使过渡带宽减小但是对于阻带最小衰减影响并不大,只有选择合适的窗函数才可以满足阻带衰减指标,然后再选择N满足过渡带宽指标。
3.窗函数设计FIR数字滤波器的关键在于合理选择窗函数及N。
4.利用窗函数设计FIR滤波器,原理简单,计算简单,只要选择合理的窗函数就能接近理想滤波器,但是,其很难控制滤波器的通带边缘,若碰到FIR的频率特性不能用简单函数表达,则计算变得非常困难。
工程中比较常用的窗函数有矩形窗函数、三角形((Bartlett)窗函数、汉宁(Harming)窗函数、汉明(Hamming)窗函数、布莱克曼(Blackman)窗函数和凯塞(Kaiser)窗函数。
这几种窗函数的比较见下表
窗类型
窗谱性能指标
加窗后滤波器的性能指标
最大旁瓣(dB)
主瓣带宽
阻带衰减(dB)
过渡带宽Δω
矩形窗
-13
2*2π/N
-21
0.9*2π/N
三角窗
-25
4*2π/N
-25
2.1*2π/N
hanning窗
-31
4*2π/N
-44
3.1*2π/N
hamming窗
-41
4*2π/N
-53
3.3*2π/N
Blackman窗
-57
6*2π/N
-74
5.5*2π/N
几种常用窗函数对比,窗函数的选择原则是:
①具有较低的旁瓣幅度尤其是第一旁瓣幅度;②旁瓣幅度下降速度要大以利增加阻带衰减;③主瓣的宽度要窄以获得较陡的过渡带。
通常上述三点很难同时满足。
当选用主瓣宽度较窄时,虽然得到较陡的过渡带,但通带和阻带的波动明显增加;当选用最小的旁瓣幅度时,虽能得到匀滑的幅度响应和较小的阻带波动,但过渡带加宽。
因此实际选用的窗函数往往是它们的折衷。
在保证主瓣宽度达到一定要求的条件下适当牺牲主瓣宽度来换取旁瓣波动的减少。
七、思考题
1、如果给定通带截止频率和阻带截止频率以及阻带最小衰减,如何用窗函数法设计线性相位低通滤波器?
写出设计步骤。
答:
(1)选择理想低通滤波器作逼近函数,为保证线性相位,取a=(N-1)/2。
(2)求单位冲激响应hd(n)。
(3)根据阻带衰减指标,选择窗函数形状,根据允许的过渡带宽Δω选定N值(查表)。
(4)将hd(n)与窗函数相乘得FIR数字滤波器的单位冲激响应h(n)。
(5)计算FIR数字滤波器的频率响应,并验证是否达到所要求的指标。
(6)由H(jω)计算幅度函数Hg(ω)和相位函数θ(ω)。
若不满足指标要求,重复步骤(3)-(5),直到满足要求。
2、如果要求用窗函数法设计带通滤波器,且给定上、下边带截止频率为ω1和ω2,试求理想带通的单位脉冲响应hd(n)。
答:
只需将一个高通滤波器器和一个低通滤波器相加,即可得到带通滤波器,具体设计过程与低通滤波器相同。
理想线性相位带通滤波器的频率响应为:
当0<ω1≤|ω|≤ω2<π时
=e-jωτ,当w为其他值时为0(τ=(N-1)/2)
当n≠τ时为{sin[(n-τ)ω2]-sin[(n-τ)ω1]}/π(n-τ),当n=τ时为(ω2-ω1)/π
当ω1=0,ω2=ωc时,即为理想线性相位低通滤波器,当ω1=ωc,ω2=π时,即为理想线性相位高通滤波器。
根据要求可选定窗函数ω(n)及窗的点数N。
由此可得
=
检验是否满足设计要求。
若不满足要求,则重新选用窗形式或N,再进行计算。
8、源代码
functionvarargout=lvboqi(varargin)
%LVBOQIMATLABcodeforlvboqi.fig
%LVBOQI,byitself,createsanewLVBOQIorraisestheexisting
%singleton*.
%H=LVBOQIreturnsthehandletoanewLVBOQIorthehandleto
%theexistingsingleton*.
%LVBOQI('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinLVBOQI.Mwiththegiveninputarguments.
%LVBOQI('Property','Value',...)createsanewLVBOQIorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforelvboqi_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtolvboqi_OpeningFcnviavarargin.
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelplvboqi
%LastModifiedbyGUIDEv2.527-Nov-201412:
36:
59
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@lvboqi_OpeningFcn,...
'gui_OutputFcn',@lvboqi_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforelvboqiismadevisible.
functionlvboqi_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
set(handles.editn,'String',30);
set(handles.editw,'String',1);
set(handles.editfm,'String',4);
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstolvboqi(seeVARARGIN)
%Choosedefaultcommandlineoutputforlvboqi
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakeslvboqiwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=lvboqi_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
functioneditn_Callback(hObject,eventdata,handles)
%hObjecthandletoeditn(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Hints:
get(hObject,'String')returnscontentsofeditnastext
%str2double(get(hObject,'String'))returnscontentsofeditnasadouble
%---Executesduringobjectcreation,aftersettingallproperties.
functioneditn_CreateFcn(hObject,eventdata,handles)
%hObjecthandletoeditn(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
editcontrolsusuallyhaveawhitebackgroundonWindows.
%SeeISPCandCOMPUTER.
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
functioneditw_Callback(hObject,eventdata,handles)
%hObjecthandletoeditw(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Hints:
get(hObject,'String')returnscontentsofeditwastext
%str2double(get(hObject,'String'))returnscontentsofeditwasadouble
%---Executesduringobjectcreation,aftersettingallproperties.
functioneditw_CreateFcn(hObject,eventdata,handles)
%hObjecthandletoeditw(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
editcontrolsusuallyhaveawhitebackgroundonWindows.
%SeeISPCandCOMPUTER.
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%---Executesonselectionchangeinpopupmenuk.
functionpopupmenuk_Callback(hObject,eventdata,handles)
%hObjecthandletopopupmenuk(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Hints:
contents=cellstr(get(hObject,'String'))returnspopupmenukcontentsascellarray
%contents{get(hObject,'Value')}returnsselecteditemfrompopupmenuk
%---Executesduringobjectcreation,aftersettingallproperties.
functionpopupmenuk_CreateFcn(hObject,eventdata,handles)
%hObjecthandletopopupmenuk(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
popupmenucontrolsusuallyhaveawhitebackgroundonWindows.
%SeeISPCandCOMPUTER.
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%---Executesonbuttonpressinpushbutton1.
functionpushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton1(seeGCBO)
N=str2double(get(handles.editn,'string'));
fz=str2double(get(handles.editw,'string'));
fm=str2double(get(handles.editfm,'string'));
k=get(handles.popupmenuk,'Value');
w=(fz/fm)*pi;
holdoff;
i=0;
n=0:
(N-1);
alpha=(N-1)/2;
m=n-alpha+eps;
hd=sin(w*m)./(pi*m);
ifk==1
B=boxcar(N);
elseifk==2
B=triang(N);
elseifk==3
B=hanning(N);
elseifk==4
B=hamming(N);
elseifk==5
B=blackman(N);
elseifk==6
B=bartlett(N);
end
h=hd.*(B)';
[H,m]=freqz(h,[1],1024,'whole');
db=20*log10(abs(H)+eps);
pha=unwrap(angle(H));
axes(handles.axes1),stem(n,h,'.r');
axis([0,N-1,-0.1,0.5]);
xlabel('n');
ylabel('h(n)');
title('实际低通滤波器的h(n)');
axes(handles.axes3),plot(m/pi,db,'m');
axis([0,2,-100,5]);
xlabel('w/pi');
ylabel('dB');
title('衰减特性(dB)');
grid;
axes(handles.axes2),plot(m,abs(H));
axis([0,7,0,1.5]);
title('幅频特性');
xlabel('频率W(rad)');
ylabel('幅值');
grid;
%axes(handles.axes4),plot(0:
4,zeros(5),'-k');
%holdon;
axes(handles.axes4),plot(m,pha);
%axis([0,4,-60,5]);
title('相频特性');
xlabel('频率(rad)');
ylabel('相位(rad)');
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
functioneditfm_Callback(hObject,eventdata,handles)
%hObjecthandletoeditfm(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesand