📄 matlab.html
字号:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>Vc++下如何利用Matlab工具箱进行数字信号处理</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工具箱进行数字信号处理</font><font FACE="宋体" SIZE="4"></font></b></td> </tr> <tr> <td width="191%"><font FACE="宋体" SIZE="1"><p ALIGN="CENTER"></font><br> 潘 卫 明 赵 敏 张 进 芳(南京航空航天大学 测试工程系 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环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。</td> </tr> </table> </div></td> </tr> <tr> <td width="191%"></td> </tr> <tr> <td width="191%"><font FACE="宋体" SIZE="3"><b>关键词</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">的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、</font><font SIZE="3">Toolbox\Signal</font><font FACE="宋体" SIZE="3">下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如</font><font SIZE="3">Vc</font><font FACE="宋体" SIZE="3">下如果能调用</font><font SIZE="3">Matlab</font><font FACE="宋体" SIZE="3">工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。</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">引擎采用客户和服务器计算方式,在运用中,</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">语言的程序作为前端客户机,它向</font><font SIZE="3">Matlab</font><font FACE="宋体" SIZE="3">引擎传递命令和数据信息,并从</font><font SIZE="3">Matlab</font><font FACE="宋体" SIZE="3">引擎接收数据信息,它提供了下列几个函数:</font><font SIZE="3"> engOpen, engGetArray, engPutArray, engEvaString, </p> <p ALIGN="JUSTIFY">engOutputBuffer ,engClose</font><font FACE="宋体" SIZE="3">与客户机进行交互。</p> <p ALIGN="JUSTIFY">下面例程是在</font><font SIZE="3">Vc</font><font FACE="宋体" SIZE="3">下建一个基于对话框的应用程序,在对话框中设置一个</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">注:如通过采集卡采集数据可将采集的数据放在</font><font SIZE="1">datax[]</font><font FACE="宋体" SIZE="1">数组中</font><font SIZE="1">,</font><font FACE="宋体" SIZE="1">此循环就不需要</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">因为</font><font SIZE="1">Matlab</font><font FACE="宋体" SIZE="1">所有参与运算的参数都是矩阵的形式,因而下列几行将参数转变</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">将转化的参数放入引擎中,此时可在</font><font SIZE="1">Matlab command</font><font FACE="宋体" SIZE="1">窗口下查看此参数</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">利用引擎执行工具箱中文件</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">engOutputBuffer(ep,buffer,512); //</font><font FACE="宋体" SIZE="1">如只想看显示图形,可将返回参数去掉,</font><font SIZE="1">psd</font><font FACE="宋体" SIZE="1">无返回参数缺省情况下会自动画图形</p> <p ALIGN="JUSTIFY"></font><font SIZE="1">result=engGetArray(ep,"pxx");//</font><font FACE="宋体" SIZE="1">取出引擎中的数据放在所指的区域中供后续处理</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">释放内存</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">两个动态库利用以下的命令:</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">来生成程序所需的静态连接库</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="宋体">自身的编译器调用工具箱中的函数</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">文件转换为为</font><font SIZE="3">C</font><font FACE="宋体" SIZE="3">或</font><font SIZE="3">C++</font><font FACE="宋体" SIZE="3">的源代码以产生完全脱离</font><font SIZE="3">Matlab</font><font FACE="宋体" SIZE="3">运行环境的独立的运用程序,但</font><font SIZE="3">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">文件就一定可以用编译器来编译,以提供如</font><font SIZE="3">Vc</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">文件不依赖于其他的</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">文件,可将被调用的</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">文件中如有图形函数需注释掉。</p> <p ALIGN="JUSTIFY">当</font><font SIZE="3">Matlab</font><font FACE="宋体" SIZE="3">的编译器</font><font SIZE="3">mcc</font><font FACE="宋体" SIZE="3">加入适当的参数</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">文件转换为适用于特定运用的</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">还需连入以下几个库</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">库,建议采用前述的方法将动态连接改为静态连接。对于</font><font SIZE="3">C/C++</font><font FACE="宋体" SIZE="3">编译环境的设置,在</font><font SIZE="3">Matlab command</font><font FACE="宋体" SIZE="3">窗口下运行</font><font SIZE="3">mex –setup </font><font FACE="宋体" SIZE="3">然后依提示操作,而对于</font><font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -