Matlab和C混合编程的几种方法比较(3)
但是VC的编译器不能编译Matlab的内建函数的硬伤使得对很多算法的编译不能得心应手,比如该编译器对FFT就无能为力。
滤波器设计是信号处理、自动控制等领域不可回避的问题,用VC等工具实现滤波器的设计相当繁琐,Matlab在这些方面又得天独厚的优势,所以可以考虑在VC中调用Matlab的滤波器设计工具箱,在VC中直接实现滤波器的设计。 2.2.2 原理
Add-in的原理是将M文件转化为C++文件,经过适当的Matlab的Math C函数连接整合,在VC中调用。 2.2.3 实现过程
VC中Add-in的设置步骤:
(1)在Matlab命令行中键入mex –setup(注意“mex”与“-”之间有空格)和mbuild -setup命令,按照给出的提示选择MSVC6.0作为编译器。配置好后,Matlab将提示Add-in组件已成功安装到VC。此时别忘了在Matlab命令行中继续键入cd(prefdir)和mccsavepath命令,将Matlab的路径写入VC中的某些文件。
(2)在VC菜单中选择Tools->Customize->Add-ins and Macro Files一栏,勾选MATLAB Add-in,然后关闭,此时下图所示的Matlab add-in的工具条Toolbar1就会出现。
(3) 接下来是在VC的include设置搜索路径。在Tools->Options->Directories的include搜索路径中添加
前期准备到这里就完成了,配置一次,终身管用。下面用Add-in方法,调用Matlab的滤波器设计工具箱,做一个简单的低通滤波器设计。具体步骤如下:
首先建立一个基于对话框的exe工程取名test2,修改对话框的界面如图:
N为滤波器的阶数,WN是归一化带宽,产生的滤波器系数在Filter coefficients编辑框内显示出来。
第二步是点击Toolbar1内的.m++,选择添加myfilter.m文件,源代码如下: function [b, a] = myfilter(n,wn) [b, a] = butter(n, wn);
此时出现下图所示的对话框,选择默认,按OK后,自动生成一大堆的m文件和C源和.h文件,有用的是myfilter.c和myfilter.h。前者是myfilter.m转化而来的C文件,不过太繁琐,只要看后者就可以知道他的功能和调用方法了。
myfilter.h文件里有这几行语句:
extern void InitializeModule_myfilter(void); extern void TerminateModule_myfilter(void);
extern _mexLocalFunctionTable _local_function_table_myfilter;
extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn); extern void mlxMyfilter(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);
其中extern void InitializeModule_myfilter(void);和extern void TerminateModule_myfilter(void);明显是初始化语句,extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn);为调用形式,具体实现在myfilter.h文件中,能把人看晕。
第三步为Test按钮的响应函数void CTest2Dlg::OnButtonTest()添加代码: double nOrder; // ??2¨?÷?×êy double nWn; // ??2¨?÷???1?μ?ê(0~1) double *pNum = NULL; // ó?à′·μ????2¨?÷?μêy
mxArray *mxArray_nOrder; // mxArray ààDíμ???2¨?÷?×êy mxArray *mxArray_nWn; // mxArray ààDíμ???2¨?÷???1?μ?ê mxArray *mxArray_num; // mxArray ààDíμ???2¨?÷?μêy
UpdateData(true);
nOrder = double(m_EditN); nWn = m_EditWN;
mxArray_nOrder = mxCreateDoubleScalar(nOrder); // mxArray_nOrder3?ê??ˉ mxArray_nWn = mxCreateDoubleScalar(nWn); // mxArray_nWn3?ê??ˉ
InitializeModule_myfilter(); // μ÷ó?3?ê??ˉ
mxArray_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn); // oˉêyμ÷ó?
pNum = mxGetPr(mxArray_num); // double ààDíμ???2¨?÷?μêy
TerminateModule_myfilter(); // μ÷ó?mlfMyfilteríê±? mxDestroyArray(mxArray_nOrder); mxDestroyArray(mxArray_nWn); mxDestroyArray(mxArray_num);
mxCreateDoubleScalar、mxGetPr、mxDestroyArray等函数功能可以在Matlab的帮助了找到。代码层次分明:mxArray_nWn = mxCreateDoubleScalar(nWn); 之前的语句用来实现参数的输入;mxArray_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn)完成滤波器的设计;pNum = mxGetPr(mxArray_num);接收滤波器的系数,最终的滤波器系数保存在指针pNum中,能在VC中使用。至于在实际应用中具体怎么操作,已不在讨论范围之内了。 2.2.4 总结
1. 可以边修改m文件边调试;
2. 点击Toolbar1上的包裹状按钮还可以实现程序的打包,将用到的一些库文件发布成一个压缩文件,在没有安装Matlab的机子上,解压缩,程序照样可以运行,这一点很有诱惑力;
3. 不能编译Matlab的内建函数,图形句柄不能用(不知道是我没调通还是真的不能用)。 总体来讲,这种方法还是值得推荐的。
2.3 Matcom 实例
2.3.1 引言
Matcom的特点:Matcom是一个非常有用的m文件编译器 (compiler),它有如下几大优点:
1.它提供了Matlab语言中m文件和其他语言的接口,使m文件可以编译为脱离Matlab环境独立执行的可执行程序,这样不仅提高了代码的复用率,执行速度快,而且使纯文本的。m文件转化为二进制的可执行文件,增加了知识保护的安全性。
2.它提供了近千个数学函数。对于其他高级语言编辑器来说,提供了一个丰富的数学库,基本上在Matlab上能用的常用函数都可以在高级语言中调用,数学函数主要包括矩阵属性生成函数、数学函数、绘图函数等。
3.它可以编译Matlab的大部分函数,包括fft等,但是不知道为什么,不能编译xcorr这样的函数,有可能是Matlab5.3时候的相关函数不是xcorr(待考证)。 2.3.2 原理
Matcom的工作原理:Matcom的矩阵运算部分是基于一个名为Matrix
Matcom的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件TeeChart3.0来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。在Matcom4.5版本中使用的是TeeChart3.0。绘图函数功能主要在lib文件和 window/system/ago*.dll中定义的。
Matcom编译m文件时先将m文件按照与Matcom的cpp库的对应关系,翻译为cpp源代码,然后用对应版本的C编译器将该CPP文件编译为.exe或.dll文件,所以,在第一次运行时让指定C Compiler的路径是必要的,否则将无法编译。指定好的C Compiler的信息写在Matcom/bin/matcom.ini文件中,这些都是在安装的时候自动完成的。
2.3.3 实现过程
按下列步骤完成Matcom add-in的安装:
1.安装Matcom,按提示选择Visual C++的安装路径;
2.运行Visual C++,从菜单条中选择Tools/Customize/Add-ins and Macro Files,选择Browse,改变文件类型为Add-ins(.dll),选定D:\\Matcom45\\bin\\mvcide.dll文件,确定;
3.此时,可以在VisualC+十的开发环境 …… 此处隐藏:3753字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




