999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Visual C++,LabVIEW,LabWindows/CVI與MATLAB接口技術的研究

2007-01-01 00:00:00袁中凡
計算機應用研究 2007年2期

摘 要:詳細闡述了當今最為流行的面向對象的可視化編程工具Visual C++、虛擬儀器設計平臺LabVIEW、LabWindows\\CVI與計算及繪圖功能強大的MATLAB之間的接口技術,從而進行相互融合,更好地體現各自的優越性。實例證明了接口技術的有效性和可行性。

關鍵詞:VC++;LabVIEW;LabWindows/CVI;MATLAB;混合編程

中圖法分類號:TP311文獻標識碼:A

文章編號:1001—3695(2007)02—0281—05

MATLAB是MathWorks公司開發的演算紙式的程序設計語言,是一個跨平臺的科學計算環境,其具有強大的矩陣列運算、數值分析、信號處理、系統識別、圖像語音處理等功能。應用MATLAB軟件可以很方便地實現許多復雜的數學算法,而這些復雜的算法在其他開發環境中需要大量代碼才能實現。但MATLAB也有不足之處,如在數據輸入、硬件控制等方面相對較弱,程序執行速度也相對較慢且一般需要在MATLAB環境下運行。所以在解決實際工程問題時往往將MATLAB與其他高級語言混合編程,將MATLAB強大的數學功能服務于其他開發環境。Microsoft Visual C++(VC++)是一種面向對象的可視化高級編程工具,它是微軟公司推出的支持32位操作系統的開發工具,提供了對Microsoft最新技術的集成,以及一個可視化的編程模式,是Windows平臺上理想的開發工具;但VC++數學計算能力不強,難以實現復雜的數學算法。LabVIEW和LabWindows/CVI是目前最有影響的虛擬儀器開發平臺,它們將計算機軟件設計平臺與數據的采集、分析、處理及結果表達等儀器專業工具有機地結合起來,作為交互式的高效率的集成開發環境;但LabVIEW和LabWindows/CVI仍然無法滿足復雜的數值計算和分析需求。本文結合上述各種開發環境的優缺點,闡述了VC++, LabVIEW, LabWindows/CVI與MATLAB混合編程的接口技術,并以實例成功證明了混合編程接口技術的優越性。

1 Visual C++與MATLAB接口通信技術

VC++可開發基于MFC以及基于Windows API的Win32程序,其特點是代碼效率高、執行速度快,可開發出風格多樣的界面,其不足是開發數字圖像處理算法時代碼編寫工作量很大。如果將MATLAB強大的數值處理功能融合于 VC++開發環境,將為工程項目開發提供更有力的技術支持。 VC++和MATLAB的接口有四種途徑。

1.1 MATLAB自帶編譯器

通過MATLAB自帶的編譯器將M文件轉換為C,C++等各種不同類型的源代碼,并在此基礎上根據應用需要生成MEX文件和獨立可執行應用程序(Stand-alone Applications),大大提高了程序運行速度及代碼執行效率。尤其是獨立可執行應用程序可以完全脫離MATLAB環境獨立運行,大大擴展了程序的應用范圍。但是,MATLAB編譯器不能編譯腳本M文件、有Object的M文件、用Input或Eval語句操作工作空間變量的M文件,同時MATLAB編譯器也不能編譯MATLAB的內建函數。

1.2 在VC++中調用MATLAB數學庫函數

在VC++的集成環境下進行程序設計,MATLAB C++數學庫最大的應用價值就在于脫離MATLAB環境運行。VC++調用MATLAB數學庫和圖形庫有幾個明顯的優點:執行速度快、內存需求小,可以發布給沒有MATLAB的用戶使用。但它也有幾個明顯的缺點:不能調用圖形句柄系統的函數;不能調用MATLAB工具箱中的函數;MATLAB中的一些方法在C/C++中得不到支持。使用MATLAB數學函數庫的環境設置步驟如下(假設MATLAB安裝在E盤根目錄下):

(1)在VC++開發環境中由Tools->Options…->Directories在“Show directorie for”欄中首先選擇Includefiles,再在“Show directorie for”中加入E:\\MATLAB\\extern\\include 和E:\\MATLAB\\extern\\include\\cpp,然后在“Show directories for”欄中選擇Library files,再在“Dircetories”中分別加入E:\\MATLAB\\bin,E:\\MATLAB\\extern\\lib。

