首页 | 供应信息 | 求购信息  | 下载系统 | 技术资讯 | 企业信息 | 产品信息 | 论文信息 | 展会信息 | 在线工具
作者: 发布时间:2016-12-27 来源:上海简仪科技有限公司 繁体版
需求描述客户已经在MATLAB中编辑好了算法,现在想利用C#强大的图形界面功能进行显示,同时做成安装包进行发布应该如何操作?MATLAB中有大量的算法工具,比如说DSP等算法工具,是否可以将该工具包进行封装成类进行调用,这样就不


vdA自动化在线网

vdA自动化在线网

需求描述vdA自动化在线网

客户已经在MATLAB中编辑好了算法,现在想利用C#强大的图形界面功能进行显示,同时做成安装包进行发布应该如何操作?MATLAB中有大量的算法工具,比如说DSP等算法工具,是否可以将该工具包进行封装成类进行调用,这样就不需要每次大量混合编程工作了?
vdA自动化在线网

关键词 vdA自动化在线网

MATLAB,C#,混合编程,DSPvdA自动化在线网

软件版本:MATLAB 2013a(64bits),Visual Studio 2015(bits),.NET 4.0
vdA自动化在线网

应用详述    vdA自动化在线网

第一步:编写M函数,并测试可以使用:   vdA自动化在线网

做一个简单的MATLAB算法的封装,只先将MATLAB的FFT进行封装。首先在MATLAB中创建一个.m的文件,源码如下,如图1所示:vdA自动化在线网


vdA自动化在线网

function Y = FFT(X,N) vdA自动化在线网

y=fft(X,N);   %对信号进行快速Fourier变换vdA自动化在线网

Y=abs(y);   %取Fourier变换的振幅vdA自动化在线网


vdA自动化在线网


vdA自动化在线网


vdA自动化在线网

图1vdA自动化在线网


vdA自动化在线网

注意,混编必须是m函数function的形式才能被调用。上述函数简单测试一下,没有问题(复杂的函数一定要多测试,否则后续调试非常困难)。继续下一步。vdA自动化在线网

第二步:在Matlab中使用deploytool建立混编项目vdA自动化在线网

在Matlab工作区输入命令:deploytool,然后得到下面界面,输入混编项目的名称,选择存储位置,关键的是类型那里一定要选择".NET Assembly"。如下图2所示:vdA自动化在线网

vdA自动化在线网

图2vdA自动化在线网


vdA自动化在线网

选择“OK”之后,下一步MATLAB界面右侧会出现项目解决方案,需要添加类名称和M文件。这个类名称,就是编译完成之后C#项目中的类对象名称,然后添加我们刚才上一步编写的“FFT.m”,然后编译即可,如下图3所示:vdA自动化在线网

vdA自动化在线网

图3vdA自动化在线网

vdA自动化在线网

到此为止,一个常规 简单的Matlab.NET混编已经完成了60%了。编译完成之后,打开“Package”选项卡,即可看到生成的dll文件,然后点击右键,打开文件夹即可,如下图所示:vdA自动化在线网

vdA自动化在线网

图4vdA自动化在线网

第三步:C#中添加matlab的dll引用vdA自动化在线网

打开VS2015创建一个窗体的应用程序,主要需要完成的是DLL的引用添加,将matlab工程(matPrj)src文件夹下的FFTDemo.dllvdA自动化在线网

和D:/ProgramFiles/MATLAB/R2013a/toolbox/dotnetbuilder/bin/win64/v2.0(前边为matlab的安装路径)文件夹下的MWArray.dll添加到项目引用中去,如图5所示。其中MWArray主要的作用是做将MATLAB与C#中的数据进行转换交接。主要的原因是,MATLAB本身来说是一种比较松散的语言,在整个算法编程过程中并没有定义出来类似于C#中的多种数据类型,如double,float或者int等数据类型,所以在混个编程数据交接过程中需要有一个dll进行数据类型的转换的。vdA自动化在线网

vdA自动化在线网

图5vdA自动化在线网


vdA自动化在线网

同时需要添加以下的命名空间在系统中:vdA自动化在线网

//用户自行添加的命名空间vdA自动化在线网

using FFTDemo;//这是我们自己定义的vdA自动化在线网

using MathWorks.MATLAB.NET.Arrays;//在MWArray.dll中,最常用的vdA自动化在线网

