教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> Vc++下如何利用Matlab工具箱进行数字信号处理

Vc++下如何利用Matlab工具箱进行数字信号处理

上传者:网友
|
翻新时间:2013-12-18

Vc++下如何利用Matlab工具箱进行数字信号处理

Vc++下如何利用Matlab工具箱进行数字信号处理 Vc++下如何利用Matlab工具箱进行数字信号处理 信息技术论文 更新:2006-4-8 阅读: Vc++下如何利用Matlab工具箱进行数字信号处理摘要: 本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。

关键词:Matlab M-文件 引擎 编译器 Matcom Vc++

Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、ToolboxSignal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如Vc下如果能调用Matlab工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。

利用Matlab引擎

Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数: engOpen, engGetArray, engPutArray, engEvaString,

engOutputBuffer ,engClose与客户机进行交互。

下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine.,在对话框 .cpp文件中加入”engine.h” 和“math.h” 头文件,下面给出部分程序清单。

Void CtestmatlabDlg::OnMatlabEngine(){

Engine *ep;

mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL;

{

}

double *pPxx,*pFxx;

if(!(ep=engOpen(" 0"))){//打开Matlab引擎,建立与本地Matlab的连接

fprintf(stderr,"n Can't start MATLAB enginen");

exit(-1);

}

mnfft=mxCreateDoubleMatrix(1,1,mxREAL);

mFs=mxCreateDoubleMatrix(1,1,mxREAL);

mxSetName(T,"T");

mxSetName(mnfft,"mnfft");

mxSetName(mFs,"mFs");

memcpy((char*)mxGetPr(mnfft),(char*)nfft, sizeof(double));

memcpy((char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double));

engPutArray(ep,T); //将转化的参数放入引擎中,此时可在Matlab command窗口下查看此参数

engPutArray(ep,mnfft);

engPutArray(ep,mFs);

engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);"); //利用引擎执行工具箱中文件

engOutputBuffer(ep,buffer,512); //如只想看显示图形,可将返回参数去掉,psd无返回参数缺省情况下会自动画图形

result=engGetArray(ep,"pxx");//取出引擎中的数据放在所指的区域中供后续处理

pPxx=mxGetPr(result);

result=engGetArray(ep,"fo");

pFxx=mxGetPr(result);

engEvalString(ep,"plot(fo,10*log10(pxx));");//利用引擎画图

engEvalString(ep,"title('功率谱分析');");

engEvalString(ep,"xlabel('Hz');");

engEvalString(ep,"ylable('db');");

mxDestroyArray(T); //释放内存

mxDestroyArray(mFs);

mxDestroyArray(mnfft);

mxDestroyArray(result);

engEvalString(ep,"close;");

engClose(ep);

}

上述程序在Vc下编译需要将 libeng.dll和libmx.dll两个动态库利用以下的命令:

lib/def:<自己的Matlab的安装路径,下同>e: Matlabexterninclude*.def /machine:ix86 /out:*.lib来生成程序所需的静态连接库libeng.lib和libmx.lib,将libeng.lib和libmx.lib所在的目录加入Vc++ project/link/object/library modules下即可。

利用Matlab自身的编译器调用工具箱中的函数

Matlab的编译器可将Matlab的M文件转换为为C或C++的源代码以产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,不能调用Matlab工具箱中的函数,这非常不利于搞一些特殊的算法。本人研究了一段时间发现,工具箱中的函数既然是M文件就一定可以用编译器来编译,以提供如Vc的调用函数,但是编译器只能编译一个独立的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.dll, libmat.dll. libmx.dll. mibut.dll 以及Matlab C MATH库,建议采用前述的方法将动态连接改为静态连接。对于C/C++编译环境的设置,在Matlab command窗口下运行mex –setup 然后依提示操作,而对于C/C++连接环境的设置,运行mbuild –setup依提示操作即可。

下面给出利用编译器将Matlab工具箱中psd.m文件生成可供Vc调用的函数。

将psd.m文件拷贝一份至Matlabbin目录下,改写相应调用的M文件如nargchk.m, hanning.m等。为生成的代码简洁,对于采集数据处理输入参数很明了的情况下可作大量的删减,最终使psd.m成为一个不依赖于其他M文件的独立的M文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步:

function [Pxx,f]=psd(Fs,nfft,noverlap,x)

dflag=’none’;

window=window(;)

………………………………….

以上只要稍懂Matlab语言和信号处理知识就可完成这项工作。

假设上述代码重新存为testwin.m,在Matlab command 窗口下设置好环境参数运行mcc –e testwin,则可在Matlabbin下生成testwin.c ,如运行mcc –p testwin 则生成testwin.cpp. Vc下建立一个基于对话框的文件,然后在对话框里加一个Button控件OnButtonPsd

将上述生成的.c文件的头文件加入到工程的.cpp中,且将#ifdef_cplusplus

extern “c”{

#end if

c代码声明加入Vc的包含文件和生成的.C的包含文件之间

将#ifdef_cplusplus

}

#end if加入.cpp文件未尾

为了简洁且便于处理将生成的c函数稍改动,给出部分代码如下:

