从MATLAB到嵌入式C代码的实现

从MATLAB到嵌入式C代码的实现
从MATLAB到嵌入式C代码的实现

从MATLAB到嵌入式C代码的实现

从设想到硬件实现的鸿沟是许多从事嵌入式开发的

工程师们都熟悉的问题。鉴于MATLAB本身的语言特点、强大的函数库和灵活性,算法开发人员经常在算法的概念设计阶段使用它。

随着设计发展到嵌入式应用阶段,真实环境下的实际限制就需要考虑。这往往需要手工地把MATLAB指令翻译成c 代码。手工翻译就涉及将MATLAB中方便易行的矩阵计算用c重新实现,这最终导致了同样算法的不同语言版本。在这一阶段,用户需要在多次循环设计时面临验证不同版本的等效性这一额外负担。验证所花费的精力很快就超出开发人员的承受范围,导致设计不是过快固化就是偏离了最初的定义。

最近The MathWorks公司提供了解决该问题的工具。这个工具能够把一种已明确定义的MATLAB语言子集自动转化为嵌入式c代码,有效减少了MATLAB语言向c代码进行手工翻译的开发和验证成本。

在本篇文章中,我们首先回顾MATLAB在早期设计过程中一些有用的特点。接下来我们要检验从MATLAB“概念”代码人工编译到C代码的低效性,之后会介绍一种不同的工

作流程,即直接在MATLAB而不是使用c语言对嵌入式系统进行确切描述。

MATLAB和C代码特点比较

表1比较了MATLAB和c代码在前期开发中的特点。

把一段典型的MATLAB算法转化成嵌入式c代码,要涉及几个相关实现的要求:

?数据类型管理一在执行前必须定义数据类型。例如在图像处理中,一般用8位无符号整数表示像素值,在音频处理时,一般用16位符号整数表示采样值。而MATLAB中默认使用的64位双精度变量显然没有有效地利用内存。

?内存静态分配-MATLAB在运行时无缝处理变量大小的动态变化。然而在嵌入式系统实际应用中,我们尽量避免动态内存分配,而是在使用之前给内存分配固定的大小和数据类型。

?降低计算复杂性和内存占用空间,在把高层算法映射到有限内存和计算资源的硬件上,嵌入式软件设计者会耗费大量精力,同时要保证程序的有效运行。这是一个把设计算法转化成目标处理器中的指令集合和数据定义的过程。

?支持定点在嵌入式软件或硬件上运行程序,需要整个算法全部严格定义成定点数据类型。

工程师们一般会在把MATLAB算法改写成c代码的时候做这些调整,从而产生了我们前面所说的设计鸿沟。软件工程师在两者间进行翻译的时候,有可能会人工引入一些错误和数值上的改变。如果这些变动目的在于优化程序,算法的设计者就需要更改MATLAB程序从而使两者保持一致。但这个过程引入了不必要的工作量和产生错误的可能性。一种为嵌入式系统设计的基于嵌入式MATLAB的工作流程解决了这个问题。

由MATLAB程序生成嵌入式C代码

不同于其他MATLAB程序,嵌入式MATLAB语言不是对设计的抽象数学表述,它包含了高效嵌入式c指令所需要的所有细节。任何按照嵌入式MATLAB子集要求编写的MATLAB程序都能生成嵌入式c代码。

为确保MATLAB算法与嵌入式MATLAB子集的一致性,需要用户遵守MATLAB子集规定的过程:

?设置变量的数据类型一可以在MATLAB主程序或编译过程中设定数据类型。因为它允许一个单独的MATLAB函数产生多个使用不同的数据类型、维度和复杂度的c函数变量,因此在编译过程中设置数据类型更为方便。由于用户在

函数接口已定义了数据类型和大小,在函数主体中数据类型和大小的变化就可以被自动推断了。

?设置数列大小变化避免动态数据分配一在MATLAB 中,在循环迭代中变量的大小也是可以改变的。用户可以通过使用固定最大值的缓存并对分部寻址的方法来解决嵌入式系统数列大小变化的问题。

?编写适应于嵌入式MATLAB的函数一不是所有的MATLAB工具箱函数都适用于嵌入式MATLAB子集。这些工具箱函数可以作为模板或者参考,为用户使用嵌入式MATLAB子集在有限计算和存储资源的情况下实现类似功能的高效嵌入式c语言提供帮助。之后我们想要的c代码就可以从嵌入式MATLAB代码中自动生成了。

