《如何在vc++中调用matlab信号处理工具箱》由会员分享,可在线阅读,更多相关《如何在vc++中调用matlab信号处理工具箱(7页珍藏版)》请在金锄头文库上搜索。
1、本文详述了在 Vc 环境下如何利用 Matlab 工具箱进行数字信号处理,全文以 Matlab 工具箱中功率谱密度分析函数为例,介绍了通过 Matlab 自带的引擎、Matlab 自身的编译器以及利用MathTools 公司的 Matcom 进行对工具箱函数的调用。关键词关键词:Matlab M-文件 引擎 编译器 Matcom Vc+Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与 系统,信号处理工具箱位于目录、ToolboxSignal 下,利用工具箱中的文件可以 实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如 Vc 下如果 能调用 Matlab 工具
2、箱中的文件,会大大地加快一些算法的实现,同时其可靠性 也很高。1.利用利用 Matlab 引擎引擎 Matlab 引擎采用客户和服务器计算方式,在运用中,Vc 的 C 语言或 C+语言的 程序作为前端客户机,它向 Matlab 引擎传递命令和数据信息,并从 Matlab 引 擎接收数据信息,它提供了下列几个函数: engOpen, engGetArray, engPutArray, engEvaString, engOutputBuffer ,engClose 与客户机进行交互。下面例程是在 Vc 下建一个基于对话框的应用程序,在对话框中设置一个 Button 控件 OnMatlabEngin
3、e.,在对话框 .cpp 文件中加入”engine.h” 和 “math.h” 头文件,下面给出部分程序清单。Void CtestmatlabDlg:OnMatlabEngine()Engine *ep;mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL;double datax1024;char buffer1024;for(int j=0;je: Matlabexterninclude*.def /machine:ix86 /out:*.lib 来生成程序所需的静态连接库 libeng.lib 和 libmx.lib,将 libeng.l
4、ib 和 libmx.lib 所在的目录加入 Vc+ project/link/object/library modules 下 即可。2.利用利用 Matlab 自身的编译器调用工具箱中的函数自身的编译器调用工具箱中的函数 Matlab 的编译器可将 Matlab 的 M 文件转换为为 C 或 C+的源代码以产生完全 脱离 Matlab 运行环境的独立的运用程序,但 Matlab 本身的资料说明编译器如 用来建立独立的运用程序,不能调用 Matlab 工具箱中的函数,这非常不利于搞 一些特殊的算法。本人研究了一段时间发现,工具箱中的函数既然是 M 文件就 一定可以用编译器来编译,以提供如 V
5、c 的调用函数,但是编译器只能编译一 个独立的 M 文件,即这个 M 文件不依赖于其他的 M 文件。如果 M 文件中又调用了其他的 M 文件,可将被调用的 M 文件拷贝到调用 M 文件的相应位置, 作适当的改动就可以用于编译器编译。编译器不支持图形函数,所以 M 文件中 如有图形函数需注释掉。当 Matlab 的编译器 mcc 加入适当的参数-e(mcc e *.*)或-p(mcc p *.*)就 可生成将输入的 M 文件转换为适用于特定运用的 C 或 C+源代码。这样如果要 在 Vc 下编译通过,还需连入以下几个库 libmmfile.dll, libmatlb.dll, libmcc.dl
6、l, libmat.dll. libmx.dll. mibut.dll 以及 Matlab C MATH 库,建 议采用前述的方法将动态连接改为静态连接。对于 C/C+编译环境的设置,在 Matlab command 窗口下运行 mex setup 然后依提示操作,而对于 C/C+连接 环境的设置,运行 mbuild setup 依提示操作即可。下面给出利用编译器将 Matlab 工具箱中 psd.m 文件生成可供 Vc 调用的函数。1.将 psd.m 文件拷贝一份至 Matlabbin 目录下,改写相应调用的 M 文件如 nargchk.m, hanning.m 等。为生成的代码简洁,对于采
7、集数据处理输入参数很明了的情况下可作大量的删减,最终使 psd.m 成为一个不依赖于其他 M 文件的独立的 M 文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步: function Pxx,f=psd(Fs,nfft,noverlap,x)window=o,5*(1-cos(2*pi*(1:nfft)/(nffft+1);/hanning 窗dflag=none;window=window(;).以上只要稍懂 Matlab 语言和信号处理知识就可完成这项工作。1.假设上述代码重新存为 testwin.m,在 Matlab command 窗口下设置好环境参数运行mcc e
8、 testwin,则可在 Matlabbin 下生成 testwin.c ,如运行 mcc p testwin 则生成 testwin.cpp. 2.Vc 下建立一个基于对话框的文件,然后在对话框里加一个 Button 控件OnButtonPsd 将上述生成的.c 文件的头文件加入到工程的.cpp 中,且将#ifdef_cplusplus extern “c”#end ifc 代码声明加入 Vc 的包含文件和生成的.C 的包含文件之间将#ifdef_cplusplus#end if 加入.cpp 文件未尾3.为了简洁且便于处理将生成的 c 函数稍改动,给出部分代码如下: 1.void CTes
9、tpsdwinDlg:OnButtonPsd()mxArray* x_rhs_;/指向采集数据存放区Fs=23510;/数据采集的频率 nfft=1024;/1024 点的 fftdouble datax1024/采集的数据x_rhs_mxCreateDoubleMatrix(1,1024,mxReal);memcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double);noverlap=512;.mccCopy(mccCopy(for(int j=0;j(int)(nfft/2+1);j+)datapj=mccGetRealVectorElement(/功率谱
10、密度存于 datap数组datafj=mccGetRealVectorElement(/相应频率存于数组 dataf中mccFreeMatrix(.SendMessageBox(WM_PAINT,0,0);/利用 Vc 下的图形函数画图Return;如上生成的程序可读性不太好,而生成的 c+代码则可读性较好,但千万注意 只能用 Matlab 的 MATH 库,不可用 c+的 MATH 库,否则编译会出错,限于篇幅 在此不述。3)利用利用 Matcom 调用工具箱中的函数调用工具箱中的函数Matcom 编译 M 文件,先将 M 文件按照与 Matcom 的 cpp 库的对应关系翻译为 cpp 源
11、代码,然后用对应版本的 c 编译器将 cpp 文件编译成相应的 exe 或 dll 文件, 所以第一次运行要指定 c 编译器的路径,否则无法编译,指定好的编译信息就 写在 Matcombinmatcom.ini 文件中,不过这一步按装 matcom 时,它自动寻找 编译器并将其写入 matcom.ini 文件中,matcom4.5 版中使用 TeeChart3.0 OCX 控件,因而它支持图形操作。我们依然用上述的 testwin.m 文件,不要将图形函数注释掉,利用 Mideva 来生 成可被 Vc 调用的信号处理程序。1.运行 Mideva 在主界面上直打开 M 文件,在菜单中选择 com
12、pile to dll,输入 testwin.在 Matcom debug 目录下可以找到这样的几个文件,testwin.c ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp 等。 2.将上述 testwin.cpp 和 testwin.h 加入工程中,project/add to project/files 并且在相应的文件中加入”stdafx.h” 3.加连接库:Toolsoptiondirectory , 选 include 选项,加入 e:matcom45lib (包含matcom.h) library 选项,加入 e
13、:matcom45lib4) projectadd to projectfiles 文件类型选项选(.lib)将 e:matcom45libv4501.lib 加入工程中编译运行。相应代码如下:void CtestmatcomDlg:OnpsdButton()double datap512,dataf512;initM(MATCOM_VERSION);/初始化 matcom 库Mm Fs,nfft,noverlap;/创建矩阵Mm x=zeros(1,1024);Fs=1024;nfft=1024;noverlap=128;dMm(Pxx_o);dMm(f_o);/创建并命名矩阵datax;/
14、数据采集的数据存于此数组中for(int i=1;i=1024;i+)x.r(1,i)=dataxi+1;/给 x 阵赋值testwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);/matcom 生成的函数for(i=0;i513;i+)/取出功率谱密度分析结果datafi=f_o.r(i+1,1);datapi=Pxx_o.r(i+1,1);exitM();return;可见利用 Matcom 进行 M 文件转换非常的容易,生成的代码可读性很好,以上的 转换同时生成了可供 Vc 调用的动态连接库,其使用和一般的动态库一样使用。 同时需指明 Matcom 不仅可转换独立的
15、不依赖于其它 M 文件的 M 文件,同时可转 换调用其它 M 文件的 M 文件嵌套。条件是这此 M 文件在同一个目录下面,如前 所述的 psd.m 可直接用上述方法转换,生成了多个重载形式的 psd 函数结论: 利用 Mtlab 引擎调用工具箱中的函数可节省大量的系统资源,应用程序 整体性能较好,但不可脱离 Matlab 的环境运行。用 Matlab 编译器进行工具箱 函数的调用,须转换相应的文件使其成为独立的文件,且不支持图形函数, 转换的代码可读性不太好。用 Matcom 进行转换非常方便,生成的代码可读性 很好,支持图形函数,且代码执行的速度比不转换平均要快.5 倍以上。以上 程序在 Vc+ 6.0,Matlab5.2,Matcom4.5 中调试通过,以上方法在工程实践中已 得到很好的运用。