MATLAB设计FIR数字滤波器GUI界面

MATLAB设计FIR数字滤波器GUI界面

前言

设计并实现FIR数字滤波器的窗口设计算法,要求:输入数字滤波器指标,包括滤波器类型(低通、带通、带阻或高通等),通带截止频率,通带最大波动,阻带开始频率,阻带衰减,设计得到FIR滤波器,并画出设计得到的滤波器的增益曲线图(要有坐标标度)。为了使编制的程序操作方便,设计处理系统的用户界面:在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数,显示滤波器的频率响应。

一、GUI界面设计

1.创建工程

打开MATLAB软件,将路径选择为你自己的工作路径,在命令行窗口中输入guide,然后回车。如图:

在这里插入图片描述

回车之后会跳到这个界面,默认选择Blank GUI就行,把√勾上,点击确定就会创建一个空白界面了。在这个界面你可以新建一个GUI界面,也可以打开之前设计的GUI界面。记住:只需在命令行窗口输入guide然后回车就可以来到此界面了。如图:

在这里插入图片描述
点击确定后会自动生成一个.m后缀和.fig后缀的文件,.m文件存放的是代码,.fig文件是GUI界面,如果你们的与我的不太一样,只需点击文件,然后点击预设,在MATLAB GUIDE预设项那里把第一个勾上就行。如图:
在这里插入图片描述

2.GUI界面设计

根据要求,我们要获得输入数字滤波器的各项指标,我们选择可编辑文本框。点击可编辑文本框之后,在右边方格那里任意点击就会出现可编辑文本框了,双击可编辑文本框,设置一下其他属性,FontSize、String这些是经常改的,还有注意一下Tag属性,它是跟代码有关的。如图:在这里插入图片描述
在可编辑文本框之前加一个静态文本框,就可以知道这个可编辑文本框要做什么了。例如:在这里插入图片描述
根据要求,我们要选择滤波器类型(低通、带通、带阻或高通),这里有两种方法实现,一是用单选按钮,一个单选按钮对应一种滤波器;二是使用弹出式菜单。如图:在这里插入图片描述
根据要求,我们要画出设计得到的滤波器的增益曲线图(要有坐标标度),只需添加一个坐标区就行了。如图:在这里插入图片描述
至此,本次设计FIR数字滤波器GUI界面所需的控件就这些,我们只需要修改这些控件的某些属性就能达到界面设置的效果。下图我给大家展示一个我自己设置的FIR数字滤波器GUI界面。我也会以我设置的界面讲解代码。图:在这里插入图片描述

二、代码讲解

设计好GUI界面后,点击运行(绿色三角形)就会生成每个控件相关的代码,在本例中,我们只需对pushbutton按钮,radiobutton单选框,popupmenu弹出菜单栏它们的回调函数进行操作,edit输入框的回调函数一般无需操作。先来说说回调函数,例如function pushbutton1_Callback(hObject, eventdata, handles),这是普通按钮1的回调函数,按一次普通按钮就会执行一次回调函数下面的代码,也就是说,对某个控件进行操作就是执行它的回调函数。

1.参数输入

set和get是MATLAB中常用的函数,我们要获取参数输入用get函数就行,handles是存储数据的结构体,str2double是获取数字型字符,在下面代码中,就是获取可编辑文本框1中的参数,并将它赋值给一个变量。

代码如下(示例):

fs = str2double(get(handles.edit1,'String'));  %抽样频率

2.单选按钮

radiobutton单选框的状态可以用0和1判断,而pushbutton按钮不能。在本例中,我们添加了四个单选按钮,但我们怎么判断它们的选中状态呢?我相信很多人的单选按钮是这样的,按一个选中一个,按下一个,上一个的状态还不变,如图:

在这里插入图片描述
怎么解决呢?我们说过,radiobutton单选框的状态可以用0和1判断,所以我们只需在radiobutton单选框的回调函数下写函数来设置单选框的0和1的值,也就是说单选按钮1按下,本按钮的状态为1,其它全为0。
代码如下(示例):

set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
set(handles.radiobutton3,'value',0);
set(handles.radiobutton4,'value',0);

3.普通按钮