?把浮点计算转化为定点计算一用户可以使用Fixed Point Toolbox中的data logging和data-type override工具来观察MATLAB算法中变量动态变化范围。这些工具箱帮助用户在MATLAB中把算法转化成优化的定点计算形式。由于这个算法是在MATLAB中编写的,用户可以直接对比定点计算和浮点计算的结果,以保证两者之间的差距在一个可接受的范围内。

嵌入式MATLAB例子

下面我们来举例说明在嵌入式MATLAB中进行算法的语言转换的过程。

首先编写算法的概念程序并加入嵌入式系统的限制,保证程序服从于嵌入式MATALB的要求并在功能上与原程序保持一致。然后从MATLAB桌面自动生成c代码。

我们选择一个图像处理中自适应中值滤波算法的例子进行具体说明。这个例子涉及了MATLAB中典型的改变变量大小的问题。

MATLAB程序如图1所示,adapive_stats.m选取围绕给定元素数的矩阵的较大区域来计算该区域的统计特性(最小值,最大值,中值)。这个函数在这些统计数据的基础上给出滤波后矩阵中心元素的结果,包括两个步骤。

步骤1:验证与嵌入式MATLAB子集的适用性

要验证该函数是否适用于嵌入式MATLAB子集,这里推荐使用EMLMEX指令。EMLMEX在对嵌入式MATLAB 程序进行编译时检测其中所有可能的语法错误,并自动生成编译报告,对问题进行描述并提供出现错误的语句在程序中的链接。

编译报告显示原始函数的不适应,原因是五个变量(windowjnd,region,rmin,rmax,rmed)随着变量s在循环中采用不同数值改变了大小。不符合嵌入式MATLAB要求

的函数部分在图1中被高亮显示。这个结果违反了前面提到的第二条适应性原则:设置数列大小变化避免动态数据分配。如果我们手工把这个函数改写成c代码,这五个变量将会被分配到动态存储器,这是我们所不希望看到的。

解决办法是提出一个新的函数,在恒定最大值矩阵的研究区域上运行。修改后的程序如图2所示。这个程序除了不违反数值大小变化规定和调用新函数mi_stats.m之外,和原来的函数是一样的。这个新函数在图2中被高亮标示出来。

可以看到在新函数roi_stats.m中,MATLAB被进行了一些面向应用的优化,比如去除了多重调用函数的开销,降低了计算的复杂程度,通过给同一分类数列标序得到3个统计表。

嵌入式MATLAB子集支持很多MATLAB的结构、算子和功能。在图3中可以看到my soft是一个用来给数列的子部分分类的MATLAB函数。

运行EMLMEX命令后可以看到没有报错信息,我们可以确定改动后的adaptive_stats_roi.m现在适用于嵌入式MATLAB,并准备好自动生成C代码了。另外也可以使用MATLAB M-lint检验工具来鉴别程序中适用性的问题。

步骤2:适应程序的自动c代码生成

EMLC是一个自动把MATLAB适应程序翻译成c源代

码的命令行工具。用户可以使用下面的命令把适用程序adaptive_stats_roi.m生成C代码。

>>emlc adaptive_stats_roi.meg(In)-c-report

这里,-report选项允许用户生成一个带有C源文件超链接的HTML报告,和一个从MATLAB函数自动生成的头文件。

用户可以方便地把已有的C代码整合到嵌入式MALTAB流程中。如果用户已经开发了一个C函数库,也许会希望在程序中重复利用他们。嵌入式MATLAB提供了c 程序接口程序eml.ceval,允许用户在嵌入式MATLAB中调用外部C函数。例如在roi_stats.m;程序中,可以把调用MATLAB函数mysort替换成已有的c函数ic_sort:Bool c_sort(float*U,flat*Y,int n,intm);

这个替换就涉及了eml.ceval函数的使用,它把输入输出参数数值或参量传递给c函数。

结语

使用嵌入式MATLAB子集进行代码生成的主要目的在于消除从设想到硬件实现之间的鸿沟。它引入了在同一语言环境下进行算法设计和详细描述的全新流程。通过使用MATLAB自动生成c代码,用户得以保持其设计的唯一性,

迭代跟踪也变得更加简单,算法设计人员和软件工程师得以更紧密地合作,以快速生产出更完美的产品。

实验一 matlab的开发环境与基本运算