(2)在VC++開發環境中由Project->Settings…->C/C++在C/C++的“Category”欄中選擇Preprocessor,然后在出現的“Preprocessor definition”欄中加入MSVC,MSWIND。

(3)設置運行時動態鏈接庫。由VC++開發環境中的Project->Settings…->C/C++,在C/C++的“Category”欄中選擇Code Generation,然后在出現的“User run-time library”欄中選擇Multithreaded DLL。

(4)在完成(1)—(3)后就可以建立工程了。在源程序中必須加上#include \"MATLAB.hpp\",但在工程編譯前要把libmx.lib,libmatlb.lib,libmatpm.lib和libmmfile.lib等文件添加到工程中。其方法是在由VC++開發環境中Project->Add to Project->Files…彈出的“Insert Files to Project”對話框中,從目錄E:\\MATLAB\\extern\\lib中選擇上述文件后按“OK”按鈕即可。

1.3 用Matcom軟件實現VC++與MATLAB的接口通信

Matcom是MathTools公司推出的一個能將M文件轉換成相同功能C++代碼的工具。相比MATLAB自帶的編譯器Compiler,Matcom可生成不需MATLAB環境支持的EXE文件,從而脫離MATLAB環境對MATLAB函數和過程進行有效調用。Matcom的應用主要有三個方面:①利用Matcom生成獨立執行的EXE文件;②利用Matcom生成動態鏈接庫(DLL)文件;③利用Matcom提供的Visual Matcom功能使Matcom工具條顯示在VC++集成環境中。啟動VC++6.0,由Tools->Customize選擇“Add-ins and Maro Files”,點擊“Brouse”,選擇文件類型為lib,在Matcom\\bin下找到MVCIDE.dll文件并點擊“OK”,這樣Matcom工具條就出現在VC++集成環境下了,可在VC++中直接編譯M文件。

使用Matcom時的Visual VC++環境設置如下:

(1)在VC++開發環境中由Tools->Options…->Directories->Show Directories for,在Include files和Library files兩項中分別加入Matcom下的lib目錄,如D:\\MATCOM45\\lib。

(2)在VC++開發環境中由Project->Add To Project->Files將D:\\MATCOM45\\lib\\v4501.lib加入工程,在VC++源文件的頭文件處應包含matlib.h。VC++源文件中調用由M文件轉換的VC++代碼之前應用initM(Matcom_VERSION)函數來初始化類庫調用,并用exitM()函數來結束類庫調用。因此在Main.cpp文件中加入下列代碼:

1.4 在VC++中調用MATLAB引擎實現接口通信

與其他三種接口方式相比,MATLAB引擎所提供的MATLAB功能支持是最全面的。通過引擎,應用程序實際上會打開一個新的MATLAB進程,可以控制它完成任何計算和繪圖操作,對所有的數據結構都提供100%的支持。MATLAB引擎采用客戶機+服務器模式,其實質是用ActiveX自動化DDE技術來實現VC++與MATLAB之間的數據通信。在具體應用程序中,VC++作為客戶端負責用戶接口并提出數據請求,而MATLAB則屬于服務端,向客戶端提供數據服務。MATLAB提供了以下幾個引擎函數與客戶端進行交互:

(1)engOpen,啟動MATLAB引擎;

(2)engClose,關閉MATLAB引擎;

(3)engEvalString,向MATLAB發送一個字符串,讓MATLAB執行;

(4)engOutputBuffer,確定存放MATLAB輸出結果緩沖區域;

(5)engGetArray,從MATLAB工作空間獲取一個變量;

(6)engPutArray,將mxArray結構體變量輸送到MATLAB工作空間。

在VC++集成開發環境中建立和調試MATLAB引擎的基本步驟如下:

(1)啟動VC++ 6.0,建立MFC AppWizard(exe)類型工程。

(2)項目工程創建完畢后,在VC++開發環境中由Tools->Options…->Directories->Show Directories for,在Include Files和Library Files兩項中分別加入MATLAB根目錄\\extern\\include,MATLAB根目錄\\extern\\lib\\win32\\microsoft\\msvc60,然后選擇“OK”按鈕。

