需求描述 如何用MATLAB编写滤波器?多种滤波器如何生成一个dll?多个返回值应如何处理? 关键词 MATLAB,C#,混合编程,滤波器 软件版本:MATLABa(64bits),VisualStudio(bits),.NET4.0 应用详述 第一步:编写M函数: 做一个简单的MATLAB算法的封装,先将MATLAB的Kaiser滤波器进行封装。首先在MATLAB中创建一个.m的文件,源码如下,如图1所示: function[Y,n,Wn,beta,ftype]=Kaiser(X,f,a,dev,fs) [n,Wn,beta,ftype]=kaiserord(f,a,dev,fs); b=fir1(n,Wn,ftype,kaiser(n+1,beta)); Y=filter(b,1,X); end 图1如果我们需要生成多个函数,需要每个函数分别生成一个.m文件。 第二步:在MATLAB中使用deploytool建立混编项目 在MATLAB工作区输入命令:deploytool,然后得到下面界面,输入混编项目的名称,选择存储位置,关键的是类型那里一定要选择".NETAssembly"。如下图2所示: 图2选择“OK”之后,下一步MATLAB界面右侧会出现项目解决方案,需要添加类名称和M文件。这个类名称,就是编译完成之后C#项目中的类对象名称,此时,我们可以添加多个.m文件,如图3: 图3编译完成之后,打开“Package”选项卡,即可看到生成的dll文件。 第三步:C#中添加MATLAB的dll引用 打开VS创建一个窗体的应用程序,主要需要完成的是DLL的引用添加,将MATLAB工程(matPrj)src文件夹下的DSPMATLAB.dll和 C:\ProgramFiles\MATLAB\Ra\toolbox\dotnetbuilder\bin\win64\v2.0(前边为MATLAB的安装路径)文件夹下的MWArray.dll添加到项目引用中去,如图4所示。其中MWArray主要的作用是将MATLAB与C#中的数据进行转换交接。 图4同时需要添加以下的命名空间在系统中: //用户自行添加的命名空间 usingDSPMATLAB;//这是我们自己定义的 usingMathWorks.MATLAB.NET.Arrays;//在MWArray.dll中,最常用的 usingMathWorks.MATLAB.NET.Utility;//在MWArray.dll中,最常用的 在使用过程中,我们可以这样理解,我们之前编译好的dll就是一个类,我们首先需要将这个类进行实例化,然后每一个我们编写好的.m文件都是一个方法。然后将函数进行包装,成为C#可以调用的函数: publicstaticdouble[]Kaiser(double[]InputData,doubleFs,double[]F,double[]A,double[]Dev) { DSPClassDSPTask=newDSPClass(); MWNumericArrayInputDataMatlab=InputData; MWNumericArrayFMatlab=F; MWNumericArrayAMatlab=A; double[]Dev2DB=newdouble[Dev.Length]; for(inti=0;iDev.Length;i++) { Dev2DB[i]=Math.Pow(10,Dev[i]*(-1)/20); } MWNumericArrayDevMatlab=Dev2DB; MWArrayFsMatlab=Fs; MWArray[]KaiserResult; double[,]Result2D; double[]Result; KaiserResult=DSPTask.Kaiser(1,InputDataMatlab,FMatlab,AMatlab,DevMatlab,FsMatlab); Result2D=(double[,])KaiserResult[0].ToArray(); Result=newdouble[Result2D.Length]; Buffer.BlockCopy(Result2D,0,Result,0,Result2D.Length*sizeof(double)); returnResult; } 如果我们想读取Kaiser函数的其他返回值,比如n,我们只需做如下修改: 图5下面就是我们用Kaiser窗生成的低通滤波器: 图6注意事项 由于使用了x64的Matlab,项目属性需要设置为x64。 图7 需要在项目属性-调试中取消勾选《启用VisualStudio承载进程》,否则,VS会因尝试调试MATLAB生成的dll而报错无法运行。 图8 锐视未来,携手简仪,一起开创开源测控之路。 白癜风论坛北京最好的白癜风医院咨询
|