实验一 matlab 的开发环境与基本运算 一、实验学时 4学时(课内2学时,课外2学时) 二、实验类型 验证性实验 三、实验目的 1、熟悉matlab 的开发环境 2、掌握矩阵、变量、表达式的各种运算 四、所需设备及软件 1、安装了windows xp/win7/win8/win10的计算机 2、matlab 开发工具 五、实验基本原理 1、熟悉MATLAB 环境: MATLAB 桌面和命令窗口、命令历史窗口、帮助信息浏览器、工作空间浏览器。 2、掌握MATLAB 常用命令 表1 MATLAB 常用命令 clc 清除命令窗口中内容 clear 清除工作空间中变量 help 对所选函数的功能、调用格式及相关函数给出说明 3、MATLAB 变量与运算符 1)变量命名规则 2)MATLAB 的各种常用运算符 表2 MATLAB 算术运算符 表3 MATLAB 关系运算符 操作符 功能说明 操作符 功能说明 + 加 \ 矩阵左除 - 减 .\ 数组左除 * 矩阵乘 / 矩阵右除 .* 数组乘 ./ 数组右除 ^ 矩阵乘方 ' 矩阵转置 .^ 数组乘方 .' 数组转置 表4 MATLAB 逻辑运算符 表5 MATLAB 特殊运算 逻辑运算符 逻辑运算 说明 & And 逻辑与 | Or 逻辑或 ~ Not 逻辑非 Xor 逻辑异或 操作符 功能说明 == 等于 ~= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 符号 功能说明示例 符号 功能说明示例 : 1:1:4;1:2:11 ; 分隔行 , 分隔列 () % 注释 [] 构成向量、矩阵 {} 构成单元数组 = 用于赋值

matlab调用c语言编程

matlab与C语言混合编程 用C编写mex程序 大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读 一句执行一句的。这样做可以很方便的实现编程过程中的交互,也免去了麻烦又耗时的 编译过程。但凡事有一利必有一弊,matlab在执行时速度慢也就根源于此。在matlab里 tic for i=1:10000 b(i)=a(10001-i); end 怎么样,是不是很慢? 你的程序里如果再多几个这样的循环,运行速度就可想而知了。 上面程序的功能是将向量a里的数据逆序赋给向量b。下面的程序可以实现相同的功能 tic b=a(10000:-1:1); 为什么这个程序运行速度就这么快呢?这是因为matlab里的基础矩阵运算函数,像转置,复制等等,都是以二进制程序的形式存在的,运行起来速度当然比解释执行10000次所以编matlab程序时,应该尽量避免用循环语句,而使用等效的矩阵运算。虽然这样 但总是有的时候没法找到对应的矩阵运算来等效,或编出来的程序复杂得让人没法修 简单地说,mex程序就是根据一定的接口规范(matlab提出的)编写的一个dll,matla 比如我编了一个mex函数,名字叫max2.dll,那么只要把这个dll所在的目录加到matlab 的搜索路径里(用addpath),就可以像调用普通matlab函数一样来调用它了。因为把 循环体放到了二进制程序中,执行速度快得多。 Mex文件既可以用c,也可以用fortran来编。因为我用的是c语言,所以下面的介绍都 用c语言编写mex文件的方法。如果你用的是fortran,请你自己去看Apiguide.pdf,里 面有详细说明。 前面说到通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。这是 Matlab5.1本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Wat com C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,只要在Matlab里键入mex -setup ,就会出现一个DOS方式窗口,下面只要根据提示一步步设置就可以了。由于我用的是w 听说Matlab5.2已经内置了C语言的编译器,那么下面的这些可能就用不着了。可惜现 需要注意的是,在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的V C5装在路径C:\PROGRAM FILES\DEVSTUDIO下,那在设置路径时就要写成:C:\PROGRA~1 示例程序一、 这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序 存为hello.c。 #include "mex.h"

一个简单的Matlab_GUI编程实例

Matlab GUI编程教程(适用于初学者) 1.首先我们新建一个GUI文件:如下图所示; 选择Blank GUI(Default) 2.进入GUI开发环境以后添加两个编辑文本框,6个静态文本框,和一个按钮,布置如下

图所示; 布置好各控件以后,我们就可以来为这些控件编写程序来实现两数相加的功能了。3.我们先为数据1文本框添加代码; 点击上图所示红色方框,选择edit1_Callback,光标便立刻移到下面这段代码的位置。 1. 2. 3.function edit1_Callback(hObject, eventdata, handles) 4.% hObject handle to edit1 (see GCBO) 5.% eventdata reserved - to be defined in a future version of MATLAB

