本文介绍了如何将matlab中的函数封装成DLL,并在C#中调用。
1、准备打包的函数,将matlab中生成Butterworth滤波器系数的函数进行封装。
function out = getFilterCoe(N,wn)
[num,den] = butter(N,wn);
out = [num,den];
end
2、在matlab中输入"libraryCompiler"打开MATLAB Compiler
(1) 第1步选择".NET Assembly";
(2) 第2步通过右侧的"加号"选择文件"getFilterCoe.m";
(3) 第3步修改输出的DLL的名称,此处DLL名称为"Butterworth";
(4) 第4步修改类的名称为"FilterCoe";
(5) 第5步点击"Package"开始打包。
3、打包完成后当前文件夹下生成了一个名为"getFilterCoe"的目录,该目录下有三个文件夹和一个文件。
(1) for_redistribution目录下是一个名为MyAppInstaller_web.exe的程序,该程序引导式的安装生成的DLL和MATLAB的runtime。
(2) for_redistribution_files_only目录包含了部署所需要的文件。
(3) for_testing除了部署所需文件之外,还提供了一些源码。
(4) PackagingLog.html是打包日志。
4、创建C#项目
项目中引用"MWArray.dll"和for_redistribution_files_only目录中的"Butterworth.dll",其中"MWArray.dll"位于C:\Program Files\MATLAB\R2018a\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using Butterworth;
namespace Butterworth
{
class Program
{
static void Main(string[] args)
{
double fs = 2048;
double cutoff = 512;
FilterCoe filter = new FilterCoe();
MWArray N = 4;
MWArray wn = cutoff / (fs / 2);
MWArray SOS = filter.getFilterCoe(N, wn);
double[,] coe = (double[,])SOS.ToArray();
Console.WriteLine(coe.Length);
Console.ReadKey();
}
}
}
5、错误处理
FilterCoe filter = new FilterCoe(); 这一句可能会报下面的错误。
查看错误详细信息发现是由于找不到"mclmcrrt9_4.dll"导致的
解决方法:安装对应matlab版本的MCR(Matlab compiler runtime),重启VS即可。
MCR下载地址: https://ww2.mathworks.cn/products/compiler/matlab-runtime.html