(3)在VC++開發環境中,選擇下拉式菜單Project中的菜單項Settings,打開工程設置屬性頁,選擇Link頁面,在“Object/Library modules”編輯框中添加文件名libmx.lib。

步驟(2)只需設置一次,而步驟(3)則每個工程都要單獨設定,因為每個工程使用的MATLAB函數可能不一樣。

經上述三個步驟,用戶便完成了對VC++ 6.0開發環境MATLAB引擎函數的調用、設置以及MATLAB引擎程序的建立,經過編譯、鏈接后便可執行。

1.5 應用舉例

前面主要基于VC++與MATLAB各自的優缺點,提出了將它們混合編程接口的四種途徑。與其他三種方法相比較,用MATLAB引擎實現接口節省了大量的系統資源。該應用程序整體性能好,引擎提供的MATLAB支持功能最全面,可充分發揮MATLAB的數值計算和圖形處理的功能,對所有數據結構提供完全支持。在實際工程問題中,用戶可根據具體情況選擇適合自己的接口技術。筆者針對每一種接口技術,一一在計算機上進行了調試、驗證。事實證明上面的四種VC++與MATLAB的接口技術都完全正確、有效。限于篇幅,在此只對用MATLAB引擎實現接口詳細舉例。

MATLAB在信號處理和圖形顯示方面具有VC++無法比擬的優勢。在MATLAB中實現FFT算法只需要一個函數fft()就可實現,如果采用VC++將需要很長的代碼,并且還需要理解FFT的原理。如果采用VC++調用MATLAB引擎函數來實現FFT算法,就大大減少了編程的工作量,提高了編程效率,可以很方便地實現信號的FFT變換。 

現有模擬信號x(t)=sin(2πft)+3sin(4πft),求N點DFT的幅值譜。其主要步驟如下:

(1)用VC++生成一個Engdemo的單文檔MFC應用程序。

(2)根據第1.4節所介紹的方法設置編譯環境。

(3)添加一個新的CPP文件進入工程,其文件名為matlab.cpp,代碼如下:

(4)添加一個“Engine”菜單,在“Engine”菜單下添加一個“demo”菜單項。

(5)實現“demo”菜單項的消息函數。

編譯運行程序,單擊“Engine”菜單上的“demo”菜單項,后臺啟動MATLAB,并顯示如圖1所示的結果。

2 虛擬儀器開發平臺LabVIEW,LabWindows/CVI與MATLAB接口技術

LabVIEW是目前國際上唯一的編譯型圖形化編程語言,它提供了豐富的數據采集、分析及存儲的庫函數,是一個開放型的開發環境,擁有大量與其他應用程序通信的VI庫。例如LabVIEW使用自動化ActiveX,DDE和SQL,可與其他Windows應用程序集成;在對硬件的支持方面,LabVIEW集成了與GPIB,VXI,PXI,RS-232/485,PLC和插入式數字采集設備等進行數據通信的全部功能。 LabVIEW還直接支持動態數據交換(DDE)、結構化查詢語言(SQL)、TCP和UDP網絡協議等。LabWindows/CVI以標準C語言為基礎,將計算機軟件設計平臺與數據的采集、分析、處理及結果表達等儀器專業工具有機地結合起來,作為交互式的集成開發環境,LabWindows/CVI提供大量與外部代碼或軟件進行接口的機制,如DLL(動態鏈接庫),DDE(共享庫),ActiveX控件等。LabWindows/CVI是熟悉C語言的開發設計人員開發檢測、數據采集、信號處理、監控等虛擬儀器的理想工具。盡管如此,但LabVIEW和LabWindows/CVI仍然無法滿足復雜的數值計算和分析需求,所以在大型的測試系統和虛擬儀器開發中,LabWindows/CVI就顯得力不從心,而MATLAB是一種高效率的數學計算工具,將它與LabVIEW,LabWindows/CVI混合起來編程是一種非常有效的開發途徑。下面就LabVIEW,LabWindows/CVI與MATLAB之間的接口技術進行詳細介紹,并舉例驗證。

2.1 LabVIEW與MATLAB的接口

LabVIEW可通過MATLAB Script節點與MATLAB通信。

2.1.1 MATLAB Script節點

MATLAB Scrip節點使用戶既可以將在MATLAB下編寫的M程序導入到流程圖中,又可在流程圖中根據MATLAB程序的語法編輯M程序。在LabVIEW中選擇該節點的操作為:在流程圖編輯窗口中由Function→Mathematics→Formula→MATLAB Script將該節點添加到流程圖中。打開MATLAB Scrip節點之后,可直接在其框圖內編寫MATLAB程序代碼。如果事先已經將MATLAB程序編輯好,則可直接將其導入到節點中,可通過單擊“Import”完成導入;還可以通過在節點邊框上右擊鼠標右鍵,在彈出式菜單中選擇“Add Import”或“Add Output”增加輸入、輸出變量,起到在LabVIEW與MATLAB之間傳遞參數的作用。

2.1.2 MATLAB Script應用示例

前面詳細介紹了MATLAB Script節點的使用方法,下面通過虛擬信號提取的仿真設計加以演示。

(1)小波分析在信號提取中的應用。在信號的采集、傳輸與處理過程中,由于外界或電路內部因素的干擾,使得信號被噪聲污染,所處理的噪聲或高頻信號中夾雜著一些有用的緩變信號,通過小波分析可將緩變的有用信號從噪聲或其他高頻信號中識別出來。在實際工程中,有用信號通常表現為頻率較低、平穩的信號,而噪聲信號或其他高頻信號則表現為頻率較高的信號。應用小波分析進行信號提取主要涉及到小波的分解與重構。

(2)虛擬信號提取儀的設計。本例中含有噪聲的一維信號為

s(i)=f(i)+e(i),i=0,1,2,…,n-1

其中, f(i)為真實的低頻緩變信號——Sine Wave;e(i)為噪聲信號——Uniform White Noise。

在該仿真過程中,LabVIEW通過數據采集或仿真生成含有噪聲或高頻信號的低頻緩變信號,通過虛擬儀器前面板設置信號提取處理的參數,將參數通過LabVIEW與MATLAB的接口傳遞給MATLAB相應的功能函數,完成信號分析與處理功能,最后將處理結果回傳給LabVIEW進行顯示。MATLAB小波工具箱提供了許多小波分析功能函數,包括小波分析通用函數、小波函數、一維小波變換、二維小波變換、小波包算法等。在該仿真過程中主要應用了WEDN函數,該函數可直接對一維信號消噪,其調用格式為[XD,CXD,LXD]=WDEN(X,TPTR,SORH,SCAL,N,′wname′),函數的返回值是經過對原始信號X進行消噪處理后的信號XD及其分解結構[CXD,LXD]。式中,SORH指定軟閾值(SORH=s)或硬閾值(SORH=h)的選擇;TPTR指定閾值的選取規則,它有四種選擇:Rigrsure,Heursure,Sqtwolog,Minimaxi,本程序中選擇Heursure,即首次選擇的啟發式變量作為閾值;N為小波分解的層數;wname指定分解時所用的小波。小波信號提取仿真過程的設計步驟如下:

(1)打開LabVIEW,在前面板開發窗口中放置兩個波形顯示控件(Waveform Graph),即用于顯示含噪聲的波形和用于顯示消除噪聲后的波形。放置三個數值輸入控件,分別用于設置低頻緩變信號頻率、消噪層數(X)和采樣頻率。

(2)在流程圖窗口中放置正弦波形發生器(Sine Wave.vi)、均勻分布的隨機信號發生器(Uniform White Noise.vi),分別用來產生正弦波序列和均勻分布的隨機序列,它們分別用來仿真低頻緩變信號和噪聲信號;添加加法器(Add)將低頻緩變信號和噪聲信號疊加;由Function->Mathematics->Formula操作選擇MATLAB Script放到流程圖編輯框中,添加輸入變量XX,X和輸出變量XD,對應數據類型分別為Real Vector,Real,Real Vector。

(3)按照圖2所示的連線圖進行數據流向的連接,在MATLAB Script節點編輯框中編寫M程序。

