数字信号处理课设

 

信息科学与工程学院

数字信号处理课程设计实验报告

课题名称:  简单信号滤波演示系统 

学生姓名:                        

学    号:                        

专业班级:                        

指导老师:                        

实验时间:       2014.10.8        

目 录

第一章  概述.................................3

1.1 FIR、IIR概述.................................3

1.2题目要求......................................3

第二章  设计分析.............................5

2.1算法分析......................................5

2.2 在matlab中实现的分析........................6

第三章  MATLAB程序实现.......................8

3.1 程序主体介绍..................................8

3.2 子程序........................................9

3.3 程序调试及运行结果............................9

3.4 结果分析及问题分析...........................16

第四章  心得体会............................17

第五章  参考文献............................18

第六章  源代码..............................19

第一章           概述

1.1 FIR、IIR概述

数字滤波器是指输入输出均为数字信号,通过一定的运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分的器件。数字滤波器与模拟滤波器相比数字滤波器具有精度高、稳定、体积小、重量小、灵活等特点。主要分为两种:有限脉冲响应FIR和无限脉冲响应IIR。设计滤波器的主要要求有两种,一是幅频特性,一是相频特性。一般的滤波器主要是对幅频特性作出要求,如果对输出相频特性也有要求,就需要用到线性相位滤波器。IIR滤波器的设计主要有两类,一是借助于模拟滤波器设计进行,二是直接在频域或时域中进行设计。FIR滤波器的设计不能借助于模拟滤波器,也有两类设计方法,一是窗函数法,二是频率采样法。还有一种比较有效的方法是切比雪夫等波纹逼近法,需通过计算机辅助进行。

1.2题目要求

设计一个工作流程如图所示的信号滤波演示系统:

                              图2 滤波演示图

⑴ 信号发生器—根据信号选择分为两大类:

① 静态型:直接输入(或从文件读取)测试信号序列;

② 动态型:输入由多个不同频率正弦信号叠加组合而成的模拟信号公式

采样频率(Hz)以及采样点数,动态生成该信号的采样序列,作为测试信号。

⑵ 频谱分析—使用FFT 对产生的测试信号进行频谱分析并展示其幅频、相频特

   性,指定需要滤除或保留的频带,通过选择滤波器类型(IIR/FIR),确定对

   应的滤波器(低通、高通、带通、带阻)技术指标。

⑶ 滤波器设计—根据IIR/FIR 数字滤波器技术指标设计滤波器,生成相应的滤 

   波器系数,并展示对应的滤波器幅频(衰减)、相频特性。

① IIR DF 设计:使用双线性变换法,可选择滤波器基型(巴特沃斯或切比雪夫型);

② FIR DF 设计:使用窗口法,可选择窗口类型。

⑷ 数字滤波—根据设计的滤波器系数,对测试信号进行滤波。

① IIR DF:要求通过差分方程迭代实现滤波,未知初值置零处理;

② FIR DF:要求通过快速卷积实现滤波。可以选择使用重叠相加或重叠保留法进行卷积运算,并动态展示卷积运算的详细过程。

⑸ 输出信号分析—展示滤波后信号的幅频与相频特性,分析是否满足滤波要求。

   对同一滤波要求,根据输出信号频谱,对比分析各类滤波器的差异。

选做部分

将一段语音作为测试信号,通过频谱展示和语音播放,对比分析滤波前后语音信号的变化,进一步加深对数字信号处理的理解。

 

第二章 设计分析

2.1算法分析

此题目的实现可分为三个某块的设计实现:输入信号模块,设计滤波器模块,滤波模块。

首先明确各模块间的数据依赖关系:在输入信号模块得到信号后,对信号

进行频域分析,从而确定滤波器的相关技术指标,根据滤波器的技术指标与类型,在滤波器设计模块完成滤波器的设计,然后将滤波器的设计结果传递给滤波模块,滤波模块同时接收输入信号,从而通过运算,实现信号的滤波处理。

从数据传递关系上分析,滤波模块的实现依赖于其他模块的数据输出,因此放在最后设计。先设计输入模块。

因为此设计相对复杂,分模块设计,通过参数传递和接口实现分模块设计即检验,提高程序的稳定性与健壮性。

输入的实现可以有两种方式:静态输入和动态输入。静态输入选择从文本输入数据,将信号取样值以矩阵的形式存放在文本中。采用文件的读取就可以实现,比较容易。动态输入,即输入由一系列频率的正弦信号相加的组成的信号,需要经过采样的,注意在设置采样频率时一定要符合奈奎斯特准则,提高采样点数,增加频谱分辨率。最后输出一采样信号向量,传递给其余两模块。

滤波器的设计,通过输入信号的频谱分析,设置滤波器的参数,然后才可以设计滤波器。第一步需要总结设计滤波器需要哪些参数,通过学习可以总结,所有滤波器的参数有四个:通带截止频率、阻带截止频率、通带最大衰减、阻带最小衰减。

对滤波器的设计分两类:FIR和IIR,二则所需的函数及设计方法不同。IIR采用借助于模拟滤波器的方式,包括巴特沃斯滤波器和切比雪夫滤波器两种类型。FIR采用窗函数方式,有矩形窗、三角窗、汉明窗、汉宁窗、布莱克曼和凯塞窗。通过调用不同的函数来实现滤波器的设计。特别在实现窗函数滤波器时,各个函数的主要区别是不同的频率采样,可以通过选择结构实现,简化程序。通过滤波器的设计最后可以得到滤波器的系统函数的系数。分析滤波器的幅频特性和相频特性,如果不符合要求重新设定滤波器参数或者换成其他滤波器类型。如果性能符合要求,则将系数传递给滤波模块。

滤波模块不调用滤波函数,实现滤波功能根据滤波器类型的不同,有两种方式可以选择,一种是通过差分方程运算,一种是通过线性卷积运算。前者适合对IIR滤波器进行滤波,后者适合对FIR滤波器进行滤波。且线性卷积为实现对长序列的卷积运算,采用重叠相加法,采用动态变化展示运算过程。

2.2 在matlab中实现的分析

输入模块通过读取文件和直接输入数据运算可以很容易实现。在输入信号确定后,要对其进行频谱分析,从而确定滤波器的参数和类型(低通、高通、带通、带阻),此模块作用也就完成,将数据分别用全局变量传递给下面的模块。

设置模拟信号:

我采用的测试信号是两个正弦信号叠加而成的信号,信号为

y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)

其中频率f1=30;频率f2=50;频率f3=200;采样频率fs=3000;采样间隔

Ts=1/fs; 采样点数

N=1024;n=1:N

采集模拟信号的程序代码:

f1=30;  %  频率1
    f2=50; %  频率2

f3=200; % 频率3
    fs=3000;  %  采样频率
    Ts=1/fs;  %  采样间隔
    N=1024;    %  采样点数
    n=1:N;
    y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)+sin(2*pi*f1*n*Ts);  %  正弦波混合

频谱分析:

使用FFT对产生的测试信号进行频谱分析并展示其幅频特性与相频特性,

指定需要滤除的频带,通过选择滤波器类型IIR,确定对应的滤波器(低通、

高通)技术指标Fp、Fc、Rp、Rs。

滤波器的设计:

根据以上技术指标(通带截止频率、通带最大衰减、阻带截止频率、阻带最

小衰减),设计数字滤波器,生成相应的滤波器系数,并画出对应的滤波器

幅频特性与相频特性。分别设计巴特沃斯滤波器、切比雪夫I型滤波器、切

比雪夫II型滤波器、椭圆滤波器、yulewalk滤波器。

巴特沃斯和切比雪夫的滤波函数调用为:

[N,Wc]=buttord(wp,ws,rp,rs);    [N,Wc]=cheb1ord(wp,ws,rp,rs);

[B,A]=butter(N,Wc,’property’);   

 [B,A]=cheby1(N,rp,Wc,’property’);

 property对于低通和高通为’’,带通’high’,带阻’stop’;

     窗函数滤波器设计的调用函数:

求窗函数的阶数:

N=ceil((h*pi)/wdel);%wdel为窗函数的过渡带宽,h对应不同窗函数的值

wn=boxcar(N+1);  wn=triang(N+1);    wn=hanning(N+1);

wn=hamming(N+1); wn=blackman(N+1);

wn=kaiser(N+1,beta);%bata为kaiser的a参数

B=fir1(N,ws,'property',wn);

property对于低通和高通为’’,带通’high’,带阻’stop’;

数字滤波:    

根据设计的滤波器系数,对测试信号通过差分方程迭代实现滤波数字滤波,展示滤波后信号的幅频特性与相频特性,分析是否满足滤波要求(对同一滤波要求,对比分析各类滤波器的差异)。