6.% handles structure with handles and user data (see GUIDATA) 7.% Hints: get(hObject,'String') returns contents of edit1 as text 8.% str2double(get(hObject,'String')) returns contents of edit1 as a double 复制代码 然后在上面这段代码的下面插入如下代码: 1. 2.%以字符串的形式来存储数据文本框1的内容. 如果字符串不是数字,则现实空白内容input = str2num(get(hObject,'String')); %检查输入是否为空. 如果为空,则默认显示为0if (isempty(input)) set(hObject,'String','0')endguidata(hObject, handles); 复制代码 这段代码使得输入被严格限制,我们不能试图输入一个非数字。 4.为edit2_Callback添加同样一段代码 5 现在我们为计算按钮添加代码来实现把数据1和数据2相加的目的。 用3中同样的方法在m文件中找到pushbutton1_Callback代码段 如下; 1.function pushbutton1_Callback(hObject, eventdata, handles) 2.% hObject handle to pushbutton1 (see GCBO) 3.% eventdata reserved - to be defined in a future version of MATLAB 4.% handles structure with handles and user data (see GUIDATA) 复制代码

C或C++调用Matlab程序

1调用方式 1.将Matlab程序编译为独立可执行文件 可以脱离matlab运行exe程序,但需要MCR运行环境,对于有输入变量的函数而言,执行exe会出错,没什么实用价值 2.C/C++程序调用Matlab引擎 不能脱离matlab使用,实际上主要是用C/C++完成界面编写,通过接口函数调用matlab引擎,C/C++程序向matlab计算引擎传递命令和数据信息,并从matlab计算引擎接收数据信息,相当于在matlab中执行计算程序。 利用计算引擎的特点是:节省大量的系统资源,应用程序整体性能较好,但不能脱离matlab的环境运行,且运行速度较慢,在一些特别的引用(如需要进行三维图形显示)时可考虑使用。 3.C/C++程序调用Matlab程序编译后的动态链接库 可以完全脱离matlab使用,主要思想就是先编译m文件,将函数封装在库文件中,从而可以在C/C++程序中,通过调用DLL实现对matlab代码的调用。 利用mcc编译器生成的DLL动态连接库文件,只需在C/C++编译环境中将其包含进来,调用导出函数即可实现原m文件的功能,极大的方便了用户的代码设计。 4.C/C++程序调用Matlab程序编译后的COM组件 C/C++调用COM组件和调用Matlab程序编译后的动态链接库和的执行效率是相同的,但调用动态链接库实现起来比较简单,调用COM组件实现起来比较复杂,很少使用。 2C/C++调用m文件编译后的动态链接库 2.1Matlab设置步骤 1.命令窗口输入mbuild –setup和mex–setup命令,选择VC++6.0编译器

2.编写m文件,如add.m(脚本文件和函数文件都可以) function [a,b]=add(x,y) a=2*x+y; b=3*y; end 3.生成dll文件 输入命令:mcc -B cpplib:addadd.m或者mcc -W cpplib:add -T link:libadd.m 4.提取add.ctf,add.h,add.dll,add.lib 共4个文件(更高版本的matlab没有 ctf文件,只需另外3个就可以)

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南 甄梓宁 znzhen@https://www.360docs.net/doc/e13019206.html, Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。本文就对如何在C程序中调用Matlab程序作说明。 在C程序中调用Matlab程序有两大类方法。第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。关于MCR,请见第四章的说明。至于两种方法需要在C环境中如何配置请见第五章。 而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。 一、调用Matlab引擎 调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。下面是调用Matlab中的加法程序add.m的例子。 先在Matlab的work目录下创建add.m文件并编写程序如下: function s = add (a, b) s = a+b; 在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章) Engine *ep = engOpen (NULL); 编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录: engEvalString (ep, ”cd ..\\..\\work”); engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行: engEvalString (ep, ”s=add(a,b)”); 当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。关于mxArray,在第三章会有详细说明。下面是对a=1,b=2的转换过程:

Matlab以MEX方式“调用”C源代码

Matlab以MEX方式“调用”C源代码 阅读() 评论() 发表时间:2008年09月26日 00:46 本文地址:https://www.360docs.net/doc/e13019206.html,/blog/3311493-1222361217 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给 mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab 语句中调用函数时的输出值(如上例中的a)。 值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。在matlab6.5中使用mex -v 选项,你可以看到最后mex阶段有类似如下的信息: --> "del _lib94902.obj" --> "del "test.exp"" --> "del "test.lib"" 也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。 比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex-setup),在Windows中,MEX 文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数

在matlab中调用c程序

