基于Matlab GUI的模拟带通滤波器的设计

时间:2022-06-10 04:49:38

基于Matlab GUI的模拟带通滤波器的设计

摘 要:在传统的模拟带通滤波器设计过程中需要大量繁琐的数值计算,若手工计算则费时费力。在分析模拟带通滤波器设计理论和基于Matlab 的图形用户界面(GUI)设计方法的基础上,利用Matlab GUI工具设计了具有通用互式切比雪夫模拟带通滤波器分析设计软件,并对软件中各控件回调函数的设计给出了详细的设计方法。用户只需要输入设计滤波器所需参数,然后选择相应的功能菜单,就可以得到滤波器的特性参数,并进行滤波器的性能分析。该设计解决了滤波器设计过程中大量繁琐的数值计算问题,为切比雪夫模拟带通滤波器的研究设计提供了有效的辅助工具。

关键词:模拟带通滤波器; Matlab GUI;回调函数; 代码优化

中图分类号:TP391.9 文献标识码:B

文章编号:1004-373X(2010)10-0058-05

Design of Analog Band-pass Filter Based on Matlab GUI

JIA Jian-ke, HUAN Tuan-jun, ZHU Ning-zhou

(Shaanxi University of Technology, Hanzhong723003, China)

Abstract:Since the traditional design process of an analog band-pass filter needs a great deal of complex numeric calculationswhich use a lot of designer′s time and energy, a universal and interactive software, by which user can research and design the analog band-pass Chebyshev filter with simulation, is completed by using the Matlab GUI tool of filter design. The design method of active callback function in the software is given. The design is based on the analysis of analog band-pass filter design theory and the design method of graphical user interface(GUI) is based on Matlab. Users can obtain the characteristic parameters of the wanted filter by inputing some target parameters and choosing the corresponding function menu, and the performance, analysis for that filter can be conducted. Thus, a tool which can assist user to research and design an analog band-pass Chebyshev filter andavoid too much complex numeric calculation is furnished.

Keywords:analog band-pass filter; Matlab GUI; callback function; optimization of codec

0 引 言

模拟带通滤波器在信号的检测和传输过程中起着很重要的作用,但在传统模拟带通滤波器的设计过程中需要大量繁琐的数值计算,如果手工计算则费时费力。也有许多公司开发了相关的滤波器设计软件,如AnsoftDesigner,Filterlab等,但是它们大多数使用起来不容易上手,而且价格比较昂贵。Matlab中的图形界面编程环境GUIDE为用户开发软件界面提供了强有力的工具。在图形界面编程环境GUIDE下,设计好滤波器的设计工具界面后,对界面上各个控件的回调函数进行编写就能设计出交互式滤波器的分析设计软件。

本文在Matlab GUI基础上设计了针对Chebyshev型模拟带通滤波器的设计分析软件。用户在使用时只需输入要设计的滤波器设计指标值,选择要设计的滤波器类型,即可在分析滤波器特性时只需选择相应菜单就能得出对应的特性。该工具解决了用户在设计Chebyshev型模拟带通滤波器时大量繁琐的数值计算,不仅可以作为研究设计Chebyshev型模拟带通滤波器的辅助工具,还可以作为设计滤波器等相关课程的辅助教学软件。

1 模拟带通滤波器的设计理论

目前,模拟高通滤波器、带通滤波器和带阻滤波器的设计方法都是先将要设计的滤波器技术指标通过某种频率转换关系转换成模拟低通滤波器的技术指标,并依据这些技术指标设计出低通滤波器的转移函数,然后再依据频率转换关系变成所要设计的滤波器的转移函数[1]。工程实际中,设计高通、带通、带阻滤波器的常用方法是借助低通原型滤波器,经频率变换和元件变换得到[2]。

对于模拟带通滤波器的设计,首先是将要设计的模拟带通滤波器的技术指标通过频率变换关系,转换成模拟低通滤波器的技术指标,其次根据这些技术指标设计出低通切比雪夫滤波器转移函数,最后再依据频率转换关系变成模拟低通切比雪夫滤波器,其具体设计流程如图1所示。