需要注意的是,窗函数对滤波参数的使用,需要通过运算得到一窗函数阶数,对通带最大衰减无使用。需要注意FIR和IIR对参数的不同利用。

滤波模块:运用差分方程运算的滤波函数,可以用循环调用简单实现。动态展示线性卷积的重叠相加法可以用流程图来说明:

第三章 MATLAB程序实现

3.1 程序主体介绍

此程序界面也是采用GUI,不过是采用图形用户界面开发环境。和第一个对比,布局更加容易,很容易调整界面。但是在一些函数操作行会受一些限制,比如函数参数的传递,目前来说还是采用全局变量才能完成。

pushbutton1_Callback(hObject, eventdata, handles)

%获得输入信号

uipanel11_SelectionChangeFcn(hObject, eventdata, handles)

%获取滤波器的设计参数

uipanel15_SelectionChangeFcn(hObject, eventdata, handles)

%设计滤波器

pushbutton4_Callback(hObject, eventdata, handles)

%进行滤波

以上是一些功能控件,需要注意的是他们的view ballcak属性,对于groupbutton一组按钮,需要选用SelectionChangeFcn,其余选择callback属性即可。另外,handles函数作用为传递的句柄,是一结构体,调用时注意此处。其余和直接用函数创建GUI界面无太大区别。

3.2 子程序

     3.2.1   IIR滤波器

           巴特沃斯滤波器

     3.2.2   FIR滤波器

           矩形窗

          三角窗

          汉宁窗

          哈明窗

3.3 程序调试及运行结果

原始信号幅频特性及相频特性

巴特沃斯的幅频特性及相频特性

信号滤波后的幅频特性及相频特性

矩形窗的幅频特性及相频特性

信号滤波后的幅频特性及相频特性

三角窗的幅频特性及相频特性

信号滤波后的幅频特性及相频特性

汉宁窗的幅频特性及相频特性

信号滤波后的幅频特性及相频特性

哈明窗的幅频特性及相频特性

信号滤波后的幅频特性及相频特性

3.4 结果分析及问题分析

    用双线性变换法设计无限脉冲响应数字滤波器(IIF DF)时,先把数字滤波器指标转换成模拟滤波器的指标,然后根据模拟滤波器的指标设计模拟滤波器,再经过线性变换把模拟滤波器转换成数字滤波器。该系统要能够设计巴特沃兹型低通、带通、高通滤波器,并能够输入数字滤波器的性能指标,显示出滤波器的阶数和系数。该系统的关键部分是滤波器的设计部分,按照双线性变换法设计滤波器的步骤进行设计即可。

第四章 心得体会

 本次课程设计可以称为matlab和数字信号处理的综合设计,因为这次有一半的时间在研究matlab,有一半的时间在思考数字信号问题的解决。几天下来收获是很多的,对数字信号处理有了一次全面的回顾,而且也看到了matlab的神秘面容。只要是自己真正的努力去做了,就绝对不会后悔在课程设计上花费的时间。现在发现自己确实会的太少,而这次又学了太多,对自己以后的学习还是有鞭策意义的。

这次课程设计也使我认识到了matlab的强大,或者进一步说工具软件有着你意想不到的功效,能节省你的时间,同时又能够让你从实践上更深层次的认识到所学知识的奇妙,而且可以同时明白了学习与实践的相辅相成。对课程设计也是一直保持很高兴趣的,虽然有时为它焦头烂额,但是也会因此有柳暗花明的喜悦,任何事情都折射着一个普通的道理——付出才有回报。浅显的道理,却是需要我们用毅力来坚持见证的。

具体来说,通过本次课程设计,我掌握了MATLAB的基本运用,尤其是其中GUI可视化图形用户界面的设计,包括函数调用与在图形用户界面开发环境下的调用。函数的调用与参数的传递是两个简单却很容易出错的地方,自由细心才可以保证程序的健壮性。

对数字信号本身内容的理解来说,全书的内容确实是可以融合在这两个课程设计题目中的,一个是DFT运用,另一个是滤波器的设计和利用。对全书的内容可以做出最好的概括。其中滤波器的设计中,调用了许多滤波函数,这是本次实验有点欠缺的地方,但是仍然从整体上把握了整个滤波器的设计过程。