void CTestpsdwinDlg::OnButtonPsd(){

mxArray* x_rhs_;//指向采集数据存放区

noverlap=512;

……………….

……………….

mccCopy(&Pxx,&Spec);

mccCopy(&f,&frevgg_vector);

for(int j=0;j<(int)(nfft/2+1);j++)

{

datap[j]=mccGetRealVectorElement(&Pxx, (j+1));//功率谱密度存于datap[]数组

dataf[j]=mccGetRealVectorElement(&f, (j+1));//相应频率存于数组dataf[]中

}

mccFreeMatrix(&Pxx);

……………….

SendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图

Return;

}

如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用 Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇幅在此不述。

3)利用Matcom调用工具箱中的函数

Matcom编译M文件,先将M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的c编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定c编译器的路径,否则无法编译,指定好的编译信息就写在Matcombinmatcom.ini文件中,不过这一步按装matcom时,它自动寻找编译器并将其写入matcom.ini文件中,matcom4.5版中使用TeeChart3.0 OCX控件,因而它支持图形操作。

我们依然用上述的testwin.m文件,不要将图形函数注释掉,利用Mideva来生成可被Vc调用的信号处理程序。

运行Mideva在主界面上直打开M文件,在菜单中选择compile to dll,输入testwin..在Matcom debug目录下可以找到这样的几个文件,testwin.c ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp等。 将上述testwin.cpp和testwin.h加入工程中,project/add to project/files并且在相应的文件中加入”stdafx.h” 加连接库:Toolsoptiondirectory , 选include选项,加入e:matcom45lib (包含matcom.h)

library选项,加入e:matcom45lib

4) projectadd to projectfiles 文件类型选项选(.lib)将e:matcom45libv4501.lib加入工程中编译运行。相应代码如下:

void CtestmatcomDlg::OnpsdButton(){

initM(MATCOM_VERSION);//初始化matcom库

Mm Fs,nfft,noverlap;//创建矩阵

dMm(Pxx_o);dMm(f_o);//创建并命名矩阵

datax[];//数据采集的数据存于此数组中

{

x.r(1,i)=datax[i+1];//给x阵赋值

}

testwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);//matcom生成的函数

for(i=0;i<513;i++){//取出功率谱密度分析结果

dataf[i]=f_o.r(i+1,1);

datap[i]=Pxx_o.r(i+1,1);}

exitM();

return;

}

可见利用Matcom进行M文件转换非常的容易,生成的代码可读性很好,以上的转换同时生成了可供Vc调用的动态连接库,其使用和一般的动态库一样使用。同时需指明Matcom不仅可转换独立的不依赖于其它M文件的M文件,同时可转换调用其它M文件的M文件嵌套。条件是这此M文件在同一个目录下面,如前所述的psd.m可直接用上述方法转换,生成了多个重载形式的psd函数

结论: 利用Mtlab引擎调用工具箱中的函数可节省大量的系统资源,应用程序整体性能较好,但不可脱离Matlab 的环境运行。用Matlab编译器进行工具箱函数的调用,须转换相应的M文件使其成为独立的M文件,且不支持图形函数,转换的代码可读性不太好。用Matcom 进行转换非常方便,生成的代码可读性很好,支持图形函数,且代码执行的速度比不转换平均要快1.5倍以上。以上程序在Vc++ 6.0,Matlab5.2,Matcom4.5中调试通过,以上方法在工程实践中已得到很好的运用。

下载文档

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

网友最新关注

数学测验
qq问问
我的爷爷
今天我来改作业
枇杷树
森林里的故事
龙眼
读《列宁小时侯的故事》有感
太阳和月亮
假如我会克隆
假如我是“孙悟空”
未来的桥
告诉我走路的人
牵牛花
我国电子商务第三方支付的风险分析及控制
关于加强成教毕业生就业指导工作的思考
浅论高职院校就业指导工作的研究与实践
北京研发服务业sWOT分析与发展对策研究
关于中美大学生就业指导工作的比较研究
农村公共产品供给对农民收入的影响分析(1)
论金融服务在区域经济中的发展前景(1)
走出比较优势困境实现对外贸易增长方式转变(1)
关于毕业生就业指导工作的探索与实践
论高校毕业生的就业及就业指导人员的素质
针对绿色贸易壁垒我国的对策与思考(1)
论创业教育在就业教育中的地位及大学生创业素质的培养
为行偏生撑起一片蓝天
资源约束成为制造业发展模式提升的改革思路(1)
与时俱进,浅谈从根本上抓好高校学生就业指导工作
《司马光》教学设计七
《司马光》教学札记
《司马光》教学设计一
《乌鸦喝水》教材特点及教学建议
《乌鸦喝水》的字词教学:随课文识字
《乌鸦喝水》片断赏析一
《司马光》教学设计九
《乌鸦喝水》课后研究活动
《乌鸦喝水》片断赏析二
《称象》片断赏析一
《司马光》教学片段设计
《司马光》杂谈
《司马光》教学设计二(第一课时)
《称象》片断赏析二
《乌鸦喝水》教学设计二十