图1 模拟带通切比雪夫滤波器设计流程

2 Matlab GUI设计工具简介

在Matlab中,图形用户界面(graphical user interface,GUI) 是Matlab 中一个专用于GUI 程序设计的向导设计器, 而GUI 是由各种图形对象,如图形窗口、图轴、菜单、按钮、文本框等构建的用户界面,是人机交互的有效工具和方法。通过GUIDE 可以很方便地设计出各种符合要求的图形用户界面[3]。用户通过┮欢ǖ姆椒(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。GUI 设计既能以基本的Matlab 程序设计为主,也能以鼠标为主,利用GUIDE 工具进行设计,也可综合以上两种方法进行设计[4]。GUIDE主要是一个界面设计工具集。Matlab 将所有GUI支持的用户控件都集成在这个环境中并提供界面外观、属性和行为相应方式的设置方法[5]。GUIDE将用户保存设计好的图形用户界面保存在一个FIG资源文件中,同时自动生成包含图形用户界面初始化和组件界面布局控制代码的M文件,这个M文件为实现回调函数的编写提供了一个参考框架。FIG 文件是一个二进制文件,包含系列化的图形窗口对象。所有对象的属性都是用户创建图形窗口时保存的属性。该文件最主要的功能是对象句柄的保存。M文件包含GUI 设计、控制函数及控件的回调函数,主要用来控制GUI 展开时的各种特征[6]。该文件基本上可以分为GUI 初始化和回调函数2个部分,控件的回调函数可根据用户与GUI 的具体交互行为分别调用。

3 软件界面设计

在软件设计时,通过文本编辑框控件来接收用户输入的滤波器设计指标值,考虑到分析滤波器时输出的参数较多,如果用一一对应的文本框来接收输出的参数值,则使软件界面在设计中难以布局,并影响了界面的美观,所以只用一个文本编辑框控件来实现多个参数的输出。在滤波器类型选择控件方面,因为只用2种滤波器来进行选择设计,所以使用两个单选按钮,以实现滤波器类型的选择;在滤波器特性曲线分析和参数计算方面,利用图形界面设计工具GUIDE提供的菜单编辑器来设计出分析、计算菜单,并加入相应的功能子菜单。绘制输出滤波器的特性曲线时使用一个坐标轴来实现各个特性曲线的绘制,这样可以使软件界面简洁明了。最后对参数输入和参数输出区进行功能区域划分,利用控件工具箱中的框架按钮,将参数的输入与输出区划分,利用控件工具箱中文本标签对上面相应控件的功能命名。将设计好的界面文件保存运行,就可以看到软件在运行时显示出的实际效果。设计的界面如图2所示,设计出的软件界面由4个部分组成:菜单栏、参数输入区、参数输出区、绘图区。

其中,设计的分析菜单包括滤波器的幅频特性、相频特性、阶跃响应、脉冲相应和零极点子菜单,计算菜单包括阶数、零点、极点、增益、转移函数(分子)和转移函数(分母)子菜单。

图2 软件界面

4 应用程序M文件的设计

GUI包含许多可以使软件终端与用户界面进行交互的用户界面组件,GUI实现的任务之一就是控制组件如何响应用户的行为。Matlab通过创建应用程序M文件为GUI控制程序提供一个框架。所有代码(包括回调函数)都包含在应用程序M文件中[7],即完成了图形界面的设计后,应用程序设计的主要工作是控件回调函数的设计。下面讨论程序设计流程及控件回调函数的设计。

4.1 程序设计流程

软件运行时,系统首先初始化。接着判断输入的滤波器参数及其类型是否正确,不正确重新输入,正确即可选择相应的功能菜单,实现相应的功能。程序具体流程图如图3所示。

4.2 控件回调函数设计

该软件的控件回调函数包括“确定”按钮控件回调函数、“清除”按钮控件回调函数、滤波器类型选择控件回调函数、“分析”菜单下各子菜单功能回调函数和“计算”菜单下各子菜单功能控回调函数的设计。限于篇幅,仅讨论“分析”菜单下各个菜单功能回调函数和“计算”菜单下各功能回调函数的设计。

图3 程序设计流程图

4.2.1 “分析”菜单下的各子菜单功能回调函数设计

在“分析”菜单下应包含 “幅频特性”、“相频特性”、“阶跃响应”、“脉冲响应”、“零极点图”子菜单,分别用来实现幅频特性曲线、相频特性曲线、阶跃响应、脉冲响应、零极点图的绘制。其中,“幅频特性”菜单用来绘制给定参数的滤波器的幅频特性曲线,在程序设计过程中首先使用Matlab中的axes函数,得到坐标轴控件的句柄,以便绘制特性曲线。在得到用户输入的设计指标值后,利用if else 语句来判断用户所选择的是哪一种滤波器类型,在阶数和截止频率的计算中,利用信号处理工具箱中的cheb1ord和cheb2ord 函数来计算,再用cheby1和cheby2函数来计算转移函数的分子、分母,设计出用户所要求的滤波器。在计算滤波器幅值时,利用freqs函数计算出转移函数的响应[8]。在绘制滤波器幅频特性曲线时,利用plot函数来完成,即在plot函数的参数中设置相关值,以完成幅频特性曲线的绘制。为了更好地观察到滤波器的设计是否达到相关的设计要求,利用line函数在坐标上标识出通带最大损耗、阻带最小损耗等点,这样可以直观地观察到所设计出的滤波器是否符合用户提出的要求,其具体程序如下:

axes(handles.myAxes);%得到坐标轴控件句柄

B=str2num(get(handles.dk,′String′));

Wo=str2num(get(handles.zxpl,′String′));

Wsl=str2num(get(handles.zdxxpl,′String′));

Wsh=str2num(get(handles.zdsxpl,′String′));

Rp=str2num(get(handles.tdsj,′String′));

Rs=str2num(get(handles.zdsj,′String′));%得到用户输入的设计指标值

Wp=[Wo-B/2 Wo+B/2]*2*pi;%求出通带上下限频率

Ws=[Wsl Wsh]*2*pi;%求出阻带上下限频率

if (get(handles.radiobutton3,′Value′)==get(handles.radiobutton3,′Max′))%判断用户所设计的滤波器类型

[n,Wn]=cheb1ord(Wp,Ws,Rp,Rs,′s′) %得到滤波器的阶数和截止频率

[b,a]=cheby1(n,Rp,Wn,′s′);%得到滤波器的转移函数和分子、分母系数

W=linspace(1,3*Wo,1000)*2*pi;%等分横坐标轴上点

H=freqs(b,a,W);%求出幅频响应

magH=abs(H);%求出幅值

plot(W/(2*pi),20*log10(magH),′b′);%绘制出幅频响应特性曲线

xlabel(′频率(Hz)′);%加注横坐标轴标识

ylabel(′幅度(dB)′);%加注纵坐标轴标识

title(′切比雪夫1型模拟带通滤波器幅频特性曲线′);%加注所绘制的滤波器的特性曲线名称

line(Wsl,-Rs,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsl,-Rp,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsh,-Rp,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsh,-Rs,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)%标记出特殊点

set(gca,′XTickMode′,′manual′,′XTick′,[0,Wsl,Wsh,3*Wo]′);

set(gca,′YTickMode′,′manual′,′YTick′,[-Rs,-Rp,0,1]′);%绘制出特殊点的纵横坐标对应栅格线

ylim([-150 0]);

xlim([0 Wo*3]);%设定绘图范围

grid on

else

[n,Wn]=cheb2ord(Wp,Ws,Rp,Rs,′s′)

[b,a]=cheby2(n,Rp,Wn,′s′);

W=linspace(1,3*Wo,400)*2*pi;

H=freqs(b,a,W);

magH=abs(H);

plot(W/(2*pi),20*log10(magH),′b′);

xlabel(′频率(Hz)′);

ylabel(′幅度(dB)′);

title(′切比雪夫2型模拟带通滤波器幅频特性曲线′);

line(Wsl,-Rs,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsl,-Rp,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsh,-Rp,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

line(Wsh,-Rs,′marker′,′.′,′markeredgecolor′,′r′,′markersize′,10)

set(gca,′XTickMode′,′manual′,′XTick′,[0,Wsl,Wsh,3*Wo]′);

set(gca,′YTickMode′,′manual′,′YTick′,[-Rs,-Rp,0,1]′);

grid on

end

在“分析”菜单下“相频特性”子菜单用来绘制给定参数的滤波器的相频特性曲线。相频特性曲线的在程序设计过程与幅频特性曲线的程序设计比较相似,只是在求得幅值后加一相位计算函数angle来求相位角。在plot函数中将纵坐标参数换为求出的相位角变量即可完成相频特性曲线的绘制。

对于“阶跃响应”回调函数的程序设计,要将计算出的阶跃响应绘制在坐标轴控件界面上,不能利用信号处理工具箱中step函数直接求得。因为若用该函数会使绘制出的阶跃响应曲线在一个新打开的窗口上,而软件在界面设计时,所求滤波器的所有特性曲线都共用一个坐标轴来绘制;在程序设计时利用tf函数将计算出的滤波器转移函数的分子、分母系数生成转移函数,再利用阶跃响应函数step对求出的转移函数变量求解出阶跃响应值;最后利用plot函数绘制出所求滤波器的阶跃响应曲线,这样即可完成阶跃响应曲线在坐标轴上的绘制。

“脉冲响应”回调函数的程序设计与“阶跃响应”回调函数的程序设计十分相近,只是将上述程序中的阶跃响应函数step换成脉冲响应函数impluse,并在对应的时间做相应的调整即可完成脉冲响应回调函数的编写。

“零极点图”回调函数的程序设计与以上两个子菜单的回调函数设计大致相同,程序的设计结构与前面父霾说サ幕氐骱数的设计基本一致。在求得转移函数的分子、分母系数后,利用tf2zp函数求出所设计出的滤波器的零点、极点、增益,再用real函数和imag函数求出零点、极点的实部和虚部,最后利用绘图函数plot绘制出系统的零极点图。

4.2.2 “计算”菜单下各功能回调函数的编写

“计算”菜单下包含了“阶数”、“零点”、“极点”、“增益”、“转移函数分子系数”。其中,“转移函数分母系数”菜单分别用来计算所设计的滤波器阶数、零点、极点、增益、转移函数分子系数、转移函数分母系数;“阶数”菜单用来计算所输入参数滤波器的阶数,并将它输出到输出参数框。在程序的设计中,首先判断用户所选择滤波器的类型,然后将计算出的参数用set函数输出到输出文本区。因为极点、零点值可能为复数,而文本编辑框的数据类型为数值型,所以在输出时,利用num2str函数将得到的值进行格式转化,以防止出现复数值只能显示出实部来。“阶数”菜单程序如下:

B=str2num(get(handles.dk,′String′));

Wo=str2num(get(handles.zxpl,′String′));

Wsl=str2num(get(handles.zdxxpl,′String′));

Wsh=str2num(get(handles.zdsxpl,′String′));

Rp=str2num(get(handles.tdsj,′String′));

Rs=str2num(get(handles.zdsj,′String′));%得到用户输入的设计指标值

Wp=[Wo-B/2 Wo+B/2]*2*pi;

Ws=[Wsl Wsh]*2*pi;

if (get(handles.radiobutton3,′Value′)==get(handles.radiobutton3,′Max′))

[n,Wn]=cheb1ord(Wp,Ws,Rp,Rs,′s′)

[b,a]=cheby1(n,Rp,Wn,′s′);

W=linspace(1,3*Wo,1000)*2*pi;

H=freqs(b,a,W);

magH=abs(H);

sys=tf(num,den);

[Z,P,K]=tf2zp(num,den);

set(handles.editssc, ′string′,num2str(n));%将计算出的滤波器阶输出

else

[n,Wn]=cheb2ord(Wp,Ws,Rp,Rs,′s′)

[b,a]=cheby2(n,Rp,Wn,′s′);

W=linspace(1,3*Wo,1000)*2*pi;

H=freqs(b,a,W);

magH=abs(H);

num=[b];

den=[a];

sys=tf(num,den);

[Z,P,K]=tf2zp(num,den);

set(handles.editssc, ′string′,num2str(n));

end

“阶数”、“零点”、“极点”、“增益”、“转移函数分子系数”、“转移函数分母系数”子菜单中回调函数的程序设计基本一样,只是在输出值时参数名称不同。将阶数子菜单程序中set语句的“n”换成相应菜单对应的变量名即可实现相应的功能。

在完成了各个控件的回调函数编写后,对软件的功能进行逐一调试,以保证每项功能都能正确响应用户的操作。

4.3 代码优化

在调试完软件的各项功能后,应对所设计的软件代码进行优化。打开软件中使用次数比较多的程序段,利用Matlab中的程序执行耗时剖析功能函数profile指令对程序中执行耗时情况进行分析,之后进行改进,以提高执行效率[9]。打开设计出的软件主程序M文件,对已经优化过且使用次数较多的程序段,应另外编写成函数形式,供需要的控件回调函数调用,在需要调用的相关控件回调函数下只需要填写相应的函数名称就能实现其相应的功能[10]。

对于在界面设计时没有用到的控件,对应生成的代码可以直截删去。最后在Matlab环境下,运行该程序,即可实现模拟带通滤波器的设计和性能分析。利用该软件对模拟带通滤波器进行了分析,其部分结果如┩4、图5所示。

图4 滤波器幅频特性和极点分析图

图5 滤波器的零极点图

图4为切比雪夫2型模拟带通滤波器的幅频特性和极点分析计算结果;图5为切比雪夫1型模拟带通滤波器零极点分析计算结果。分析结果表明,该软件有助于模拟带通滤波器的分析设计。

5 结 语

该文在分析模拟滤波器设计理论的基础上,设计了基于Matlab GUI的模拟带通滤波器设计软件。利用该软件可以分析滤波器的幅频特性、相频特性和零,极点分布特性等。如何将该课题的研究与实际的模拟滤波器设计整合在一起,将是下一步面临的重要工作。同时也可利用该设计方法设计功能更大的滤波器分析设计软件,使该软件具有更大的实用价值。

参考文献

[1]胡广书.数字信号处理[M].北京:清华大学出版社,2003.

[2]郑君里,应启珩,杨为理.信号与系统(下册)[M].2版.北京:高等教育出版社,2000.

[3]陈亮,郝卫东.基于Matlab的滤波器分析界面设计[J].现代电子技术,2009,32(10): 39-41.

[4]张志勇.精通Matlab 6.5版[M].北京: 北京航空航天大学出版社,2003.

[5]李海涛,邓樱.Matlab程序设计教程[M].北京:高等教育出版社,2002.

[6]施晓红,周佳.精通GUI图形界面编程[M].北京:北京大学出版社,2003.

[7]李钟慎.基于GUIDE设计CAI课件的GUI[J].电气电子教学学报,2002,24(6): 91-93.

[8]印金国.Matlab可视化界面设计与控件使用[J].电脑编程技巧与维护,2007(1): 30-35.

[9]LOPEZ B, YILLEGAS D, ALCANTARA D, et al.A package for filter design based on Matlab [J] Frontiers in Education Conference,2001, 31(1): 217-221 .

[10]李向阳,刘晓晖,邹显炳.耦合谐振带通滤波器带外特征及应用[J].现代电子技术,2009,32(24):74-77.

[11]王靖,李永全.数字椭圆滤波器的Matlab设计与实现[J].现代电子技术,2007,30(6):4-5,8.

[12]赵辉.无源滤波器与耦合滤波器设计[D].西安:西安电子科技大学,2009.

[13]张亚,黄克平.有源模拟带通滤波器的设计[J].电子科技,2009,22(1):9-12.

[14]宋琦.并联型有源滤波及无功补偿的研究[D]. 武汉:华中科技大学,2005.

上一篇:燃料电池车离散MRAC电机控制系统的DSP软件设计 下一篇:基于单点比相测角算法系统的性能分析