(4)運行程序。單擊前面板上的“低頻緩變信號頻率”按鈕,選擇仿真正弦信號的頻率;單擊“消噪層數”按鈕,確定消噪層數;單擊采樣頻率按鈕,選擇仿真正弦信號的采樣頻率;最后運行儀器VI文件。其結果如圖3所示。

圖3 運行結果

由此可以看出,運用LabVIEW和MATLAB軟件的接口技術,通過小波分析成功地實現了信號提取的仿真過程。通過此例可以看到,基于LabVIEW 和MATLAB接口技術的虛擬儀器的開發是完全可行的。LabVIEW是圖形化儀器編程語言,它方便易用,盡管其提供了大量的信息功能處理函數,但畢竟功能有限;而MATLAB有強大的矩陣列運算、數值分析、信號處理、系統識別、圖像語音處理等功能。通過接口技術在LabVIEW中調用MATLAB是開發虛擬儀器的有效途徑。

2.2 LabWindows/CVI與MATLAB的接口通信

通過在LabWindows/CVI環境下建立一個數據交換ActiveX服務控件可以實現與MATLAB之間的接口通信。建立ActiveX服務的方法有兩種:

(1)在LabWindows/CVI 6.0窗口中,用戶自行創建ActiveX服務函數,但這種方法要求先裝MATLAB,后裝LabVIEW/CVI。其步驟如下:

①打開LabWindows/CVI窗口中選擇Tools->Create ActiveX Controller,彈出ActiveX Controller Wizard-Welcome對話框,單擊“Next”,會在ActiveX Controller Wizard-Choose Server中列表顯示出系統已安裝的ActiveX Server,在列表中選擇“Matlab Automation Server Type Library”選項。

②單擊“Next”后,彈出ActiveX Controller Wizard-Configure對話框,需要對目標FP文件命名并設定存放路徑,假設文件名為MATLABatvx.fp,存放路徑為D:\\CVI6.0\\Work,單擊“Next”。

③在彈出的ActiveX Controller Wizard-Advanced Options對話框中單擊“Advanced Options…”,按下“Check All”按鈕,其余按照默認方式。單擊“Next”后,系統將自動生成MATLABatvx.fp,MATLABatvx.c,MATLABatvx.h,MATLABatvx.obj和MATLABatvx.sub五個文件。在目錄D:\\CVI6.0\\Work下找到如圖4所示的五個圖標。

(2)利用LabWindows/CAI自帶的ActiveX服務函數進行接口通信。5.0以上版本的LabWindows/CAI的CVI\\samples\\activex\\matlab中直接提供有LabVIEW/CVI和MATLAB接口,通信的ActiveX服務函數有MATLABsrvr.c,MATLABsrvr.h,MATLABsrvr.obj,MATLABsrvr.fp,MATLABsrvr.sub。但是由于各個用戶所裝的MATLAB版本的不同,在實現混合編程時,并不能直接應用CVI\\samples\\activex\\MATLAB下的ActiveX服務函數,因為不同版本MATLAB軟件的MATLAB Application的注冊碼是不同的,這就需要修改MATLAB的注冊碼。經筆者悉心研究,總結其方法及其步驟如下:

①打開注冊表編輯器,查到用戶安裝的相應版本MATLAB Application的注冊碼,以version 6.5為例,其注冊碼是{554F6053-79D4-11D4-B067-009027BA5F81}。

②由CVI\\samples\\acticex\\matlab打開ActiveX服務函數matlabsrvr.c,將matlabsrvr.c中自帶的MATLAB注冊碼5.01版本:GUID clsid={0x669CEC94,0x6E22,0x11CF,0xA4,0xD6,0x0,0xA0,0x24,0x58,0x3C,0x19}改寫為

GUID clsid={0x554F6053,0x79D4,0x11D4,0xB0,0x67,0x0,0x90,0x27,0xBA,0x5f,0x81};

以上兩種方法得到的ActiveX服務函數的功能是一樣的,即包含了LabWindows/CVI與MATLAB的混合編程所要用到的最基本的功能函數,包括打開MATLAB函數、關閉MATLAB函數、發送矩陣函數、接收矩陣函數、運行MATLAB功能的函數及MATLAB窗口最大/最小化函數等。為了方便開發者實現LabWindows/CVI環境下與MATLAB混合編程,NI公司還專門配置了一個更加友好的接口函數文件matlabutil.c。