对于课程设计中出现的问题,解决的方式有两种,一是自己解决。可以上网,查阅图书和matlab的本身的帮助文件,不断尝试,自己修改错误,可以更好的反省。二是与同学相商。一加一不是等于二那么简单的,相互交流才是进步的最好方式。其中解决问题最重要的应该是坚持不懈,在遇到问题时,不放弃才有可能称为最后的胜利者。

     每次课程设计都收获颇多,而且每次都对自己的学习态度做一次调整,这个的作用确实是很大的,希望以后更加珍惜的课程设计的时间。

第五章 参考文献

[1] 丁玉美等.数字信号处理 [M].西安:西安电子科技大学出版社,2002

[2] 程佩青.数字信号处理教程,第二版[M].北京:清华大学出版社,2001

[3] 赵树杰等.数字信号处理[M].西安:西安电子科技大学出版社,1997

[4] 陈怀琛等.MATLAB 及在电子信息课程中的应用[M],北京:电子工业出版社出

    版,2002

[5] 余成波.数字信号处理及MATLAB实现,第一版[M].北京:清华大学出版社,

    2008

[6] S.K.Mitra.Digital Signal Processing: A Computer Based Approach,  

3rdEdition[M],New York, USA:McGraw-Hill,2000

[7] R.G.Lyons.Understanding Digital Signal Processing,2nd  

    Edition[M].New Jersey, USA:Prentice Hall,2005

第六章 源代码

function varargout = df(varargin)

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                   'gui_Singleton',  gui_Singleton, ...

                   'gui_OpeningFcn', @df_OpeningFcn, ...

                   'gui_OutputFcn',  @df_OutputFcn, ...

                   'gui_LayoutFcn',  [] , ...

                   'gui_Callback',   []);

if nargin && ischar(varargin{1})

    gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

    gui_mainfcn(gui_State, varargin{:});

end

function df_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

function varargout = df_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

function edit1_Callback(hObject, eventdata, handles)

function edit1_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit2_Callback(hObject, eventdata, handles)

function edit2_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit3_Callback(hObject, eventdata, handles)

function edit3_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit4_Callback(hObject, eventdata, handles)

function edit4_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit5_Callback(hObject, eventdata, handles)

function edit5_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function pushbutton1_Callback(hObject, eventdata, handles)

f=zeros(1,4);

f(1)=str2num(get(handles.edit2,'String'));

f(2)=str2num(get(handles.edit1,'String'));

f(3)=str2num(get(handles.edit3,'String'));

f(4)=str2num(get(handles.edit4,'String'));

T=str2num(get(handles.edit12,'String'));%采样周期%

fre=str2num(get(handles.edit5,'String'));%采样频率%

t=0:1/fre:T;

xn=10*sin(2*pi*t*f(1))+10*sin(2*pi*t*f(2))+10*sin(2*pi*t*f(3))+10*sin(2*pi*t*f(4));

set(handles.axes15,'userdata',xn);%将Xn放在用户数据userdata%

yn3=abs(fft(xn));%快速傅立叶变换(符频特性)%

n1=[0:length(yn3)-1]/length(yn3)*fre;%横坐标%

axes(handles.axes12);%坐标系编号%

stem(n1,yn3,'.');

axis([0,fre/2,0,max(yn3)]);%坐标轴单位控制%

