第2卷第4期
2003年10月
江南大学学报(自然科学版)
JournalofSouthernYangtzeUniversity(NaturalScienceEdition)
Vol.2 No.4Oct. 2003
文章编号:1671-7147(2003)04-0352-04
Matlab、Matcom与VC++混合编程
在FFT上的实现
盛歆漪, 须文波, 边继东
(江南大学通信与控制工程学院,江苏无锡214036)
摘 要:阐述了Matlab与VC++混合编程的各种方法,并以FFT算法为例介绍了Matcom与VC++混合编程的方法.并将此方法与传统方法进行比较,验证了这种混合编程方法的优越性.关键词:Matlab;Matcom;VC++;快速傅立叶变换;混合编程中图分类号:TP311.11
文献标识码:A
ImplementingFFTbyOmnibusProgrammingofMatlab,
MatcomandVC++
SHENGXin-yi, XUWen-bo, BIANJ-idong
(SchoolofCommunicationandControlEngineering,SouthernYangtzeUniversity,Wuxi214036,China)
Abstract:Inthispaper,variousmethodsofomnibusprogrammingusingMatlabandVC++aredescribed.ToexemplifyFFTalgorithm,ThepaperpresentsindetailtheomnibusprogrammingofMatcomandVC++andshowsthatthistechniqueoutperformsthepreviousonesinmanyaspects.
Keywords:Matlab;Matcom;VC++;FFT;omnibusprogramming
Matlab是一种基于C语言内核的工程计算语言,集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个使用方便、界面友好的用户环境.其优点是:可扩展性强,允许用户自行建立指定功能的M文件、开发自己的工具箱或利用现有的数百种商用Toolbox,易学易用.Matlab不需要用户具有高深的数学知识和程序设计能力,故开发效率高,周期短.然而Matlab也存在某些缺点.如:Matlab是一种解释性语言,其特点是以矩阵为基本数据结构,导致其执行效率相对C或C++语言要低很多;因Matlab程序不能脱离其环境运行,故不能直接用
收稿日期:2002-12-23; 修订日期:2003-09-13.
于商用软件的开发;即也不易开发出具有Win32风格界面的通用程序.+Matcom是Mathtool公司(现已被MathWorks公司收购)的产品,利用它可以把*.m文件转换成C++代码.而且利用Matcom技术还可调用Matlab中的大量函数.在Matcom中包含了名为Matrix 作者简介:盛歆漪(1975-),女,江苏丹阳人,控制理论与控制工程硕士研究生. 第4期盛歆漪等:Matlab、Matcom与VC++混合编程在FFT上的实现353 LIB>中的函数,或使用它声明矩阵类型的对象较为容易,因此可用此库文件配合VC++实现各种复杂的数值算法软件. VisualC++是Microsoft的C++集成开发环境,其集成了功能强大的编辑器、编译器、连接器和调试器[1].在该环境下,可开发基于MFC的Win32程序以及基于WindowsAPI的Win32的程序.其优点是代码效率高、执行速度快、可以开发出风格多样的界面.其不足是开发数值计算程序时编码的工作量较大. 声明矩阵变量,访问矩阵单元,调用Matrix 2 用Matcom与VC++.net共同编 制快速傅立叶变换程序 作者以编制快速傅立叶变换(FFT)程序为例,说明如何在VC++.net环境下使用MatrixLib.首先,启动VC++.net集成开发环境,点击菜单项的/工具/选项0,在打开的对话框中选中/项目/VC++目录0,在/显示以下内容的目录0栏中选择/包含文件0项,点击/新行0菜单,加入一个新的路径/D:\\matcom45\\lib0(在此假设Matcom的安装路径为D:\\matcom45,以下同);然后选择/库文件0,同样点击/新行0菜单加入一个新路径/D:\\matcom45\\lib0.随后是建立具体的VC++解决方案: 1)点击新建项目,选择VC++项目,在右边选中MFC应用程序,命名为myFFT,并选择存储位置,在MFC应用向导中接受所有默认选项; 2)在VC++.net集成开发环境中点击/项目/添加现有项目0,选择D:\\matcom45\\lib目录中的matlib.h和mdv4500v.lib文件,单击/打开0.这样就把这两个文件添加到自己的工程中了.mdv4500v.lib将被连接到最后的可执行文件中,而matlib.h包含了所要用到的宏定义、常量声明和函数声明.所以应该把这两个文件添加到项目中来.3)在myFFTDoc.h文件开始处加入#includedmatlib.hd语句,并在类CmyFFTDoc中声明公有类型函数voidmy_fft(Mm&,Mm&,Mm&).然后在myFFTDoc.cpp中定义此函数.定义如下:voidCmyFFTDoc::my_fft(Mm&m,Mm&p,Mm&f){ //初始化Matrix //构造离散的时间向量,Mm类可声明各种矩阵或向量 Mmt=(colon(0.0,1.0/100.0,10.0-1.0/100.0)); //构造离散的信号向量 Mmsingal=sin(2.0*pi*15.0*t)+sin(2.0*pi*40.0*t); //变换后的结果将保存在result中 Mmresult; //对singal进行fft变换,结果保存在result中result=fft(singal);1 Matlab与VisualC++混合编程方 法 用Matlab与VisualC++结合进行数值算法程序的开发,就可充分利用两者的优点.其一利用VC进行整体开发,其二利用Matlab编写数值算法的代码,再把代码转换和优化后嵌入C++代码中,这样既可开发出具有Win32风格的程序,又可保证一定的执行速度. 1.1 Matlab与VisualC++混合编程的方法 混合编程有几种结合方法:¹首先在Matlab下编写.m文件,后通过Matlab自身的编译连接器把.m文件转换成C++代码,并嵌入到VC++程序中[2];º通过客户-服务器方式,在VC++中使用Matlab服务引擎,通过引擎调用Matlab中的函数[2];»在VC++中包含Matlab中的数学函数库,使用数学函数库中的特定函数[3];¼利用Matcom实现Matlab与VisualC++混合编程. 其中方法¹、º都不能脱离Matlab环境,方法»则需要用lib/def命令导出libmx.lib,libeng.lib以及libmccmx.lib等静态连接文件,且这3种方法都不能有效地提高程序的执行效率.方法¼还可分为两种方法,其一为在matlab下编好程序,然后利用matcom翻译成C++代码,在C++编译器下把这些代码编译成.exe文件;其二为直接利用matcom提供的矩阵类和相关函数在C++编译器下直接编程.前者所有变量还是基于矩阵的,故执行效率不会有较大提高,这里采用了后一种方法编程. 1.2 在VC++中使用Matrix ¹设置VC++环境选项及正确的包含文件及库文件路径;º将mdv4500v.lib加入到VC++工程中;»在相应位置加入matlib.h文件(用#include/matlib.h0语句实现);¼在适当位置使用initM()语句对Matrix pDoc->my_fft(m,p,f); CMyfiguremagnitudeDlg,phaseDlg;magnitudeDlg.m=m;magnitudeDlg.p=p;magnitudeDlg.f=f;//幅频特性曲线 magnitudeDlg.isPhase=false;magnitudeDlg.DoModal();phaseDlg.m=m;phaseDlg.p=p;phaseDlg.f=f;//相频特性曲线phaseDlg.isPhase=true; phaseDlg.DoModal(); 最后,点击/生成/生成解决方案0,再点击/调试/开始执行(不调试)0就得到了一个Win32程序myFFT,然后点击鼠标左键就得到了图1和图2. //计算幅值和相位 m=abs(result);p=unwrap(angle(result));f=(colon(0.0,1.0,length(result)-1.0))*99.0/length(result);} 4)在myFFTView.cpp中加入#includedmatlib.hd,#includedMyFigure.hd语句,并对CmyFFTView映射WM_LBUTTONDOWN消息,函数为OnLButtonDown(). 5)给解决方案插入一对话框资源,去掉对话框上的所有控件,保留默认的ID值,对应类命名为CMyfigure,在Myfigure.h文件中加入#includedmatlib.hd语句,并在类CMyfigure中声明公用变量m,p,f和init,isPhase.其中m,p,f为Mm型变量,init,isPhase为bool型变量.在类CMyfigure的构造函数中为init赋初值true.然后为类CMyfigure重载OnPaint()函数,并为此函数添加如下代码:if(init) { //创建一个支持MFC坐标系,句柄保存在h中 Mmh=winaxes(m_hWnd);//设置作图区域 axesposition(10,10,150,180);if(isPhase){//画出相频特性图 plot((CL(f),p*180.0/pi));title((CL(TM(0相频特性图0)))); xlabel((CL(TM(0频率0))));ylabel((CL(TM(0相角0)))); } else{//画出幅频特性图 plot((CL(f),m));title((CL(TM(0幅频特性图0)))); xlabel((CL(TM(0频率0))));ylabel((CL(TM(0幅值0)))); } set(h,(CL(TM(0Color0)),TM(0white0)));set(h,(CL(TM(0Box0)),TM(0on0)));init=false;} //图形可以放大、缩小、移动drawnow();exitM(); 6)为voidCmyFFTView::OnLButtonDown(UINTnFlags,CPointpoint)添加如下代码: Mmm,p,f; //执行fft变换,幅值和相位保存在m和p中图1 幅频特性图 Fig.1 Magnitude-frequencyfeature 图2 相频特性图Fig.2 Phase-frequencyfeature 3 实现FFT所用编程方法的比较 表1是在Pentium4(1.8G),内存384M的PC机上,采用Matlab、VC++7.0以及Matcom与VC++7.0混合编制的FFT程序的比较[3]. 第4期盛歆漪等:Matlab、Matcom与VC++混合编程在FFT上的实现355 表1 实现FFT的3种编程方法的比较 Tab.1 Thecomparisonof3methodsofprogrammingto implementingFFT 编程方法 Matlab6.1语言VisualC++7.0语言Matcom4.5和 VC++7.0混合编程 代码长度/行 910822 运行时间/s 4 结 论 利用VC++结合Matcom编制数值算法的程 1.92200.01500.0200 序,执行速度比matlab程序快,编码工作量比C++程序少许多,但速度降低有限. 编程实践表明,在编制复杂的数值算法程序时,采用此方法可明显缩短软件开发周期,且易于调试. 参考文献: [1]DAVIDJKRUGLINSKI.VisalC++技术内幕(第四版)[M].潘爱民,王国印译.北京:清华大学出版社,1999.[2]李罗生,白立芬,李庆祥,等.用VC++6.0和Matlab语言混编开发图像处理实验软件[J].实验技术与管理,2001,18(4): 50-53. [3]徐士良.C常用算法程序集[M].北京:清华大学出版社,1996. (责任编辑:彭守敏) (上接第351页) 图6 模糊逻辑控制方法仿真结果 Fig.6 Thesimulationwaveformwithfuzzylogiccontrol 图7 分层模糊控制方法仿真结果 Fig.7 Thesimulationwaveformwithhierarchicalfuzzy control 1)模糊逻辑控制方法可以利用最优控制理论,减少模糊控制器的输入数目,以简化控制器的结构,但规则的设计和修改都相对复杂,而分层模糊控制方法就没有这些问题,规则设计符合人们的直觉判断,设计和修改简单明了. 2)对于处理复杂系统,分层模糊控制不失为更高效的处理方法.因为应用了分层方式,只需较少的规则就可获得较好的结果.这一点可通过表1与 表2、表3的比较得出. 因此,对于多状态变量的复杂系统,分层模糊控制方式的应用,可极大地减少模糊规则设计的复杂性.而且,根据大规模系统理论,并行系统结构有利于减少计算时间.如果将非线性理论应用于分层模糊控制方法的优化,就可提高系统的稳定性,改善品质.所以对分层模糊控制进行分段线性化,将成为深化其应用的方向. 参考文献: [1]RAJUGVS,ZHOUJ,KISNERRA.Hierachicalfuzzycontrol[J].IntJControl,1991,54(5):1201-1216.[2]程福雁,钟国民,李友善.二级倒立摆的参变量模糊控制[J].信息与控制,1995,24(3):189-192. [3]LINING,ZHANGNAIYAO,JINKAIYAN.StructrueanalysisoftypicalfuzzycontrollerswithunevenlydistributedInput membershipfunction[J].TsinghuaUniversity,2000,40(1):120-123. [4]刘春生,吴庆宪,邹新生,等.量化因子对二级倒立摆模糊控制器性能的影响[J].模式识别与人工智能,2000,13(4):404-406. (责任编辑:彭守敏) 因篇幅问题不能全部显示,请点此查看更多更全内容