摘要:在Qt雷达仿真体系中,数据处理及图形显现尤为重要。本文为此提出了一种Qt与MATLAB混合编程的办法。通过VC++和MATLAB混合编程技能,将MATLAB函数封装成动态链接库,Qt调用这个动态链接库完结图形处理功用,然后改进Qt界面中雷达信号仿真问题。
导言
Qt是一个跨渠道的C++图形用户界面使用程序开发结构。它包括跨渠道类库、集成开发东西和跨渠道IDE[1]。因为强壮的跨渠道特性,运用Qt只需一次性开发使用程序,无须从头编写源代码,便可跨桌面和嵌入式操作体系运转。在图形处理方面,Qt供给了用于2D绘图的QPainter绘图类和第三方绘图库Qwt,能够制作简略的图形,但其进程杂乱、设置繁琐,且操作进程不易完结。
MATLAB作为一种高功用的数值核算和可视化软件,它集数值剖析、矩阵运算、信号处理和图形显现于一体, 构成了一个便利、界面友爱的用户环境。比较Qt而言,MATLAB有非常强壮的图形化显现矩阵和数组的才干,用MATLAB生成的图形可轻松完结增加文字说明、标示坐标轴、曲线注释等多种功用,而这些若由Qt来完结则较为杂乱。针对Qt的绘图缺陷,提出了Qt与MATLAB混合编程技能,首要包括两种办法:Qt调用MATLAB的引擎和Qt调用MATLAB生成的动态链接库。Qt调用MATLAB引擎参加很多MATLAB库,功用非常强壮,但其编程量巨大,运转功率较低,不利于开发运用。而运用MATLAB生成的动态链接库使程序能够脱离MATLAB环境独立运转,节约程序所占用的内存资源,进步了程序的履行功率。当然,因为MATLAB7.0前后不同版别编译器的不同特色,混合编程办法也会有所不同。下面本文将详细介绍如何将MATLAB函数转换为Qt可用的DLL的办法,并使用到Qt雷达仿真体系工程中。
1 Qt图画显现窗口
1.1 显现窗口
Qt能够使体系取得高效的作业功用,是因为它具有一个重要机制——信号和槽机制[2]。信号和槽用于两个方针之间的通讯,信号和槽机制是Qt的中心特征,也是Qt不同于其他开发结构最杰出的特征。QWidget类是一切用户界面方针的基类,是Qt中树立用户界面的首要元素。在雷达仿真体系中,将图形显现模块作为一个封装的窗口组件嵌入到体系中,窗口组件首要以窗口部件QWidget为基类,嵌入MATLAB的Figure窗口[3],运用信号和槽等完结数据处理和图形制作。
1.2 绘图需求
跟着雷达技能的不断发展,雷达体系的杂乱度日积月累,雷达体系的规划越来越多地凭借仿真来进步作业功率。一套完好的Qt雷达仿真体系必不可少的便是图形显现,用于直观地观测雷达各个模块的波形及运动轨道。Qt供给了2D绘图体系[2],能够运用API在屏幕和绘图设备上进行制作,首要根据QPainter、QPaintDevice和QPaintEngine这3个类,其间QPainter用来履行绘图操作,QPaintDevice供给绘图设备,QPaintEngine供给了一些接口。一起,Qt的第三方绘图库QWT可生成各种统计图,它的方针是以根据2D办法的窗体部件来显现数据。可是这两种绘图办法的编程进程比较杂乱,尤其在处理很多数据和三维图形显现时更是难以完结。MATLAB有强壮的图形化显现矩阵和数组的才干,一起也能给图形增加注释而且打印这些图形。它既包括一些便利地发生二维、三维技能专业图形的高档绘图函数,也包括一些能够运用户灵敏操控图形特色的初级绘图指令。其他,用户还能够运用MATLAB的句柄图形技能创立图形用户界面[4]。这种言语可移植性好、可拓展性极强,所以选用Qt与MATLAB混合编程的办法,才干完结强壮的图形处理功用。图1为雷达方针检测仿真成果图。
2 Qt调用动态链接库
2.1 Qt调用动态链接库流程
Qt调用动态链接库首要有两种挑选计划,一种是运用VC++调用MATLAB生成的独立可履行的C++函数文件创立集成的绘图动态链接库,Qt窗口组件来调用它;另一种是Qt直接调用MATLAB生成的独立可履行的C++函数文件创立集成的绘图动态链接库,然后Qt窗口组件运用这个动态链接库文件。因为VC++与MATLAB混合编程技能相比照较老练,并得到广泛使用,所以咱们选用第一种计划。图2展现了在Qt中调用动态链接库的进程。
2.2 VC++动态链接库嵌入到Qt中
Qt窗口组件调用VC++动态链接库,完结绘图和图形显现功用,在工程目录中增加上述dllMATLAB.h、dllMATLAB.dll和dllMATLAB.lib文件。在工程的办理文件.pro中加载需求衔接的动态链接库,增加代码“LIBS+= -L ./ -ldllMATLAB”。在头文件中增加动态链接库供给的头文件的“dllMATLAB.h”。这样咱们就能够调用MATLAB函数库中的绘图相关函数,对数据进行图形处理了。
可是调用显现的Figure窗口却是独自显现的,与Qt中窗口组件不一致,为使界面风格一致,用户界面漂亮,咱们需求将MATLAB的Figure窗口嵌入到Qt窗口组件中。这种办法的根本思路是去除MATLAB 的Figure窗口的标题栏及边框,然后把它移动到Qt窗口组件中,一起设定Qt窗口组件为父窗口。详细由以下代码完结。获取MATLAB 的Figure窗口句柄:
HWND hfigure =FindWindow(NULL,str.toStdWString().c_str());
取得Qt窗口组件的句柄:
HWND centralWidget = (HWND)(this->winId());
设定Qt窗口组件为Figure窗体的父窗体:
if(NULL==::SetParent(hfigure, centralWidget))
2.3 创立VC++动态链接库
要想在Qt中调用MATLAB的各种绘图函数,满意工程需求,运用动态链接库无疑是最好的挑选。
动态链接库[6]是Windows操作体系中完结同享函数库概念的一种办法,使进程能够调用不属于其可履行代码的函数。DLL能够选用多种编程言语来编写。例如,能够运用Qt来编写程序界面,然后调用VC++编写的完结绘图功用的DLL。动态链接库有助于同享数据和资源,简化项目办理,节约磁盘空间和内存,更易于晋级。
2.4 MATLAB数据类型与VC++数据类型彼此转化
咱们知道在MATLAB傍边运算都是根据矩阵的,因而,在VC++中调用MATLAB函数时,不管函数的返回值、参数有必要是矩阵类型(mwArray)[7],而在C++傍边的二维数组能够当作一个矩阵,在VC++傍边能够用下面的函数将数组转化成MATLAB中的矩阵类型。例如data= new double[m*n],能够用mwArray mwdata(m,n,data);这样就能够将二维数组变量转化成mwArray 类型,从而能够作为MATLAB函数的参数。反之,把mwArray 类型的变量转化成C++中的二维数组:例如存在mwArray 变量mwdata,用函数size取得矩阵的巨细,row=size(&col,mwdata),其间row,col是函数的返回值,data=new double[row*col];data.ExtractData(mwdata); 这样就能够把mwArray类型转化成数组类型。其他,用GetData()和mxGetPr、mxGetPi组合能够得到指向mwArray方针的指针。
3 VC++和MATLAB混合编程
3.1 VC++与MATLAB混合编程进程
在工程实践中,VC++调用MATLAB 的办法首要有两种:调用MATLAB核算引擎和调用MATLAB生成独立可履行的C++函数文件。为满意工程需求,挑选第二种办法。
3.1.1 在MATLAB中进行编译器设置
MATALB编译器是一个运转于MATLAB环境的独立东西。其首要功用是把M程序转换成C/C++代码,然后再调用外部C/C++编译器,把发生的源代码编译、链接成用户指定的格局[4]。
需求在MATLAB环境中装备外部C/C++编译器,在MATLAB指令环境行输入mbuid-setup设置要用到的C/C++编译器。输入mex-setup对MEX文件进行装备编译。
3.1.2 新建M文件并编译
(1)树立M文件,将工程中需求用到的数学函数库和图形库中的常见函数plot、mesh、hist、image、figure、fft、contour、set、get等函数编写成M函数。功用相同的函数,参数个数不一起要视为两个不同函数。
(2)运用mcc指令编译M文件,在MATLAB环境中运用mcc指令将M文件编译成可独立履行的C++函数文件。
3.1.3 在VC++中进行编译环境设置
首要设置体系变量,在体系环境的用户变量增加MATLAB及VC++软件的装置目录。然后在VC++设置编译环境:
(1)增加MATLAB库的头文件和库函数的途径;
(2)设置运转时动态链接库;
(3) 导入静态链接库文件。
3.1.4 创立动态链接库
动态链接库是将功用封装在一起的模块,因而,与代码直接写入调用模块中比较,它不仅能够进步程序的复用,削减代码开发作业量,一起也能够节约内存,进步代码运用率。
VC++调用MATLAB混合编程生成能够独立运转的C++代码,创立动态链接库,通过静态加载或动态加载的办法来运用DLL。新建一个空的动态链接库工程,增加一个头文件dllMATLAB.h和源文件dllMATLAB.cpp。将mcc编译后生成的C++文件增加到项目中,对MATLAB中M文件中的函数从头界说,满意MATLAB数据类型与VC++数组类型彼此转化。编译生成dllMATLAB.dll和dllMATLAB.lib文件。这样其他使用程序只需将dllMATLAB.h、dllMATLAB.dll、dllMATLAB.lib增加到工程目录中就能够运用这个动态链接库,完结调用MATLAB的绘图功用了。
3.2 MATLAB不同版其他差异
值得注意的是,不同MATLAB软件版别导致混合编程的办法不同。与之前版别比较,MATLAB7.0之后的版其他编译器发生了较大改变。其首要新特色及改变包括以下两个方面:一、不再供给C++数字库和图形库;二、不再编译一切的M函数,仅仅发生必要的C/C++接口函数。
所以VC++调用不同版其他MATLAB的动态链接库的进程也有很大不同,详细表现在三个方面。
3.2.1 mcc指令及编译发生C++文件不同
MATLAB7.0之前的版别编译指令为:mcc – B sglcpp (文件名),参数“ – B sglcpp ”意义是将. m文件编译成为C++代码,生成.cpp和.hpp文件,供给图形库支撑, 并编译为独立运转的exe程序。
MATLAB7.0之后版别运用mcc指令。假定要把M文件编译成C言语动态链接库文件“mcc -W lib:(对应链接库称号) -T link:lib (文件名M)”。假定要把M文件编译成C++言语动态链接库文件:“mcc -W cpplib:(对应链接库称号) -T link:lib (文件名M)”。这儿咱们选用第二种办法编译运转之后,在目录下面将会呈现以下以.lib、.dll、.exports、.exp、.h和.cpp为后缀的6个文件。
3.2.2 在VC++工程中头文件及初始化设置等不同
在MATLAB7.0曾经,在VC++程序中运用MATLAB编译器发生代码时,有必要在VC++源程序中别离包括MATLAB.hpp。从MATALB7.0起,MATLAB的编译器不再供给MATLAB.hpp,代之以mclmcr.h。
其他,在调用MATLAB初始化设置时,MATLAB7.0曾经选用以下代码:
void initialMATLAB() //初始化设置
{ libmmfileInitialize();//初始化MATLAB数学库
libmwsglmInitialize();//初始化MATLAB图形库
mlfHGInitialize(NULL,NULL);}
MATLAB7.0之后版别编译发生的动态链接库,对每个M文件都有初始化及开释设置,也便是说不需求全体的初始化及开释设置,只需对运用的函数进行初始化,详细参阅MATLAB协助。
3.2.3 程序发布办法有所不同
因为程序中调用了MATLAB 数学函数库或图形库中的函数,MATLAB7.0之前版别需求顺便MATLAB的这些函数库才干在没有装置MATLAB 的机器上运转。以MTALAB6.5为例,咱们需求搜集libmmfile.dll、libmwservices.dll、libut.dll等函数库,并将这些文件增加到使用程序Debug目录或许Release目录下,这样程序就能够未装MATLAB软件的机器上运转,简化了MATLAB与C/C++的混合编程,可移植性强。
MATLAB7.0之后版其他编译器不再供给C++数字库和图形库,而是运用MATLAB组件运转环境MCR(一组规范的动态链接库),它供给了运转编译后的程序所需的根本环境[4]。所以要想程序发布到其他没有装置MATLAB的核算机上运用,有必要在方针核算机上装置MCR,其文件坐落MATLAB 装置目录的extern\lib\win32子目录MCRInstaller.exe,运转MCRInstaller.exe程序即可主动把需求的库函数解压到当时目录中,这样程序就能够脱离MATLAB运转。
通过比照发现,不同版别各有优势,在咱们的工程项目中选用了MATLAB6.5,这样要想发布VC++创立的动态链接库只需搜集库文件,尽管搜集进程杂乱,可是可移植性强,灵敏性高,用户操作简略。
4 总结
本文选用Qt与MATLAB混合编程的办法满意了Qt工程中对数据处理和图形显现的要求,增强了Qt的绘图功用。通过项目的实践,调用MATLAB生成的可独立履行的动态链接库在项目中得到了较好的使用。当然,集成的动态链接库还需求进一步地完善来满意不同的项目对绘图及杂乱数值运算的要求,为用户供给功用强壮的开发渠道。因为Qt优秀的跨渠道特性和MATLAB的图形处理功用,信任未来Qt与MATLAB的混合编程在嵌入式体系的使用远景会愈加宽广。
参阅文献:
[1]霍亚飞.Qt Creator快速入门(第2版)[M].北京:北京航空航天大学出版社,2014.
[2]丁林松,黄丽琴.Qt4图形规划与嵌入式开发[M].北京:人民邮电出版社,2009.
[3]张亮,王继阳等.MATLAB与C/C++混合编程[M].北京:人民邮电出版社,2008.
[4]董维国.浅显易懂MATLAB7.x混合编程[M].北京:机械工业出版社,2005.
[5]魏鑫,陈辉强,高飞.Qt与MATLAB的混合编程究与完结[J].核算机与现代化,2010,9(1):168-170.
[6]孙鑫,余安萍.VC++深化详解[M].北京:电子工业出版社,2006.
[7]刘维.通晓MATLAB与C/C++混合程序规划(第2版)[M].北京:北京航空航天大学出版社,2008.
[8]马兴义.MATLAB6使用开发攻略[M].北京:机械工业出版社, 2002.
[9]张明友,汪学刚.雷达体系(第2版)[M].北京:电子工业出版社,2006.
本文来源于我国科技期刊《电子产品世界》2016年第9期第57页,欢迎您写论文时引证,并注明出处。