title('信号的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

yn4=angle(fft(xn));%相频特性%

n4=[0:length(yn4)-1]/length(yn4)*fre;

axes(handles.axes16);

stem(n4,yn4,'.');

axis([0,fre/2,min(yn4),max(yn4)]);

title('信号的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

function edit6_Callback(hObject, eventdata, handles)

function edit6_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit7_Callback(hObject, eventdata, handles)

function edit7_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit8_Callback(hObject, eventdata, handles)

function edit8_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit9_Callback(hObject, eventdata, handles)

function edit9_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function pushbutton2_Callback(hObject, eventdata, handles)

xn=get(handles.axes15,'userdata');

fre=str2num(get(handles.edit5,'String'));

fp=str2num(get(handles.edit6,'String'));%通带最大频率 %

fs=str2num(get(handles.edit7,'String'));%阻带最小频率%

rp=str2num(get(handles.edit8,'String'));

rs=str2num(get(handles.edit9,'String'));

wp=2*fp/fre;ws=2*fs/fre;

[N,wc]=buttord(wp,ws,rp,rs,'s');%求阶数,截止频率%

  [B,A]=butter(N,wc,'s');%巴特沃兹模拟低通滤波器系数%

[Bz,Az]=bilinear(B,A,1);

[H,w]=freqz(Bz,Az);%分析数字滤波器%

axes(handles.axes14);

plot(w/pi,abs(H));

axis([0,1,0,max(abs(H))]);

title('巴特沃兹的幅频特性');

xlabel('w/π');

ylabel('|X(ejw)|');

axes(handles.axes17);

plot(w/pi,angle(H));

title('巴特沃兹的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

yn2=filter(Bz,Az,xn);%迭代法求解滤波信号%

yn=abs(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes15);

stem(n1,yn,'.');

title('信号滤波后的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

axis([0,fre/2,0,max(yn)]);

yn=angle(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes18);

stem(n1,yn,'.');

title('信号滤波后的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

axis([0,fre/2,min(yn),max(yn)]);

pushbutton1_Callback(hObject, eventdata, handles);

function edit10_Callback(hObject, eventdata, handles)

function edit10_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit11_Callback(hObject, eventdata, handles)

function edit11_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function pushbutton5_Callback(hObject, eventdata, handles)

xn=get(handles.axes15,'userdata');

fp=str2num(get(handles.edit10,'String'));

fs=str2num(get(handles.edit11,'String'));

fre=str2num(get(handles.edit5,'String'));

wp=2*fp/fre*pi;ws=2*fs/fre*pi;

    Bt=ws-wp;

    N0=ceil(1.8*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,boxcar(N));%单位序列相应%

yn=abs(fft(hn));

yn=20*log10(yn);

n1=[0:length(yn)-1]/length(yn)*2;

axes(handles.axes14);

plot(n1,yn);

title('矩形窗的损耗函数');

xlabel('w/π');

ylabel('20log|Hg(w)|');

axis([0,1,min(yn),max(yn)]);

axes(handles.axes17);

yn=angle(hn);

n1=[0:length(yn)-1]/length(yn)*2;

plot(n1,yn);

title('矩形窗的相频特性');

xlabel('w/π');

ylabel('相位');

axis([0,1,min(yn),max(yn)]);

yn2=fftfilt(hn,xn,512);%重叠相加法求滤波后序列%

yn=abs(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes15);

stem(n1,yn,'.');

title('信号滤波后的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

axis([0,fre/2,0,max(yn)]);

yn=angle(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes18);

stem(n1,yn,'.');

title('信号滤波后的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

axis([0,fre/2,min(yn),max(yn)]);

pushbutton1_Callback(hObject, eventdata, handles);

function pushbutton6_Callback(hObject, eventdata, handles)

xn=get(handles.axes15,'userdata');

fp=str2num(get(handles.edit10,'String'));

fs=str2num(get(handles.edit11,'String'));

fre=str2num(get(handles.edit5,'String'));

wp=2*fp/fre*pi;ws=2*fs/fre*pi;

    Bt=ws-wp;

    N0=ceil(6.1*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,bartlett(N));

yn=abs(fft(hn));

yn=20*log10(yn);

n1=[0:length(yn)-1]/length(yn)*2;

axes(handles.axes14);

plot(n1,yn);

title('三角窗的损耗函数');

xlabel('w/π');

ylabel('20log|Hg(w)|');

axis([0,1,min(yn),max(yn)]);

axes(handles.axes17);

yn=angle(hn);

n1=[0:length(yn)-1]/length(yn)*2;

plot(n1,yn);

title('三角窗的相频特性');

xlabel('w/π');

ylabel('相位');

axis([0,1,min(yn),max(yn)]);

yn2=fftfilt(hn,xn,512);

yn=abs(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes15);

stem(n1,yn,'.');

title('信号滤波后的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

axis([0,fre/2,0,max(yn)]);

yn=angle(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes18);

stem(n1,yn,'.');

title('信号滤波后的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

axis([0,fre/2,min(yn),max(yn)]);

pushbutton1_Callback(hObject, eventdata, handles);

function pushbutton7_Callback(hObject, eventdata, handles)

xn=get(handles.axes15,'userdata');

fp=str2num(get(handles.edit10,'String'));

fs=str2num(get(handles.edit11,'String'));

fre=str2num(get(handles.edit5,'String'));

wp=2*fp/fre*pi;ws=2*fs/fre*pi;

if(fp<fs)

    Bt=ws-wp;

    N0=ceil(6.2*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,hanning(N));

else

    Bt=wp-ws;

    N0=ceil(6.2*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,'high',hanning(N));

end

yn=abs(fft(hn));

yn=20*log10(yn);

n1=[0:length(yn)-1]/length(yn)*2;

axes(handles.axes14);

plot(n1,yn);

title('汉宁窗的损耗函数');

xlabel('w/π');

ylabel('20log|Hg(w)|');

axis([0,1,min(yn),max(yn)]);

axes(handles.axes17);

yn=angle(hn);

n1=[0:length(yn)-1]/length(yn)*2;

plot(n1,yn);

title('汉宁窗的相频特性');

xlabel('w/π');

ylabel('相位');

axis([0,1,min(yn),max(yn)]);

yn2=fftfilt(hn,xn,512);

yn=abs(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes15);

stem(n1,yn,'.');

title('信号滤波后的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

axis([0,fre/2,0,max(yn)]);

yn=angle(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes18);

stem(n1,yn,'.');

title('信号滤波后的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

axis([0,fre/2,min(yn),max(yn)]);

pushbutton1_Callback(hObject, eventdata, handles);

function pushbutton8_Callback(hObject, eventdata, handles)

xn=get(handles.axes15,'userdata');

fp=str2num(get(handles.edit10,'String'));

fs=str2num(get(handles.edit11,'String'));

fre=str2num(get(handles.edit5,'String'));

wp=2*fp/fre*pi;ws=2*fs/fre*pi;

if(fp<fs)

    Bt=ws-wp;

    N0=ceil(6.2*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,hamming(N));

else

    Bt=wp-ws;

    N0=ceil(6.2*pi/Bt);

    N=N0+mod(N0+1,2);

    wc=(wp+ws)/2/pi;

    hn=fir1(N-1,wc,'high',hamming(N));

end

yn=abs(fft(hn));

yn=20*log10(yn);

n1=[0:length(yn)-1]/length(yn)*2;

axes(handles.axes14);

plot(n1,yn);

title('哈明窗的损耗函数');

xlabel('w/π');

ylabel('20log|Hg(w)|');

axis([0,1,min(yn),max(yn)]);

axes(handles.axes17);

yn=angle(hn);

n1=[0:length(yn)-1]/length(yn)*2;

plot(n1,yn);

title('哈明窗的相频特性');

xlabel('w/π');

ylabel('相位');

axis([0,1,min(yn),max(yn)]);

yn2=fftfilt(hn,xn,512);

yn=abs(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes15);

stem(n1,yn,'.');

title('信号滤波后的幅频特性');

xlabel('频率(Hz)');

ylabel('|X(ejw)|');

axis([0,fre/2,0,max(yn)]);

yn=angle(fft(yn2));

n1=[0:length(yn)-1]/length(yn)*fre;

axes(handles.axes18);

stem(n1,yn,'.');

title('信号滤波后的相频特性');

xlabel('频率(Hz)');

ylabel('相位');

axis([0,fre/2,min(yn),max(yn)]);

pushbutton1_Callback(hObject, eventdata, handles);

% --- Executes during object creation, after setting all properties.

function axes12_CreateFcn(hObject, eventdata, handles)

% hObject    handle to axes12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    empty - handles not created until after all CreateFcns called

% Hint: place code in OpeningFcn to populate axes12

% --- Executes on mouse press over axes background.

function axes12_ButtonDownFcn(hObject, eventdata, handles)

% hObject    handle to axes12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

function edit12_Callback(hObject, eventdata, handles)

% hObject    handle to edit12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit12 as text

%        str2double(get(hObject,'String')) returns contents of edit12 as a double

% --- Executes during object creation, after setting all properties.

function edit12_CreateFcn(hObject, eventdata, handles)

% hObject    handle to edit12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.

%       See ISPC and COMPUTER.

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

end

% --- If Enable == 'on', executes on mouse press in 5 pixel border.

% --- Otherwise, executes on mouse press in 5 pixel border or over edit5.

function edit5_ButtonDownFcn(hObject, eventdata, handles)

% hObject    handle to edit5 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% --- Executes on key press over edit12 with no controls selected.

function edit12_KeyPressFcn(hObject, eventdata, handles)

% hObject    handle to edit12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% --- Executes during object deletion, before destroying properties.

function edit12_DeleteFcn(hObject, eventdata, handles)

% hObject    handle to edit12 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

相关推荐