using MathWorks.MATLAB.NET.Utility;//在MWArray.dll中,最常用的vdA自动化在线网

   在使用过程总,我们可以这样理解,我们之前编译好的dll就是一个类,我们首先需要将这个类进行实例化,然后每一个我们编写好的.m文件都是一个方法。所以首先要做的就是将类进行实例化,整体的代码如下所示,利用SeeSharp所生成波形,利用MATLAB中的dll算法继续FFT分析同时进行显示,其中单机Button2时候的部分就是混合编程调用FFT的部分:vdA自动化在线网

namespace FFTMATLABdemovdA自动化在线网

{vdA自动化在线网

   publicpartialclassForm1 : FormvdA自动化在线网

   {vdA自动化在线网

       public Form1()vdA自动化在线网

       {vdA自动化在线网

           InitializeComponent();vdA自动化在线网

       }vdA自动化在线网

vdA自动化在线网

       FFTdemo fft = newFFTdemo();vdA自动化在线网

       Stopwatch sw = newStopwatch();vdA自动化在线网

       Stopwatch sw1 = newStopwatch();vdA自动化在线网

       privatedouble[] wave = newdouble[100000];vdA自动化在线网

       privatedouble[] nosie = newdouble[100000];vdA自动化在线网

vdA自动化在线网

       privatevoid button1_Click(object sender, EventArgs e)vdA自动化在线网

       {vdA自动化在线网

           label3.Text = (trackBar1.Value * 100).ToString() + "Hz";vdA自动化在线网

vdA自动化在线网

           Generation.SineWave(ref wave, 5, 0, trackBar1.Value * 100, 10000);vdA自动化在线网

           Generation.UniformWhiteNoise(ref nosie);vdA自动化在线网

           ArrayCalculation.Add(wave, nosie, ref wave);vdA自动化在线网

           easyChart1.Plot(wave);vdA自动化在线网

       }vdA自动化在线网

vdA自动化在线网

       privatevoid button2_Click(object sender, EventArgs e)vdA自动化在线网

       {vdA自动化在线网

           button2.Enabled = false;vdA自动化在线网

           vdA自动化在线网

           MWNumericArray MatlabWave = wave;vdA自动化在线网

           MWArray x = 10000;vdA自动化在线网

           sw.Start();vdA自动化在线网

           var k = fft.FFT(MatlabWave, x);vdA自动化在线网

           sw.Stop();vdA自动化在线网

           easyChart2.Plot((double[,])k.ToArray());            vdA自动化在线网

           label1.Text = sw.ElapsedMilliseconds.ToString();vdA自动化在线网

           sw.Reset();vdA自动化在线网

           button2.Enabled = true;vdA自动化在线网

       }vdA自动化在线网

   }vdA自动化在线网

}vdA自动化在线网


vdA自动化在线网

测试结果,如图所示,混合编程的结果与MATLAB中的测试结果一定是一致的,而且整体来说做100K个点FFT变换效率也不错,大概在0~1ms左右的范围内。vdA自动化在线网

vdA自动化在线网

图6vdA自动化在线网

1. 混合编程虽然可以脱离MATLAB环境,但是必须安装MATLAB运行时—MCR,并且开发版本和运行版本的MCR要对应,否则会出错误,我们将在程序中进行说明。其中MCR安装是不需要版权的。vdA自动化在线网

2.本来说做混合编程并不是一个比较复杂的事情,唯一的难点其实是在C#与MATLAB中数据转化的内容,其实这一部分在MATLAB自带的帮助文档是有写的。所以我们只需按照帮助文档的提示去操作就可以了。vdA自动化在线网

3.混合编程过程中,有很多的问题都可以通过通用的搜索引擎中搜索答案,同时如果用MATLAB所生成的3D图形可以在C#中调用并且显示。vdA自动化在线网

4.在相关链接中有一套非常好的C#与MATLAB混编的教学视频,非常推荐。vdA自动化在线网


vdA自动化在线网


vdA自动化在线网


vdA自动化在线网

vdA自动化在线网

联系简仪vdA自动化在线网

更多信息,请致电简仪科技:021-50475899                            vdA自动化在线网

官网:www.jytek.com                            vdA自动化在线网

Email: info@jytek.com
vdA自动化在线网



vdA自动化在线网


vdA自动化在线网


vdA自动化在线网

vdA自动化在线网



锐视开源测控平台技术指南
评论】【加入收藏夹】【 】【关闭
※ 相关信息
无相关信息
※ 其他信息
访问数: | 共有条评论
发表评论
用户名:
密码:
验证码: 看不清楚,点击刷新
匿名发表

 搜索新闻
[提交投稿]  [管理投稿]
 最新新闻
 热点新闻
数据加载中..

网站地图
Autooo.Net 版权所有
Copyright © 2007--2016 All rights reserved