?? matlab.html
字號:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>Vc++下如何利用Matlab工具箱進(jìn)行數(shù)字信號處理</title><meta name="Microsoft Theme" content="none, default"></head><body leftmargin="90"><div align="left"><table border="0" cellpadding="0" cellspacing="0" width="93%"> <tr> <td width="191%"><b><font SIZE="4"><p ALIGN="CENTER"></font><font face="楷體_GB2312" size="4" color="#0000FF">Vc++下如何利用Matlab工具箱進(jìn)行數(shù)字信號處理</font><font FACE="宋體" SIZE="4"></font></b></td> </tr> <tr> <td width="191%"><font FACE="宋體" SIZE="1"><p ALIGN="CENTER"></font><br> 潘 衛(wèi) 明 趙 敏 張 進(jìn) 芳(南京航空航天大學(xué) 測試工程系 210016)</td> </tr> <tr> <td width="191%"><div align="left"><table border="0" cellpadding="0" cellspacing="0" width="99%"> <tr> <td width="9%"></td> <td width="91%"></td> </tr> <tr> <td width="9%"><font FACE="宋體" SIZE="3"><b>摘要</b></font>:</td> <td width="91%">本文詳述了在Vc環(huán)境下如何利用Matlab工具箱進(jìn)行數(shù)字信號處理,全文以Matlab工具箱中功率譜密度分析函數(shù)為例,介紹了通過Matlab自帶的引擎、Matlab自身的編譯器以及利用MathTools公司的Matcom進(jìn)行對工具箱函數(shù)的調(diào)用。</td> </tr> </table> </div></td> </tr> <tr> <td width="191%"></td> </tr> <tr> <td width="191%"><font FACE="宋體" SIZE="3"><b>關(guān)鍵詞</b></font>:Matlab M-文件 引擎 編譯器 Matcom Vc++</td> </tr> <tr> <td width="191%"> <font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY"></font> <font SIZE="3"></p> <p ALIGN="JUSTIFY">Matlab</font><font FACE="宋體" SIZE="3">的信號處理工具箱是信號算法文件的集合,它處理的基本對象是信號與系統(tǒng),信號處理工具箱位于目錄、</font><font SIZE="3">Toolbox\Signal</font><font FACE="宋體" SIZE="3">下,利用工具箱中的文件可以實(shí)現(xiàn)信號的變換、濾波、譜估計(jì)、濾波器設(shè)計(jì)等。在其它的環(huán)境如</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">下如果能調(diào)用</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">工具箱中的文件,會大大地加快一些算法的實(shí)現(xiàn),同時(shí)其可靠性也很高。</p> <ol> </font><b><font FACE="宋體"> <li>利用</font>Matlab<font FACE="宋體">引擎</li> </font></b><font SIZE="3"><p ALIGN="JUSTIFY">Matlab</font><font FACE="宋體" SIZE="3">引擎采用客戶和服務(wù)器計(jì)算方式,在運(yùn)用中,</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">的</font><font SIZE="3">C</font><font FACE="宋體" SIZE="3">語言或</font><font SIZE="3">C++</font><font FACE="宋體" SIZE="3">語言的程序作為前端客戶機(jī),它向</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">引擎?zhèn)鬟f命令和數(shù)據(jù)信息,并從</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">引擎接收數(shù)據(jù)信息,它提供了下列幾個(gè)函數(shù):</font><font SIZE="3"> engOpen, engGetArray, engPutArray, engEvaString, </p> <p ALIGN="JUSTIFY">engOutputBuffer ,engClose</font><font FACE="宋體" SIZE="3">與客戶機(jī)進(jìn)行交互。</p> <p ALIGN="JUSTIFY">下面例程是在</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">下建一個(gè)基于對話框的應(yīng)用程序,在對話框中設(shè)置一個(gè)</font><font SIZE="3">Button</font><font FACE="宋體" SIZE="3">控件</font><font SIZE="3">OnMatlabEngine.,</font><font FACE="宋體" SIZE="3">在對話框</font><font SIZE="3"> .cpp</font><font FACE="宋體" SIZE="3">文件中加入</font><font SIZE="3">”engine.h” </font><font FACE="宋體" SIZE="3">和“</font><font SIZE="3">math.h” </font><font FACE="宋體" SIZE="3">頭文件,下面給出部分程序清單。</p> </font><font SIZE="1"><p ALIGN="JUSTIFY">Void CtestmatlabDlg::OnMatlabEngine(){</p> <p ALIGN="JUSTIFY">Engine *ep;</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL;</p> <p ALIGN="JUSTIFY">double datax[1024];</p> <p ALIGN="JUSTIFY">char buffer[1024];</p> <p ALIGN="JUSTIFY">for(int j=0;j<1024;j++)//</font><font FACE="宋體" SIZE="1">注:如通過采集卡采集數(shù)據(jù)可將采集的數(shù)據(jù)放在</font><font SIZE="1">datax[]</font><font FACE="宋體" SIZE="1">數(shù)組中</font><font SIZE="1">,</font><font FACE="宋體" SIZE="1">此循環(huán)就不需要</p> <p ALIGN="JUSTIFY">{</p> </font><font SIZE="1"><p ALIGN="JUSTIFY">double samt=(double)(1.0/1024); </p> <p ALIGN="JUSTIFY">datax[j]=sin(2.0*63.0*samt*3.1415926+1.15*3.1415926);</p> <p ALIGN="JUSTIFY">}</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">double *pPxx,*pFxx;</p> <p ALIGN="JUSTIFY">if(!(ep=engOpen(" \0"))){//</font><font FACE="宋體" SIZE="1">打開</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="1">引擎,建立與本地</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="1">的連接</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">fprintf(stderr,"\n Can't start MATLAB engine\n");</p> <p ALIGN="JUSTIFY">exit(-1);</p> <p ALIGN="JUSTIFY">} </p> <p ALIGN="JUSTIFY">double Fs[1]={1024};//</font><font FACE="宋體" SIZE="1">因?yàn)?lt;/font><font SIZE="1">Matlab</font><font FACE="宋體" SIZE="1">所有參與運(yùn)算的參數(shù)都是矩陣的形式,因而下列幾行將參數(shù)轉(zhuǎn)變</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">double nfft[1]={1024};//</font><font FACE="宋體" SIZE="1">成</font><font SIZE="1">Matlab</font><font FACE="宋體" SIZE="1">可接受的矩陣形式。</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">T=mxCreateDoubleMatrix(1,1024,mxREAL);</p> <p ALIGN="JUSTIFY">mnfft=mxCreateDoubleMatrix(1,1,mxREAL);</p> <p ALIGN="JUSTIFY">mFs=mxCreateDoubleMatrix(1,1,mxREAL);</p> <p ALIGN="JUSTIFY">mxSetName(T,"T");</p> <p ALIGN="JUSTIFY">mxSetName(mnfft,"mnfft");</p> <p ALIGN="JUSTIFY">mxSetName(mFs,"mFs");</p> <p ALIGN="JUSTIFY">memcpy((char*)mxGetPr(T),(char*)datax, 1024*sizeof(double));</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">memcpy((char*)mxGetPr(mnfft),(char*)nfft, sizeof(double));</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">memcpy((char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double));</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">engPutArray(ep,T); //</font><font FACE="宋體" SIZE="1">將轉(zhuǎn)化的參數(shù)放入引擎中,此時(shí)可在</font><font SIZE="1">Matlab command</font><font FACE="宋體" SIZE="1">窗口下查看此參數(shù)</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">engPutArray(ep,mnfft); </p> <p ALIGN="JUSTIFY">engPutArray(ep,mFs);</p> <p ALIGN="JUSTIFY">engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);"); //</font><font FACE="宋體" SIZE="1">利用引擎執(zhí)行工具箱中文件</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">engOutputBuffer(ep,buffer,512); //</font><font FACE="宋體" SIZE="1">如只想看顯示圖形,可將返回參數(shù)去掉,</font><font SIZE="1">psd</font><font FACE="宋體" SIZE="1">無返回參數(shù)缺省情況下會自動畫圖形</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">result=engGetArray(ep,"pxx");//</font><font FACE="宋體" SIZE="1">取出引擎中的數(shù)據(jù)放在所指的區(qū)域中供后續(xù)處理</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">pPxx=mxGetPr(result); </p> <p ALIGN="JUSTIFY">result=engGetArray(ep,"fo");</p> <p ALIGN="JUSTIFY">pFxx=mxGetPr(result);</p> <p ALIGN="JUSTIFY">engEvalString(ep,"plot(fo,10*log10(pxx));");//</font><font FACE="宋體" SIZE="1">利用引擎畫圖</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">engEvalString(ep,"title('</font><font FACE="宋體" SIZE="1">功率譜分析</font><font SIZE="1">');");</p> <p ALIGN="JUSTIFY">engEvalString(ep,"xlabel('Hz');");</p> <p ALIGN="JUSTIFY">engEvalString(ep,"ylable('db');");</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">mxDestroyArray(T); //</font><font FACE="宋體" SIZE="1">釋放內(nèi)存</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">mxDestroyArray(mFs);</p> <p ALIGN="JUSTIFY">mxDestroyArray(mnfft);</p> <p ALIGN="JUSTIFY">mxDestroyArray(result);</p> <p ALIGN="JUSTIFY">engEvalString(ep,"close;");</p> </font><font FACE="宋體" SIZE="1"><p ALIGN="JUSTIFY"></font><font SIZE="1">engClose(ep);</p> <p ALIGN="JUSTIFY">}</p> </font><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">上述程序在</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">下編譯需要將</font><font SIZE="3"> libeng.dll</font><font FACE="宋體" SIZE="3">和</font><font SIZE="3">libmx.dll</font><font FACE="宋體" SIZE="3">兩個(gè)動態(tài)庫利用以下的命令:</p> </font><font SIZE="3"><p ALIGN="JUSTIFY">lib/def:<</font><font FACE="宋體" SIZE="3">自己的</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">的安裝路徑</font><font SIZE="3">,</font><font FACE="宋體" SIZE="3">下同</font><font SIZE="3">>e:\ Matlab\extern\include\*.def /machine:ix86 /out:*.lib</font><font FACE="宋體" SIZE="3">來生成程序所需的靜態(tài)連接庫</font><font SIZE="3">libeng.lib</font><font FACE="宋體" SIZE="3">和</font><font SIZE="3">libmx.lib,</font><font FACE="宋體" SIZE="3">將</font><font SIZE="3">libeng.lib</font><font FACE="宋體" SIZE="3">和</font><font SIZE="3">libmx.lib</font><font FACE="宋體" SIZE="3">所在的目錄加入</font><font SIZE="3">Vc++ project/link/object/library modules</font><font FACE="宋體" SIZE="3">下即可。</p> </font><b><font FACE="宋體"> <li>利用</font>Matlab<font FACE="宋體">自身的編譯器調(diào)用工具箱中的函數(shù)</font></b></li> </ol> <p> <font SIZE="3"></p> <p ALIGN="JUSTIFY">Matlab</font><font FACE="宋體" SIZE="3">的編譯器可將</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件轉(zhuǎn)換為為</font><font SIZE="3">C</font><font FACE="宋體" SIZE="3">或</font><font SIZE="3">C++</font><font FACE="宋體" SIZE="3">的源代碼以產(chǎn)生完全脫離</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">運(yùn)行環(huán)境的獨(dú)立的運(yùn)用程序,但</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">本身的資料說明編譯器如用來建立獨(dú)立的運(yùn)用程序,不能調(diào)用</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">工具箱中的函數(shù),這非常不利于搞一些特殊的算法。本人研究了一段時(shí)間發(fā)現(xiàn),工具箱中的函數(shù)既然是</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件就一定可以用編譯器來編譯,以提供如</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">的調(diào)用函數(shù),但是編譯器只能編譯一個(gè)獨(dú)立的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件,即這個(gè) </font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件不依賴于其他的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件。如果</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件中又調(diào)用了其他的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件,可將被調(diào)用的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件拷貝到調(diào)用</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件的相應(yīng)位置,作適當(dāng)?shù)母膭泳涂梢杂糜诰幾g器編譯。編譯器不支持圖形函數(shù),所以</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件中如有圖形函數(shù)需注釋掉。</p> <p ALIGN="JUSTIFY">當(dāng)</font><font SIZE="3">Matlab</font><font FACE="宋體" SIZE="3">的編譯器</font><font SIZE="3">mcc</font><font FACE="宋體" SIZE="3">加入適當(dāng)?shù)膮?shù)</font><font SIZE="3">-e(mcc –e *.*)</font><font FACE="宋體" SIZE="3">或</font><font SIZE="3">-p(mcc –p *.*)</font><font FACE="宋體" SIZE="3">就可生成將輸入的</font><font SIZE="3">M</font><font FACE="宋體" SIZE="3">文件轉(zhuǎn)換為適用于特定運(yùn)用的</font><font SIZE="3">C</font><font FACE="宋體" SIZE="3">或</font><font SIZE="3">C++</font><font FACE="宋體" SIZE="3">源代碼。這樣如果要在</font><font SIZE="3">Vc</font><font FACE="宋體" SIZE="3">下編譯通過</font><font SIZE="3">,</font><font FACE="宋體" SIZE="3">還需連入以下幾個(gè)庫</font><font SIZE="3">libmmfile.dll, libmatlb.dll, libmcc.dll, libmat.dll. libmx.dll. mibut.dll </font><font FACE="宋體" SIZE="3">以及</font><font SIZE="3">Matlab C MATH</font><font FACE="宋體" SIZE="3">庫,建議采用前述的方法將動態(tài)連接改為靜態(tài)連接。對于</font><font SIZE="3">C/C++</font><font FACE="宋體" SIZE="3">編譯環(huán)境的設(shè)置,在</font><font SIZE="3">Matlab command</font><font FACE="宋體" SIZE="3">窗口下運(yùn)行</font><font SIZE="3">mex –setup </font><font FACE="宋體" SIZE="3">然后依提示操作,而對于</font><font
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -