信号与系统教学实验辅助软件的设计.docx
《信号与系统教学实验辅助软件的设计.docx》由会员分享,可在线阅读,更多相关《信号与系统教学实验辅助软件的设计.docx(76页珍藏版)》请在冰豆网上搜索。
![信号与系统教学实验辅助软件的设计.docx](https://file1.bdocx.com/fileroot1/2023-5/22/67d735a9-a64f-44b0-a6dd-8a464b34b83b/67d735a9-a64f-44b0-a6dd-8a464b34b83b1.gif)
信号与系统教学实验辅助软件的设计
1课题研究背景
“信号与线性系统”是电类各专业本科生的一门重要的专业基础课,也是电子信息类研究生入学考试科目。
该课程一方面以“高等数学”,“工程数学”及“电路理论”等课程为基础,同时又是后继的“数字信号处理”、“通信原理”和“自动控制原理”等专业课程的基础,在教学环节中起着承上启下的作用[1]。
该课程理论性较强且具一定的实践性,其基本方法和原理广泛应用于信号处理和系统分析的各个领域。
随着近几年对大学生素质要求的提高单纯的理论教学已远远不能现在教学任务的需要,试验教学的地位显示出越来越重要的地位,以前也没有对“信号与线性系统”教学实验教学辅助软件,在这种形似下开发一种教学实验软件是十分必要的,经我院信号教研室的老师研究决定把该课题的研发工作列为今年毕业设计之列,希望通过老师和学生的共同努力来完成这一课题。
“信号与线性系统”课程所用数学工具较多,因为其核心内容就是三大变换,即傅里叶变换、卷积计算和Z变换,而物理概念往往来源于复杂的数学运算及推导,这就导致学生将大量的时间用于数学运算,所以学生在学习的过程中感到大部分时间是在学数学,而未真正理解最本质的物理意义。
为了减轻学生在数学运算上的负担,使学生把注意力集中到对课程最本质的概念和方法的把握上,我们初步决定利用研制可用于教学和实验的软件系统,用直观的形式把结果显示出来[2]。
我们设想用一种可视语言设计界面用一种计算能力强的软件来完成后台的计算工作,Matlab现已成为计算机辅助分析和仿真分析中的重要分析软件,并逐步成为工科研究生必须掌握的基本工具语言。
Matlab也存在自身的缺陷,如只提供C和Fortran[3]语言使用的编程接口无法在VB、VC中直接调用,编写可视化界面的能力弱等。
这就给开发带来了一定的困难但经过研究这一课题的同学和老师努力和探讨这一问题最终得以解决下面我们将在各章中详细的讨论该课题的实现以及在设计过程中所遇到的困难和解决方案以及该设计的不足与改进方案。
2方案论证
经讨论决定用vb设计界面,在vb环境下输入数据后台的计算工作由matlab来完成。
Vb是1991年Microsoft公司推出了Windows应用程序开发工具——VisualBasic。
Visual意为“可视化的”[4],指的是一种开发图形用户界面(GUI)的方法,所以VisualBasic是基于basic的可视化的程序设计语言[5]。
在VisualBasic中,既继承了先辈Basic所具有的程序设计简单易用的特点,其编程系统又采用了面向对象[6],事件驱动的编程机制,用一种巧妙的方法Windows的编程复杂性封装起来[7],提供了一种所见即所得的可视界面设计方法[8],给广大的用户学习、使用、研究和开发Windows环境下的应用程序带了福音。
在此有两个问题:
(1):
如何在vb环境下实现对matlab程序的调用[9];
(2):
但Matlab也存在自身的缺陷,如只提供C和Fortran语言使用的编程接口没有vb的编程接口如何实现两种语言的数据交换呢!
2.1:
如何在vb下进行matlab的调用
经翻阅大量的资料发现能实现调用的方法用一下几种:
(1):
采用动态链接库DLL方法[10]
(2):
采用动态数据交换DEE方法[11]
(3):
采用ActiveX自动化技术[12]
2.1.1动态链接库DLL方法
在介绍这种方法前我们首先引入一种软件Matcom,Matcom是一个从MATLAB到C++的编译器,它可以节省用户的运算时间和内存要求。
Mathtools公司利用Matcom4技术编写了Mideva工具软件,它可以借用C++编译器将Matlab下的M-文件转换为可被VB调用的DLL或独立便可执行文件。
VB中要使用DLL,必须VB工程中包含DLL的声明文件(即模块文件),同时还要将DLL放在工程文件所在的目录下。
在使用前先安装Matcom(安装方法查附录)如下操作可以一个M-文件编译成DLL,启动Matcom4的Mideva,点菜单File/Compile,选要转换的M-文件应该是能作为函数被其他集城环境调用的M-文件,设文件名为(myfile)。
编译完成后,在对应的Debug或Release目录下,可以找到一些编译生成的文件如要编译hwplot.m文件成Dll文件则启动mathstools4.5/MIDEVA界面如下图2-1所示:
图2-1:
MIDEVA界面
然后单击file/compiletodll在对话框中选择browse在路径中找到你所要编辑的文件单击“ok”即可界面如下图2-2所示:
图2-2:
编辑界面图
完成后在对应的Debug或Release目录下即可找到.DLL,.BAS,.CLS文件[13]。
VB中调用DLL实际是调用和hwplot.cls接口,然后通过该接口实现调用System目录下的DLL,这是Mideva4.5新增加的功能,以前在要调用DLL,必须通过矩阵句柄进行,很不方便准备工作很简单,只需将hwplot.bas和hwplot.cls文件以模块和类模块的形式加入到VB当前工程,除此之外还要在vb所建的工程中引用一个动态连接库即可把hwplot.bas文件当作vb的一个公用模块直接调用[14]。
2.1.2采用动态数据交换DEE方法
MATLAB提供客户服务器功能VB应用程序作为系统工程,用Maltab作为后台应用程序完成简明复杂计算任务与绘画功能,Maltab与VB应用程序间通过DDE协议进行数据交换,DDE(dynamicdataexchange)是一种开放的、与语言无关的、基于消息的协议,是应用程序通过共享内存进行进程通信的一种方式。
VB应用程序首先通过确定服务器名和主题(topic)建立与MATLAB的DDE会话[15]。
服务器名和主题惟一地确定作为客户端,Maltab作为服务端,客户端与服务器端可以就确定的项目(Item)交换数据。
关于VB与DDE功能可以参考文献。
VB应用程序中需要指明的MATLAB的服务器为Maltab,MATLAB有System和Engine两个主题,在System主题下可以列出MATLAB所提供的详细的DDE功能,在Engine主题下可以充分实现MATLAB的服务功能。
利用VB具有的DDE客房端功能,使用MATLAB的Engine主题支持的三种操作,VB应用程序可以向MATLAB传送可执行命令,从MATLAB中读取数据以及向MATLAB中传送数据。
VB为用户提供支持通信的控件有:
窗体(Form)、多文档窗体(MDIForm)、标签(Label)、文本框(TextBox)和图片框(PictureBox)。
Form相应于DDE协议,这些控件提供了完成任务一次DDE链接需要的属性和事件,以及设置必要参数和响应DDE过程中的事件。
服务器应用程序开发涉及到的主要属性如下:
(1)LinkMode:
对于一个VisualBasic程序来说,作为一个服务器程序和作为一个客户程序时,它们的LinkMode属性的取值是不一样的。
当一个程序VisualBasic作为服务程序时,LinkMode属性只是指针Form的,它的取值为“1—source”.此时,这个Form中的PictureBox控件、TextBox控件和Label控件就可以作为客户程序的信息源[15]。
(2)LinkTopic:
如同LinkMode属性一样。
对于服务器程序和客房程序来说,属性有不同的意义。
LinkTopic属性是针对Form的,用户可以将服务器程序中的Form的属性设置为任何一个名字,该名字在客户应用程序中使用[16]。
(3)LinkItem:
是指通过一个DDE链接传输的数据容器,它是标签(Label)、文本框(TextBox)和图片框(PictureBox)的名称。
下面以一个具体的例子来说明该项方法:
在VB主窗体中设置Text1、Text2两个文本框,当Text1的内容有变化,则X矩阵获得变化后的数据,而后在函数myfunc中进行矩阵相乘运算,并把结果返回至Text2控件中。
在实际应用中,my2func函数可以是任意复杂的数据处理函数和控制算法函数[17]。
程序清单:
channel=ddeinit(‘server‘,‘Dde’);
rc=ddeadv(channel,‘Text’,‘myfunc’,‘x’,[1,0]);
Pause;
Rc=ddeunadv(channel,‘Text1,[1,0]);
Rc=ddeterm(channel);
其中myfunc为自定义的matlab函数:
Functiony—myfunc(x3x);
Rc=ddepoke(channel,‘’,y,[1,0]);注意:
利用动态数据交换调用MATLAB时,
MATLAB的命令窗口必须在建立DDE会话之前已经运行。
2.1.3采用ActiveX自动化技术
ActiveX自动化(OLE自动化)协议是一种允许一个应用程序(控制端)去控制另一个应用程序的协议。
由于VB支持ActiveX自动化控制端协议,MATLAB支持ActiveX自动化服务器协议,如果已经建立了一个VB应用程序和MATLAB之间的ActiveX自动化连接,那么一个VB应用程序中就可以调用MATLAB的命令向MATLAB传送或从MATLAB接收矩阵数组。
在VB应用程序中创建MATLAB的ActiveX对象以后可以使用这个对象所包含的各种方法来实现对MATLAB的调用。
MatlabApplication对象含有3个方法,可以实现决定MATLAB的功能。
现简单介绍它们的用法:
(1)Execute(CommandasString)方法:
执行本方法将调用MATLAB执行一条Command字符串决定的MATLAB命令,同时返回一条字符串表示命令的执行情况。
任何能在MATLAB命令行窗口执行的命令均可以被包括在Command字符串中[17]。
(2)GetFullMatrix方法:
该方法用来将MAT2LAB中的一个矩阵变量传送到VB程序的一个一维数组或二维数组中。
(3)PutFullMatrix方法:
该项方法是将VB程序中的一个一维数组或二维数组传送至MATLAB中的一个矩阵变量中。
(4)VoidMinimizeCommandWindow()方法:
该方法用MATLAB使命令行窗口最小化,具体调用如下:
CallmatlabMinimizeCommandWindow().
(5)VoidMaximizeCommandWindow()方法:
:
该方法用MATLAB使命令行窗口最大化,具体调用如下:
CallmatlabMaximizeCommandWindow().
下面用具体例子说明如何使用该方法[18]。
在以后的阐述中我们采用的是第一种方法即Execute(CommandasString)方法实现(在第四章中将有详细介绍)在此不在一一骜述。
2.2vb与matlab的数据交换
Vb与matlab实现数据交换的方法很多常见的有Execute(CommandasString),
VoidMaximizeCommandWindow(),PutFullMatrix,VoidMinimizeCommandWindow(),GetFullMatrix几种函数实现方法但这些实现都过于的繁琐,我经过翻阅大量的资料查阅了一些书终于发现利用读写文件去控制信号某一参量的变化简单快捷具体实现方法如下:
如参数由文本框输入后,由VB程序传递到MATLAB中进行相应的设计。
这时可采用如下文件操作来完成:
在VB中利用文件操作语句将需要传递到MATLAB中的参数存到文件中(如d:
\dat.txt),在MATLAB中再利用文件操作语句将所需参数读入后进行相关的设计(具体操作见设计示例)[19]。
启动vb新建一个工程新加一个form1窗体添加三个标签label1-label3分别通过修改label属性命名为“请输入数据”和三个text1-text3三个文本框通过修改text属性命名为“”和两个按钮button1-button2两个命令按钮通过修改caption属性命名为“计算”和“退出”
具体界面如下图2-3所示
2-3:
数据交换界面图
双击界面上的任一控件或单击工具栏上的“视图”选择“代码窗口”会弹出代码编辑窗口输入控件代码:
DimMatlabAsObject
PrivateSubCommand1_Click()
UnloadMe
Form2.Check1.Value=0
EndSub
PrivateSubCommand2_Click()
DimxAsString
DimyAsString
x=Text2.Text
y=Text3.Text
fhnd1=FreeFile
Open"d:
/Pnum.txt"ForOutputAs#fhnd1
Print#fhnd1,x
Close#fhnd1
fhnd2=FreeFile
Open"d:
/Pden.txt"ForOutputAs#fhnd2
Print#fhnd2,y
Close#fhnd2
SetMatlab=CreateObject("Matlab.Application")
Label4.Caption=Matlab.Execute(Text1.Text)
EndSub
然后修改text1的multiline属性为“true”使文本框变为可变行输入的形式把已编写好的matlab程序通过text1的text属性粘贴到文本框中如2-4图所示:
2-4:
数据交换图
运行结果如2-5所示:
2-5:
运行结果
由此可见在vb环境下输入的34和5可以成功的完成数据交换和显示,用此办法来进行控制信号某一参数的变化效率很高是此项设计进行数据交换的最佳选择。
2.3:
设计方案的总框架
经过上述讨论设计中所遇到的问题都得到解决,此项设计的总体设计思想为:
通过matlab的外部接口,以vb作为前台,matlab作为后台,实现vb与matlab的混合编程。
在设计过程中我们设计两个小系统一是:
单纯的演示系统;二是:
试验教学辅助系统;下面我们分别讨论两个系统的总体框架。
2.3.1:
采用动态连接库实现试验演示系统结构和框图
此系统的最大优点是可以脱离matlab运行环境独立运行系统结构界面为:
2-6:
演示系统界面结构图
例如进行单位脉冲序列的演示单击“文件/选择”然后单击界面上的“选择”按钮这时“单位脉冲序列生成”别选中在单击“文件/运行”就会出现如2-6所示的运行结果。
2-7:
单位脉冲序列生成运行结果
2.3.2采用ActiveX自动化技术实现实验教学辅助系统结构图
此系统的最大优点是可以对输入信号的某一参数通过数据通信进行控制而且系统所执行的matlab程序可读性强有利于老师应用于教学系统结构界面为:
2-8:
试验教学辅助系统结构图
假如要完成离散基本信号的生成选中“成离散基本信号的生成”会弹出下图界面
2-9:
离散信号界面图
输入12和4两位数单击计算按钮与行结果如下:
2-10:
离散信号运行结果
3采用动态连接库实现实验演示系统设计
上一章我们详细叙述了系统的设计方案下面我们来详细讨论一下此设计各项功能实现的具体过程。
3.1工程界面的设计
运行vb新建一个窗体form1单击“工具/菜单编辑器”弹出菜单编辑器对话框如图3-1所示
3-1:
建立菜单界面
在标题栏中键入“文件”名称栏中键入”munfile”然后点击“下一个”按钮键入在标题栏中键入“选择”名称栏中键入“munfselect”并设为二级菜单,如此键入“运行”“munfrun”,”退出“”quit”,然后单击ok即可。
在form1窗体中添加check1-check10十个复选框;command1-command20二十个命令按钮;一个text1一个文本框,一个标签label1和一个timer控件排列好后如3-2所示
3-2:
添加控件框图
并通过修改caption属性分别把十个复选分别命名为:
绘图函数hnwplot;单位脉冲序列生成函数;卷积演示;离散信号MATLAB表述方法;时域离散系统线性性质验证;二阶巴特沃斯低通滤波器的频率响应;序列x(n)的移位与周期延拓;FIR数字滤波器;离散时间傅立叶变换;z变换;把text1通过修改text属性命名为“试验演示小系统;把前十个命令按钮通过修改相同的的属性命名为“选择”,后十个命名为“清除”label1通过修改相同的属性为空形成如图3-3所示的图样。
3-3:
form1窗体界面
在此工程完成的功能只是试验的演示因此不发生数据传递,函数中要把所有的变量赋值传递和返回的值都是空值。
把编写的matlab源程序文件名分别为btws.m、conv1.m、fir.m、fly.m、hnwplot.m、impseq.m、lisan.m、zbh.m、zqyt.m、syyz.m如2.1.1所述用matcom进行转换在c:
/matcom4.5/release路径下找:
btws.bas、btws.cls、hnwplot.bas、btws.dll、hnwplot.cls、hnwplot.dll、conv1.bas、co_nv1.cls、conv1.dll、conv1.bas、conv1.cls、conv1.dll、fir.bas、fir.cls、fir.dll、fly.bas、fly.cls、fly.dll、impseq.bas、impseq.cls、impseq.dll、lisan.bas、lisan.cls、lisan.dll、zbh.bas、zbh.cls、zbh.dll、zqyt.bas、zqyt.cls、zqyt.dll、syyz.bas、syyz.cls、syyz.dll文档复制到当前工程所在的目录下分别以添加模块和添加类模块的添加当前的工程中点击“工程/添加模块”会弹出如3-4下对话框然选择现存若是新建的话就选择“新建”在这里我们添加现存的后选中你要添加的模块点击“打开”即可[20]。
3-4:
添加模块对话框
添加类模块大致相同点击“工程/添加类模块“会弹出如3-5所示的选择现存点击你所要添加的类模块点击“打开”即可。
3-5:
添加类模块对话框
把上面所述的.bas和.cls文件分别加入到工程中加完后如下图3-6所示
3-6添加模块后工程截面图
将须将支持的库文件拷贝到系统所在的目录下包括Mmatrix.dll、v4500v.dllago4500.dll、c4500v.dll、msvcrt.dll由于Mmatrix.dll是Com服务器所以必须在操作系统中注册方可使用注册时可使用如下命令语句:
regsvr32mmatrix.dll,为发挥Mmatrix.dll的作用须在新建的工程中引用它即点击”project工程/reference引用”是引入到工程中则可在编程中直接调用模块具体如下图所示:
3-6:
引用Mmatrix.dll示意图
点击“ok”即完成引用。
这样前期工作都全部完成在接下来的编程中就可以对模块进行直接的引用。
3.2vb调用程序的编写
双击3-6所示的任意控件或单击工程中的“视图/代码窗口”打开编程窗口如3-7所示
3-7:
代码窗口图
窗口左边的下拉单中选择你所要编辑代码的控件,右边下拉单中选择的是触发“事件”的条件程序代码见附录一。
“实验演示小系统”设计到此完成,它的缺点在于只是单纯的演示而无法进行对信号某一参量进行控制。
在第四章中我们将详细讨论能实现参数控制教学辅助系统的设计。
4信号与线性系统实验辅助系统的设计
上一章我们设计了采用动态连接库实现了一些在信号与系统教学中常用实验的演示,这一章我们将重点讨论基于activex自动化服务技术的实验辅助系统的设计。
ActiveX部件是Microsoft公司提供的一种用于模块集成的新协议,它是VisualBasic工具箱的扩充部分。
ActiveX部件是一些遵循ActiveX规范编写的可执行代码,比如一个.Exe,.dll或.ocx文件。
在程序中加入ActiveX部件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。
ActiveX部件保留了一些普通VB控件的属性、事件和方法。
ActiveX部件特有的方法和属性大大地增强了程序设计者的能力和灵活性。
ActiveX实际上是在调用一种部件,而无需要求该部件对应的程序正在运行,这会使得其功能更加强大,下面我们来详细介绍该系统的设计过程[21]。
4.1利用vb设计系统界面
4.1.1进入系统窗体设计
利用第三章方法所述新建一个工程,新添加一个窗体Form24在窗体中添加两个标签label1~label2,一个timer1,Image1控件,按下表一设置控件属性:
表一:
form24窗体控件清单
双击窗体的任意控件打开代码窗口键入以下代码:
OptionExplicit
DimiAsLong
PrivateSubForm_Load()
Timer1.Enabled=True
Me.Timer1.Interval=10
Label2.Caption="指导老师:
任景英"+vbCrLf+"设计人:
李朋宾***褚博"
Me.Label1.AutoSize=True
Me.Label1.Left=-Me.Label1.Width
i=-Me.Label1.Width
EndSub
PrivateSubImage1_Click()
Form1.Show
UnloadMe
EndSub
PrivateSubTimer1_Timer()
i=i+50
Me.Label1.Movei,(Me.Height-Me.Label1.Height*2)/3
Ifi>=(Me.Width-Me.Label1.Width)/2Then
Timer1.Enabled=False
EndIf
EndSub
运行效果图如下所示:
4-1:
进入系统界面运行效果图
4.1.2主窗体的设计
新添加一窗体在界面中添加check1~check6六个复选框,一个文本框text1,一个标签label1和一个时钟控件timer1,通过修改caption属性把六个复选框依次命名为:
频譜图绘制,基本离散信号生成,基本连续信号生成,序列的基本运算,常用的变换,常见滤波器,点击复选框1的font属性如图4-2所示对其所名字的字体进行修改为“粗体”“小二号”点击“确定”即可,把txet1命名为“实验教学辅助系统”;Label1命名为“空”并进行如上所述同样的字体修改排列好其位置