在LabWindows/CVI中實現與MATLAB混合編程的具體方法如下:ActiveX服務函數創建完畢后,就可實現混合編程了。啟動LabWindows/CVI,選擇File->New->UserInterface(*.uir)創建儀器面板文件,面板設計完畢后保存該文件,取名為Example.uir;選擇Code->Generate->All Code,編寫源代碼,并以Example.c名保存。經過面板設計和源代碼編寫后就可創建并保存工程文件了。在工程文件窗口中選擇Edit->Add Files to Project,添加Example.c,Example.h,Example.uir,并添加上文提到的ActiveX服務函數;在工程文件、用戶面板編輯或代碼窗口中操作Run->Run Project,就可調試、運行工程文件了。由于篇幅所限,筆者在此就不舉例了。相信只要熟悉LabWindows/CVI的讀者都會根據上述方法很順利地實現在LabWindows/CVI環境下與MATLAB混合編程。

3 結束語

本文系統地介紹了Visual C++,LabVIEW,LabWindows/CVI與MATLAB之間的接口技術,它們的實現極大地縮短了程序開發周期,減輕了編程工作量,提高了工作效率。在工程研究中,這種混合編程的接口技術將會有很大的應用。本文所舉例程在VC++6.0,MATLAB 6.5,LabVIEW 6.1中調試全部通過,驗證了上述接口技術的正確性。

本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。

主站蜘蛛池模板: 国产人成网线在线播放va| 中文字幕啪啪| 日韩一级二级三级| 精品国产自在在线在线观看| 不卡国产视频第一页| 亚洲av无码牛牛影视在线二区| 久99久热只有精品国产15| 欧美高清国产| 亚洲欧美另类久久久精品播放的| 国产精品真实对白精彩久久| 国产麻豆永久视频| 一级一毛片a级毛片| 丁香六月激情婷婷| 国产资源免费观看| 中日韩一区二区三区中文免费视频 | 在线观看国产小视频| 国产91av在线| 国产精品粉嫩| 一级爱做片免费观看久久| Aⅴ无码专区在线观看| 国产激情无码一区二区三区免费| 在线观看视频一区二区| 中文一区二区视频| 99热这里只有成人精品国产| 伊人激情综合| 91无码人妻精品一区| 国产精品女主播| 欧美精品亚洲精品日韩专区| 99久久精品无码专区免费| 2021天堂在线亚洲精品专区| 最新无码专区超级碰碰碰| 四虎影视8848永久精品| 九九视频免费看| 激情六月丁香婷婷四房播| 国产主播一区二区三区| 日韩午夜片| 91破解版在线亚洲| 精品91视频| 无码精品一区二区久久久| 国内黄色精品| 制服丝袜一区| 91在线播放免费不卡无毒| 欧美精品另类| 色噜噜在线观看| 亚洲国产欧美目韩成人综合| 亚洲综合极品香蕉久久网| 最近最新中文字幕在线第一页| 强奷白丝美女在线观看| 日本亚洲成高清一区二区三区| 99在线小视频| 久久无码免费束人妻| 久久国产免费观看| 亚洲成年人片| 国产99视频精品免费观看9e| 免费无码又爽又黄又刺激网站| 一本大道香蕉高清久久| 亚洲香蕉久久| 国产高清免费午夜在线视频| 免费国产一级 片内射老| 免费看a级毛片| 高清精品美女在线播放| 久久综合伊人 六十路| 无遮挡一级毛片呦女视频| 亚洲va视频| 99久久无色码中文字幕| 操美女免费网站| 99爱视频精品免视看| 国产精品妖精视频| 久久人人爽人人爽人人片aV东京热| 伊人久综合| 欧美中文一区| 美女内射视频WWW网站午夜| 欧美国产视频| 国产精品xxx| 999精品在线视频| 国产午夜在线观看视频| 美女免费精品高清毛片在线视| 欧美精品黑人粗大| 国产午夜在线观看视频| 欧美一区二区福利视频| 中日韩一区二区三区中文免费视频| 欧美精品1区|