同单选按钮的问题,怎么判断它们的选中状态呢?是不是可以加一个背景色,当按钮按下的时候改变它的背景色,但这又会遇到与单选按钮同样的问题。如图:在这里插入图片描述
怎么解决呢?我们说过,pushbutton按钮不能用0和1状态判断,既然不能改变普通按钮的值,那就直接改变它的背景颜色吧。也就是说,按钮1按下,设置本按钮颜色为绿色,其他按钮颜色设置为红色,以此类推。
代码如下(示例):

    set(handles.pushbutton1,'BackgroundColor','g');
    set(handles.pushbutton2,'BackgroundColor','r');
    set(handles.pushbutton3,'BackgroundColor','r');
    set(handles.pushbutton4,'BackgroundColor','r');

4.坐标区

显示图像的还是用plot()函数,有一点不一样的是要将图像显示到坐标区axes1,多了handles.axes1这一点代码而已,其他都一样。

代码如下(示例):

plot(handles.axes1,w/pi,20*log10(abs(H)));

5.信息提示窗口

点击设置好的“关于”按钮就会弹出一个信息提示窗口,主要是为了介绍使用说明及其他相关内容。刚开始我使用的是MATLAB自带magbox函数,使用起来感觉里面的字体看起来非常小,我查了网上一圈资料之后发现要改提示窗的大小和里面的字体只能自己自定义一个,给大家看一下原来的magbox信息提示窗和自定义后的信息提示窗的效果。先看默认的:在这里插入图片描述

再看自定义后的:在这里插入图片描述
如果大家想自定义一个提示窗的话可以参考这篇博文:Matlab GUI自定义提示窗(对话框)

6.用不同的窗函数构造FIR数字滤波器

对于低通滤波器及高通滤波器,截止频率ωc仅为通带截止频率ωp和阻带截止频率ωs之和一半,所以在获取输入参数的时候只需获取到通带截止频率ωp和阻带截止频率ωs就可以设计低通滤波器及高通滤波器;而对于带通滤波器和带阻滤波器,要求出其上下截止频率ω2和ω1,故获取的输入参数下阻带截止频率fs1、上阻带截止频率fs2、通带下截止频率fp1、通带上截止频率fp2以及抽样频率Fs就可以设计带通滤波器及带阻滤波器了。这里给大家讲解一下用矩形窗设计低通滤波器的方法,首先获取输入的阻带截止频率和通带截止频率;
代码如下(示例):

    wp = str2double(get(handles.edit1,'String')); %阻带截止频率
    ws = str2double(get(handles.edit2,'String')); %通带截止频率
    wp = wp * pi;
    ws = ws * pi;

然后计算过渡带并取正数,然后通过ceil函数计算阶数N并取整数(注意线性相位高通滤波器和带阻滤波器的阶数只能为奇数),ceil函数只是数据处理函数,给大家看一下例子:
round函数,以0.5为分界线,相当于四舍五入,例如round(6.5)运行结果就是7。
fix函数,向0取整,无论小数点后面数值多大都进行清零,例如fix(1.9),fix(-1.5)运行结果都是1。
floor函数,小于或等于该数的接近整数,例如floor(5.5),floor(-4.5)运行结果分别是5和-5。
ceil函数,大于或等于该数的接近整数,例如ceil(5.5),ceil(-5.5)运行结果分别是6和-5。
计算完各种参数之后就可以用窗函数设计FIR数字滤波器并画图了。各种窗函数的设计请参考这篇博文:在matlab中使用不同的窗函数构造FIR数字低通滤波器

	if (wp > ws)
       w = wp-ws; %计算过渡带
    else
       w = ws-wp; %计算过渡带
    end
       N = ceil(1.8*pi/w); %求阶数N
       M = N-1;
       wc = (wp+ws)/2; %计算理想低通滤波器通带截止频率(关于pi归一化) 
       hn=fir1(M,wc/pi,boxcar(N)); %fir1窗函数法设计线性相位FIR的工具函数
       [H,w]=freqz(hn,1,500);
       plot(handles.axes1,w/pi,20*log10(abs(H)));

三、结果演示

MATLAB设计FIR数字滤波器GUI界面

总结

这次设计FIR数字滤波器GUI界面所用到的控件不多,多试几次应该就可以掌握这些控件的使用方法了。还有用窗函数设计低通滤波器、高通滤波器、带通及带阻滤波器的方法几乎是一样的,网上多查点资料了解也可以搞出图像来。大家遇到问题或不懂的函数可以上网查,也可以按F1或双击函数名查看有关的帮助。

猜你喜欢

转载自blog.csdn.net/Gxust_Veneno/article/details/119705339