1.Maltab 编译Mex文件(不可调试) 1.1hello word 在matlab命令行中输入:mex -setup选择合适编译器,完成设置。 新建一个文件,输入: #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 把上面程序保存为一个C文件,如 hello.c 在command window下运行 >> mex hello.c >> 结束之后在current folder 窗口里会有一个hello.mexw32文件。 在command window下运行 >> hello() Hello word! 1.2如果是多维数组并不能用Arr[i][j]的格式寻址,在参数在C里只是一维数组, 一维数组按列排列,C语言是按行排列的, 如[a b c d;e f g h]C语言在内存中是按a b c d e f g h排列,而matlab是按 a e b f c g d h排列的。如果要变成C语言可Arr[i][j]索引的格式,可用for循环转化 打印函数: mexPrintf()相当于matlab的disp函数, mexPrintf函数里需要打印的部分必须用""而不能用'' 子函数的问题: 子函数有两种方式,一种采用return值得方式返回值 另一种方式为利用参数返回值,把需要return的值直接赋给形参。 多个.c文件的编译: 多个.c文件中只能存在一个mexFunction函数 可用mex ('a.c','b.c','d.c')的格式编译 在VS中调试mex 在vs中建立dll工程,建立project.cpp文件,输入 #include "project.h" #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 建立.h文件,输入 #include "matrix.h"

一种基于Matlab的DSP调试及直接代码生成方法

https://www.360docs.net/doc/e13019206.html,/p-21683359.html 一种基于Matlab的DSP调试及直接代码生成方法 Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matlab环境下的DSP调试进行了原理及思路上的阐述,但均未涉及到直接代码生成。本文在介绍CCSLink的连接对象、嵌入式对象和RTDX对象的基础上,详细阐述Simulink环境下的直接代码生成。 1 CCSLink及ETTIC2000概述 Matlab具有强大的分析、计算和可视化功能,但处理速度慢;DSP具有快速的信号处理能力,但是其CCS的编译环境中数据可编辑和分析能力不如Matlab;而MathWorks公司和TI公司联合开发的Matlab Linkfor CCS Development Tools(CCSLink)和EmbeddedTarget for the TI TMS320C2000 DSP Platform(ETTIC2000),CCSLink提供了Matlab和CCS的接口,能把Matlab和TI CCS及目标DSP连接起来。利用此工具可以像操作Matlab变量一样来操作TI DSP的存储器或寄存器。CCSLink支持CCS能够识别的任何目标板(C200,C5000,C600),此工具用于DSP程序的调试过程。而CCSLink与ETTIC2000的配合使用,可直接由Matlab的Simulink模型生成TIC2000DSP 的可执行代码,能在集成、统一的Matlab环境下完成DSP的整个开发过程。 2 CCSLink环境下的DSP调试 CCSLink向用户提供了3个组件内容,如图1所示。

Matlab调用c语言程序代码

Matlab调用c程序 方法: 第一步:要先在matlab中安装c程序编译器,步骤如下: 键入命令:mex -setup; 选择c/c++编译器; 选择c/c++编译器版本; 确认。 第二步:键入:mex *.c 实例介绍:【转】 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab 的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。 可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows 中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。 我们现在来说mexFunction怎样写。 mexFunction的定义为: void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

手把手教你C_调用MATLAB函数

【转载】手把手教你用C#调用MATLAB函数 编译环境:Microsoft Visual Studio 2008 版本9.0.21022.8 RTM Microsoft .NET Framework 版本3.5 已安装的版本: Professional Microsoft Visual Basic 2008 91986-031-5000002-60050 Microsoft Visual Basic 2008 Microsoft Visual C# 2008 91986-031-5000002-60050 Microsoft Visual C# 2008 Microsoft Visual C++ 2008 91986-031-5000002-60050 Microsoft Visual C++ 2008 Microsoft Visual Studio 2008 Tools for Office 91986-031-5000002-60050 Microsoft Visual Studio 2008 Tools for Office Microsoft Visual Web Developer 2008 91986-031-5000002-60050 Microsoft Visual Web Developer 2008 Crystal Reports AAJ6G-K0MSA4K-680002Z Crystal Reports Basic for Visual Studio 2008 Matlab 2008b 首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild -setup 显示如下 >> mbuild -setup Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers [y]/n? n %选择n Select a compiler: [1] Lcc-win32 C 2.4.1 [2] Microsoft Visual C++ 6.0 [3] Microsoft Visual C++ .NET 2003 [4] Microsoft Visual C++ 2005 [5] Microsoft Visual C++ 2005 Express Edition [6] Microsoft Visual C++ 2008 [0] None Compiler: 6 %选择6,其他编译器可以选相应的选项,我没有验证过The default location for Microsoft Visual C++ 2008 compilers is C:\Program Files\Microsoft Visual Studio 9.0, but that directory does not exist on this machine. Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? n%选择n Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0 %选择您自己的当前安装路径

