首页 > 范文大全 > 正文

VC++与Matlab混合编程实现光场光强的三维显示

开篇:润墨网以专业的文秘视角,为您筛选了一篇VC++与Matlab混合编程实现光场光强的三维显示范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:基于vc++开发环境和matlab引擎函数,实现了激光衍射光场光强的三维动态显示。给出了实现过程和实验结果并进行了讨论。

关键词:VC++;Matlab;引擎函数库;三维显示;衍射

中图分类号:TP391文献标识码:B文章编号:1009-3044(2012)08-1906-03

The Realization of Three Dimension Display of Optical Field by Mixed Programming of VC++ and Matlab

YANG Ru-chao

(School of Electrical Engineering, Tongling College, Tongling 244000, China)

Abstract: Three dimension dynamic display of laser diffraction light intensity is realized by the method based on the development environment of VC++ and engine functions of Matlab in the paper. The realization steps and the result are presented and the result is discussed.

Key words: VC++; Matlab; engine functions library; three dimension display; diffraction

科研与工程实际中常常需要实时测量光场的光强分布规律,目前市场上尚无这方面的测量设备,本文结合实验室已有的设备进行了进一步开发,开发中采用了面阵CCD技术以及VC++与Matlab混合编程技术。

1 MATLAB与VC++应用程序接口

1.1 MATLAB与VC++应用程序接口

MATLAB与Visual C++之间有4种常见的接口:

1)在Visual C++程序中利用MATLAB引擎来调用MATLAB函数;

2)将MATLAB程序编译成MEX文件,与VC程序进行链接;

3) Visual C++程序直接利用MATLAB数学库调用MAILAB函数;

4)将MATLAB下的.m文件转换成VC可调用动态链接库(DLL)。

方法1)、2)生成的程序需要在安装了Matlab软件的系统中运行,而由方法3)、4)生成的程序可以脱离Matlab环境。

本文采用的是方法1),即Visual C++调用MATLAB engine。MATLAB engine是一组函数,通过调用这组函数,用户可以在程序中实现对MATLAB的控制,完成计算或者绘制图形的任务,此时MATLAB软件就相当于一个计算引擎。

1.2 MATLAB引擎程序建立

下面介绍如何在C/C++中调用Matlab Engine

1)在工程中加入Matlab Engine的头文件路径和库文件路径

在菜单中选择Tools-> Options-> Directories,添加engine.h所在的路径,在笔者的计算机上路径是D:\MATLAB6p5\extern\in? clude。类似的,在这个对话框的“Show directories for:”下拉菜单中选择Library Files,然后添加库文件的路径,路径是D:\MAT? LAB6p5\extern\lib\win32\microsoft\msvc60。

2)接下来设定工程属性,在菜单中选择Project-> Settings-> Link,在Object/Library Modules中加入库文件链接libmx.lib, libmex.

lib, libeng.lib。

程序执行时后台会启动一个Matlab进程,这是与Client通信的Server端,如果希望隐藏这个窗口,需要在代码中加入这样一句:

engSetVisible(ep, 0);

1.3 MATLAB引擎函数

在Matlab引擎函数库中,共提供了13个C语言引擎函数。这些引擎函数在头文件engine.h中进行了声明。下面是6个常用引擎函数:

1) engOpen:启动Matlab引擎;

2) engClose关闭Matlab引擎;

3) engGetVariable:从Matlab工作空间中获取一个变量;

4) engEvalString:执行一个用字符串表示的Matlab表达式;

5) engOutputBuffer:确定存放Matlab输出结果缓冲区域;

6) engPutVariable:将mxArray结构体类型变量输送到Matlab工作空间中,并命名mxArray结构体类型变量。

2三维显示程序的创建

该研究的应用背景立足于激光衍射光场光强的三维图像信息的抽取,需要进行三维图像的显示和数字滤波的实现。在Matlab的运行环境下,三维图象的显示只需要一个函数mesh()就可以实现。假设图象数据存放在iTemp二维数组中,VC与Matlab间的数据交换是通过Matlab引擎进行的。Matlab提供一种专门的对象类型数组mxArray完成数据传递的任务。这里注意的是Matlab的数据是按列存储的。部分程序如下:

int i, j ;

double iTemp[300][740];

double array[740*300];

Engine *ep;

mxArray *T = NULL;

//将二维数组iTemp的数据存储到一维数组array中f

or(i=0; i

for(j=0; j

array[j+i*740] = iTemp[i][j];

//开始启动matlab引擎

if (!(ep = engOpen(NULL)))

{

MessageBox ((HWND)NULL, (LPSTR)"Can’t start MA TLAB engine",

(LPSTR) "VC_MATLAB", MB_OK);

exit(-1);

}

//矩阵的构造与赋值

T = mxCreateDoubleMatrix(740, 300, mxREAL);

memcpy((char *) mxGetPr(T), (char *) array, 740*300*sizeof(double));

//将变量T输入到matlab工作空间

engPutVariable(ep, "T", T);

//通过matlab引擎库的库函数engEvalString()调用内建的绘图函数

engEvalString(ep, "mesh(T.’);");

//关闭matlab引擎

engClose(ep);

//析构结构体变量T

mxDestroyArray(T);

3实验结果与讨论

实验装置见图1,选用交流电子稳压电源,可以提高激光器的稳定性。用偏振光减光器来调节激光光强,以便于CCD器件的采集。为了得到较好质量的三维光强分布曲线,可以在单缝与激光器之间放入一个小孔光阑限制激光束的大小。实验在暗环境中进行。光屏与单缝之间的距离尽可能的满足远场条件,缝宽在0.05~0.1mm时,Z>1m即可,这样就可以得到近似的夫琅和费衍射。

图1测量装置示意图

上述三维显示程序是整个系统软件的一个部分,我们采用CCD摄像头对单缝衍射光场进行采集,再通过调用三维显示程序,就可以很形象的显示出三维光强分布,如图2,Z轴表示衍射光场光强的灰度值大小,X轴和Y轴表示衍射光场的列数与行数。通过工具栏上的旋转按钮可以进行任何视点角度的观察。调用三维显示程序,能更准确,快速,方便的定量描述光的衍射。

从图2可以得知,当x=0时,光强为中央主极大值,光强最强,说明绝大部分的光能都落在中央明纹上,暗条纹是以中央明纹为对称轴的左右对称分布的,中央明纹两侧的亮纹强度逐次减弱,除了一级亮纹和二级亮纹之外,其他级次的亮纹都不明显,近似为0。

图2激光衍射光强三维图

4小结

混合编程是综合使用多种开发工具技术优势的一种常用手段,本文通过对VC++和Matlab的集成开发,实现了对二维衍射光场光强的三维效果显示。Matlab具有强大的信号处理函数库能实现信号生成、信号重抽样、各种积分变换等,对衍射光场光强的数据的进一步处理提供了极大的方便。

参考文献:

[1]王素立.MATLAB混合编程与工程应用[M].北京:清华大学出版社,2008.

[2]苏金明. MATLAB与外部程序接口[M].北京:电子工业出版社,2004.

[3]李卓,李益民.Matlab与VC++混合编程技术在图像处理中的应用研究[J].电脑知识与技术,2011,7(8):5450-5452.

[4]车敏,张红梅. Matlab与VC联合编程在数字水印工程中的应用[J].现代电子技术, 2010, 33(24):55-58.