王益民
(南京电子技术研究所, 南京210039)
MATLAB是一套高级的数学分析和计算软件,具有科学计算与可视化功能、简单易用的开放可扩展环境,以及多达30多个面向不同领域而扩展的工具箱支持,集计算机辅助设计、分析与仿真一体,功能强大和灵活,编程效率高,在需要快速验证算法时,相比常见的通用编程平台(如:Visual C++等)有很大优势。但MATLAB也存在以下4点不足:
1)程序执行逐行解释,在实时仿真中影响速度;
2)无规范完整的图形用户界面标准;
3)不能直接访问底层硬件;
4)用户界面单调。
上述不足限制了它不能作为通用的软件开发平台,这给工程计算与应用带来很大的不便[1-3]。
而常见的通用编程平台(如:Visual C++等),功能灵活,与硬件接口能力突出,但面对信号分析领域先进的理论和方法,如:时频分析、小波变换、遗传算法等,编程效率低。因此,实现MATLAB与Visual C++的混合编程,使其有机结合,优势互补,具有很强的应用价值[4]。
MATLAB本身提供了多种外部接口,如:使用MATLAB自带的MATLAB Compiler、利用MATLAB引擎、利用Active控件、利用MAT文件、C-MEX等,通过这些外部接口,实现MATLAB与其他编程环境的混合编程,可以扩充MATLAB的强大的数值计算和图形显示功能,而避开其缺点[1]。
在一种雷达接收机A/D性能测试设备的研制中,针对MATLAB与硬件设备的接口能力较差,不能直接访问底层硬件设备的缺点,我们采用MATLAB外部接口混合编程技术,利用C语言编写自定义的MEX函数,在MATLAB环境中实现了对计算机设备的读写驱动,可直接获取A/D采集的数据,进而对数据分析处理,简化了系统软件的设计,提高了实时性能,充分利用MATLAB编程效率高、数学计算功能强大的特点。
在一种雷达接收机中,采用中频数字化方案,对雷达四个窄带通道和一个宽带通道的中频信号进行采样、数字下变频与正交相检,形成数字化的A/D数据,并完成数据的串行化和光纤传输,送往信号处理机进行后续处理,其信号数据率最大为320 MB/s,实时光纤传输速率为 2 Gb/s[5]。
A/D性能测试设备用于对接收机的A/D采样性能进行测试。它以VME总线作为硬件平台,包含了单板计算机、数据传输记录模块,系统构成如图1所示。
图1 A/D性能测试设备的系统框图
图中,单板计算机是系统的控制核心,采用符合VME总线标准的计算机模块,运行于Windows环境中。
数据传输记录模块用于实现与雷达接收机的点对点高速连接,将A/D送来的光纤数据串/并转换变为并行数据,存入板上存储器暂存,当存储满后,计算机读取到系统内存,由A/D性能测试软件进行分析处理。
A/D性能测试软件运行在Windows环境中,其总体框架如图2所示。它通过数据读写驱动程序实现对VME总线的读写操作,将A/D送来的光纤数据读入到内存,再由数据显示与分析程序对数据进行显示并计算分析得出A/D的性能指标。
图2 A/D性能测试软件框图
由于MATLAB与硬件设备的接口能力较差,不支持访问VME底层的硬件设备,常用的方法是通过VC++等通用软件编写数据读写程序,获取外部数据后,再由MATLAB程序调用数据进行分析处理,使处理的实时性能降低,也给开发带来一定难度。
在本文设计的系统中,我们结合MATLAB与C混合编程技术,采用C-MEX方式编程,实现在MATLAB环境下对计算机VME总线的读写驱动,直接完成A/D数据读取的底层操作,在此基础上,对数据进行分析和处理。其实质是在C框架下编写硬件驱动程序,形成动态链接库(DLL)函数,并保证该DLL函数符合MATLAB函数的接口要求,使之可被MATLAB直接调用。
下面着重介绍如何在MATLAB环境中,实现A/D数据读取的VME总线驱动设计。
所谓 MEX,是 MATLAB Executable的缩写,即MATLAB的可执行程序。在 Windows环境中,它是扩展名为DLL的动态链接库。MEX文件是MATLAB调用其他语言编写的程序或算法的接口,它符合MATLAB的调用格式,可以在M程序中直接调用。
用户可利用MATLAB的应用程序编程接口,使用C语言、Fortran语言等编写MEX函数,编译完成的MEX函数就可以像其他内建的MATLAB函数一样使用。MEX函数源代码由两部分组成:
第一部分,称为计算子程序(computational routine),它是要链接的外部子程序,用于完成用户定义的一些特定功能,如:数值计算、数据的输入、输出、对硬件的访问和开发等,用户想要将一些已经编写的程序和算法移植到MATLAB环境中使用,就需要将算法和程序整理成函数形式封装。
第二部分,称为入口子程序(gateway routine),相当于C语言中的main函数。入口子程序的作用主要是在MATLAB系统与被调用的外部子程序之间建立通信联系,也就是:定义被MATLAB调用的外部子程序的入口地址,定义MATLAB系统向子程序传递的参数,还定义子程序向MATLAB系统返回的参数,以及调用计算子程序等。
MEX函数源代码的两部分既可以分开,也可以组合在一起,但文件头必须包含语句:
#include“mex.h”
按照MATLAB的混合编程框架,在本程序中,编写MEX函数形式的驱动程序,分为两个部分:
1)入口程序的编程实现
在入口程序中,用户主要完成两个方面的任务:一方面,从输入的mxArray结构体中获得计算所需的数据,然后再调用用户的计算子程序加以使用;另一方面,用户同样可以将计算结果返回给用于输出的mx-Array结构体,这样MATLAB系统就能够获得用户计算子程序的结果。
入口子程序的函数名必须是mexFunction,函数共有4个参数,其中参数nrhs为MEX函数输入参数的个数,nlhs为MEX函数输出参数的个数,prhs是一个长度为nrhs的MEX函数输入参数变量指针数组,plhs是一个长度为nlhs的MEX函数输出参数变量指针数组。
源程序如下:
利用混合编程的关键点是输入输出接口参数的设置,只有保证驱动程序中定义的数据类型与MATLAB中的数据类型相匹配,才能进行正确的数据传输。
2)计算子程序的编程实现
计算子程序,主要完成硬件设备的VME总线读写,将A/D数据从板上数据存储区读入CPU内存区。它由入口子程序调用。其源代码如下:
/*向传输记录板上的硬件基地址为JK_FIFOBASE,偏移量为0的硬件地址,发出写总线命令,设置工作方式mode(宽带方式或窄带方式),并启动采集。
2.2.1 驱动程序的编译
上述两段程序存于ad_sample.c中,在MATLAB的命令窗口中输入:mex ad_sample.c,当正确无误,编译通过,生成与C语言文件名相同的DLL文件,该文件与其他MATLAB内嵌函数一样,可由MATLAB调用ad_sample了。
2.2.2 MEX函数的执行流程
当MEX文件生成后,在MATLAB环境中调用形式为:
ad_data=ad_sample(mode)
则MATLAB编译器使用下面的变量来调用mex-Function:
nlhs=1 nrhs=1
plhs=(pointer)->/unsigned*/
prhs=(pointer)->mode
在C语言的MEX文件中,参数nrhs为MEX函数输入参数的个数,nlhs为MEX函数输出参数的个数,借助这两个参数,MEX文件被调用。prhs是一个长度为nrhs的MEX函数输入参数变量指针数组,plhs是一个长度为nlhs的MEX函数输出参数变量指针数组,通过这两个指针,可以在计算子程序中使用这些变量进行计算。plhs指向空的数组是由于输出ad_data在子程序执行前尚未产生,入口程序的作用就是创建输出数组并分配指针plhs[0]指向该数组。MATLAB调用MEX函数的运行流程,如图3所示。
2.2.3 试验测试
基于上述生成的读写驱动程序,我们编写了界面化MATLAB的A/D性能测试软件,实现了数据读取、数据显示、数据分析等功能,配合测试系统完成了对以2 Gb/s速率光纤传输的A/D数据的采集与性能测试。图4为测试软件从光纤通道获取的A/D数据波形,三组波形分别反映了接收机A/D输出的正交分量、同相分量以及模值的数据。
图3 MEX文件的编译运行流程
图4 A/D性能测试软件的波形显示界面
本文结合一种A/D性能测试设备的研制,论述了采用MATLAB和C语言混合编程的MEX函数技术,编写对VME总线的硬件读写程序,解决了MATLAB不能支持硬件底层驱动的问题,扩展了MATLAB的功能。本文所提出的方法不仅适用于此类硬件与MATLAB软件的接口,还可实现MATLAB进行网络通信,进而用于MATLAB与其他应用程序之间通信,有助于发挥不同软件各自的优势,降低开发难度,达到简化编程的目的,从而缩短软件开发周期。
[1] 杨高波,亓 波.精通 MATLAB 7.0混合编程[M].北京:电子工业出版社,2006.Yang Gaobo,Qi Bo.Mastering MATLAB 7.0 mixed programming[M].Beijing:Publishing House of Electronics Industry,2006.
[2] 黄志军,戴余良,曾 斌,等.MATLAB外部网络接口的实现[J].计算机与数字工程,2004,32(3):70-72.Huang Zhijun,Dai Yuliang,Zeng Bing,et al.Implementation of MATLAB external network interface[J].Computer and Digital Engineering,2004,32(3):70-72.
[3] 赖 娟.VC++与Matlab的混合编程[J].信息技术,2006,30(6):123-126.Lai Juan.Hybrid programming between Matlab and VC++[J].Information Technology,2006,30(6):123-126.
[4] 禹 倩,白 雪.雷达信号分析虚拟仪器的设计与实现[J]. 现代雷达,2006,28(10):49-52.Yu Qian,Bai Xue.Design and implementation of radar signal analysis virtual instrument[J].Modern Radar,2006,28(10):49-52.
[5] 王益民.高速串行传输技术在雷达接收机中的应用[J].现代雷达,2009,31(4):84-86.Wang Yimin.Application of high-speed serial transmission technology in radar receiver[J].Modern Radar,2009,31(4):84-86.