一种基于Matlab的DSP调试及直接代码生成方法.

一种基于Matlab的DSP调试及直接代码生成方法 Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP 上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matl Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP 上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matlab环境下的DSP调试进行了原理及思路上的阐述,但均未涉及到直接代码生成。本文在介绍CCSLink的连接对象、嵌入式对象和RTDX对象的基础上,详细阐述Simulink环境下的直接代码生成。 1 CCSLink及ET TIC2000概述 Matlab具有强大的分析、计算和可视化功能,但处理速度慢;DSP具有快速的信号处理能力,但是其CCS的编译环境中数据可编辑和分析能力不如Matlab;而MathWorks公司和TI公司联合开发的Matlab Linkfor CCS Development Tools(CCSLink)和EmbeddedTarget for the TI TMS320C2000 DSP Platform(ETTIC2000),CCSLink提供了Matlab和CCS的接口,能把Matlab和TI CCS及目标DSP连接起来。利用此工具可以像操作Matlab变量一样来操作TI DSP的存储器或寄存器。CCSLink支持CCS能够识别的任何目标板(C200,C5000,C600),此工具用于DSP程序的调试过程。而CCSLink与ETTIC2000的配合使用,可直接由Matlab的Simulink模型生成TIC2000DSP的可执行代码,能在集成、统一的Matlab环境下完成DSP的整个开发过程。 2 CCSLink环境下的DSP调试 CCSLink向用户提供了3个组件内容,如图1所示。

实验一 熟悉 MATLAB开发环境

实验一熟悉MATLAB开发环境 1、实验目的 1)熟悉M A TLAB 的开发环境,掌握常用菜单的使用方法; 2)熟悉M A TLAB 工作界面的多个常用窗口包括命令窗口、历史命令窗口、当前工作目录窗口、工作空间览器窗口、变量编辑窗口和M文件编辑/调试窗口等; 3)了解M A TLAB 的命令格式。 2、实验内容 2.1 MATLAB的启动 方式一:Windows的“开始”菜单方式; 方式二:桌面图标方式。 2.2 MATLAB 的窗口布局 图1 MATLAB 7.x 工作环境 2.3 使用命令窗口(Command Window) 命令窗口如图 S1-2 所示,在命令窗口中输入: a=[1 2;3 4] a =

1 2 3 4 b=1/3 b = 0.3333 c=a*b c = 0.3333 0.6667 1.0000 1.3333 2.4 使用标点符号来修改命令行 (1) %添加注释 c=a+b % c为矩阵 a+b 的和 (2) ;不显示计算结果 a=[1 2;3 4]; (3)…续行 d=123456 + … 111111 (4) ,用作数组元素的分隔 a=[1,2;3,4] a = 1 2 3 4 2.5 使用操作键 ↑:向前调回已输入过的命令行; ↓:向后调回已输入过的命令行; Esc:清除当前行的全部内容。 2.6 使用 Format 设置数值的显示格式 format long:显示 15 位长格式 format long c

c = 0.33333333333333 0.66666666666667 1.00000000000000 1.33333333333333 format rat:显示近似有理式格式 format rat c c = 1/3 2/3 1 4/3 2.7 设置命令窗口的外观 在 MATLAB 的界面选择菜单“File”---“Preferences” 2.8 使用控制命令 clc %清空命令窗口的显示内容 clear beep on %发出 beep 的声音 beep 2.9 历史命令窗口(Command History) 历史命令窗口在 MATLAB界面的左下侧,在历史命令窗口中可以看到本次启动MATLAB 的时间和已经输入的命令。 2.10 工作空间窗口(Workspace) 工作空间窗口在 MATLAB界面的左上 保存变量 Save filename 读回: Load filename 2.11 当前目录浏览器窗口(Current Directory Browser) (略)

C语言与MATLAB混合编程的设置

