王益民
(南京電子技術研究所, 南京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.