C语言与MATLAB混合编程的设置 1.编译环境的安装 本次的程序是通过C语言来实现的,所以需要C的编译器,而且可视化是通过C语言与MATLAB混合编程来实现的,所以我们的编译环境需要两款软件 a.安装VC6.0 b.安装MATLAB(测试的软件是用的MATLAB2010a) 2.编译器的环境变量和工程连接的设置 安装好后就开始环境变量的设置,在我的电脑中打开属性 根据”高级”->”环境变量”->”path” 假设MATLAB的安装路径为D:\ProgramTool\matlab2010 在path中添加两项 “D:\ProgramTool\matlab2010\bin\win32”;“D:\ProgramTool\matlab2010\bin” 在两个路径间用分号隔开 打开VC6.0 根据”Tools”->”Opinions”->”Directories”->”include files”中添加一行 “D:\ProgramTool\matlab2010\extern\INCLUDE” 根据”Tools”->”Opinions”->”Directories”->”Library files”中添加一行 “D:\ProgramTool\matlab2010\extern\lib\win32\microsoft” 打开工程后 根据”Project”->”setting”->”Link”->”Object/library modules”中添加 “libeng.lib libmx.lib libmat.lib”三个libMATLAB自带文件 根据”Project”->”setting”->”Link”->”Project Opinions”中 将“/subsystem:windows”修改成“/subsystem:console” 根据”Project”->”setting”->”C/C++”->”Preprocessor Definitions” 将“_WINDOWS”修改成“_CONSOLE” 3.编译后的效果说明 设置好环境变量和链接后就可以开始进行编译了,编译好后在Debug中打开执行文件运行就可以开始模拟,在可视化中要调用MATLAB的控制窗口利用MATLAB引擎进行画图

c_调用matlab函数(混合编程)

第2部分实战练习(自己做的) 2.1 c#调用matlab函数 matlab版本2009b,c#版本vs2008. 2.1.1 matlab函数编译成dll文件 (1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。 %-------------------------------------------------------- function [addRlt,minusRlt]=MatrixOpera(a,b) % 矩阵相加,相减 [m1,n1]=size(a); [m2,n2]=size(b); if m1~=m2 || n1~=n2 display('矩阵大小不相同') error('参数错误'); end addRlt=a+b; minusRlt=a-b; end %----------------------------------------------------------- 两个输入参数,两个输出参数,并且都是矩阵形式 (2)在matlab 命令窗口输入deploytool,弹出如下窗口 或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)

修改

(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。本实例中给它添加了MatrixOpera等函数。 class 方法 (4)完了之后就可以编译了。编译出来后需要一两分钟的时间。 编译 (5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。同时还要从G:\Program Files\MATLAB\R2009b\toolbox\dotnetbuilder\bin\win32\v2.0拷贝出MWArray.dll和https://www.360docs.net/doc/e13019206.html,module。第二个文件必须要哦,否则可能会

基于Matlab2011a的DSP_TMS320F28027代码开发

基于Matlab/Simulink的DSP-TMS320F28027代码开发 TMS320F28027通用的源代码开发可以采用两种方法:一种是直接利用其提供的汇编指令编写源代码,然后经过汇编器和链接器进行汇编链接后生成目标可执行代码;另一种方法是利用标准的C/C++语言编写源代码,然后经C/C++编译器、汇编器和链接器进行编译链接,最后生成目标可执行代码。这两种代码开发方法都使得开发人员不得不花费大量的时间在代码的编写上面,增大开发难度,延长开发周期,从而影响开发效率。对于不熟悉TMS320F28027的开发人员,更是有碍于在完成控制算法后进行系统物理实现。 MathWorks公司最近推出了针对应用控制系统开发的嵌入式目标模块Embedded Coder。Embedded Coder可以生成可读、紧凑且快速的C和C++代码,以便用于嵌入式处理器。本课题的部分源代码是由Embedded Coder产生的,使用Embedded Coder生成TMS320F28027的嵌入式代码的方法如下。 步骤一:安装和配置软件。 (一)安装软件 安装软件之前卸载Embedded Coder不支持的第三方软件,这样可以防止环境变量指向不支持的软件而发生错误。 1、安装必须的和可选的MathWorks软件,因为从Matlab2010b开始支持TMS320F28027,所以应安装2010b版本以上的Matlab,此外要安装Embedded Coder、Real-Time workshop工具箱。 2、安装TI Code Composer Studio (CCS),因为从CCS3.3开始支持TMS320F28027,因此因安装3.3版本的CCS。 3、如果要固化程序到Flash存储器,安装TI Flash API、F28xx On-chip flash programmer。 (二)配置软件 按如下方法配置CCS: 1、进入CCS,打开Help > About > Component manager > Build tools > TMS320C28XX选择C2000Code Generation Tools。 2、打开Target Content(DSP/BIOS) > TMS320C28XX选择Texas

matlab与c语言的接口

MATLAB 与 C 语言的接口 东北大学薛定宇(原作) 转载时请注明作者信息、网址,谢谢 MATLAB 到 C 语言程序的转换可以由两种途径完成,其一是MATLAB 自己提供的 C 语言翻译程序mcc, 另一种是原第 3 方公司MathTools 开发的MATCOM 。后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MATLAB 6.0 (Release 12) 中。 依本人的观点,二者都不完善,有大量的MATLAB 函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MATLAB 程序翻译成 C 语言程序很晦涩。翻译后的 C 程序几乎不适合手动去维护,更谈不上升级了。 有几个不兼容的地方是不能令人容忍的,例如eval() 函数在 C 翻译下是不兼容的,最新的MATLAB 6 才刚刚敢说已经部分兼容了,但离真正的兼容还有

很长的路要走,有很多艰难的技术困难需要克服,短时间内不可能有突破性的进展。另一个大的问题是,众所周知,MATLAB 新的控制系统工具箱中定义了大量的LTI 类,MATLAB 5 开始也允许使用类与对象的概念,这已经向“面向对象”的编程走了一大步,但MATLAB 到 C 的翻译明显都不支持“对象”的数据类型,所以在控制系统分析与设计(当然还有其他的领域) 中这样的转换几乎没有什么实际意义,所以不要将这样的转换太理想化。 从转换的程序速度来看,因为mcc 和MATCOM 都沿用了MATLAB 的程序运算机制,所以不可能大幅度地提高程序运行速度。相反地,如果将MATLAB 程序中明显的瓶颈部分用 C 语言按照MEX 格式编写,则可以大大加快速度。作者在《科学运算语言MATLAB 5.3 程序设计及应用》一书中以例子做过探讨,MCC 可以比快50%, 而MEX 的形式可能快上百倍。 〖举例〗分形问题:从初始点(x0,y0) 出发,按下面的公式生成新的点(x1,y1) 其中gi 为(0,1) 区间均匀分布的随机数。要求从

MATLAB的开发环境和工具

第三章MA TLAB的开发环境和工具 3.1MA TLAB与其他软件的接口关系 1.变量的存储和下载 Save Load 2.工作日志的记录 Diary 文件名.txt………… Diary off 3.通用命令库(general)(f) 函数的管理命令,通用信息,工作空间管理,管理搜索路径,文件操作系统,命令窗控制,启动退出,公共信息,调试命令 >> ver MATLAB和各工具箱的版本 ------------------------------------------------------------------------------------- MATLAB Version 7.0.0.19920 (R14) MATLAB License Number: 0 Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Service Pack 3) Java VM Version: Java 1.4.2 with Sun Microsystems Inc. Java HotSpot(TM) Client VM ------------------------------------------------------------------------------------- MATLAB Version 7.0 (R14) Simulink Version 6.0 (R14) Aerospace Blockset Version 1.6 (R14) Bioinformatics Toolbox Version 1.1 (R14) CDMA Reference Blockset Version 1.1 (R14) Communications Blockset Version 3.0 (R14) Communications Toolbox Version 3.0 (R14) Control System Toolbox Version 6.0 (R14) Curve Fitting Toolbox V ersion 1.1.1 (R14) Data Acquisition Toolbox V ersion 2.5 (R14) Database Toolbox Version 3.0 (R14) Datafeed Toolbox Version 1.5 (R14) Dials and Gauges Blockset V ersion 1.2 (R14) Embedded Target for Infineon C166 M... Version 1.1 (R14) Embedded Target for Motorola HC12 Version 1.1 (R14) Embedded Target for Motorola MPC555 Version 2.0 (R14) Embedded Target for OSEK VDX V ersion 1.1 (R14) Embedded Target for TI C2000 DSP(tm) V ersion 1.1 (R14) Embedded Target for TI C6000 DSP(tm) V ersion 2.1 (R14)

C与matlab混合编程

VC++与Matlab混合编程之引擎操作详解1 Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab 是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。 1. 什么是Matlab引擎 所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran 等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab的控制。可以主要功能有: ★打开/关闭一个Matlab对话; ★向Matlab环境发送命令字符串; ★从Matlab环境中读取数据; ★向Matlab环境中写入数据。 与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供100%的支持。同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。 实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时,会自动执行一次: matlab /regserver 将自己在系统的控件库中注册。如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。 2. 配置编译器 要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab 对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例): 1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在 C:\matlab目录)。 2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。(vs2005的话,不加msvc60) 3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。 以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ builder,设置大体相同,不再赘述

相关文档
最新文档