首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

基于C#和MATLAB混合编程的合成频谱仪的数据处理

作者:胡宝刚 来源:电子技术与软件工程

摘 要

合成仪器通过软件替换硬件实现数据处理功能,MATLAB 具有强大的数值分析功能,而C#通过功能强大的.NET架构可以快速开发应用程序。本文详细阐述了如何通过混合编程,结合两者的优势,高效地开发合成频谱仪程序。

【关键词】合成仪器 混合编程 FFT.NET C# MATLAB

相对传统仪器,合成仪器利用几种标准硬件和大量的DSP软件和应用软件实现传统仪器的功能,采用软件无线电的思想,用软件替代硬件的功能。例如:利用下变频器和数字化仪的组合,结合不同的数据处理和显示软件模块,可以实现频谱分析仪、网络分析仪和示波器几种不同的合成仪器。

本文介绍的合成频谱仪利用软件程控数字化仪和下变频器,通过下变频器将射频信号混频为中频信号,中频信号经数字化仪得到的采样数据送往数据处理模块,对采样数据进行频谱分析和数字滤波等处理,将分析后的数据送往显示模块进行显示,从而实现频谱分析仪的功能。

由于C#基于功能强大的.NET框架,具有高效的图形用户界面和应用程序开发能力,所以本软件的框架和用户界面采用了C#来实现。但使用C#开发科学分析软件则较为困难,开发效率不高;而MATLAB作为一款目前最流行的科学运算和数据处理的工具,用其进行数据处理的编程效率极高。如果利用混合编程能充分发挥MATLAB与C#各自的优势,一方面可以继承C#良好的应用程序界面开发能力,同时可以发挥MATLAB巨大的数值运算能力优势。

1 混合编程的几种方式

目前C#与MATLAB混编技术中常用的主要有这两种方法:MATLAB Engine、MATLAB Builder NE工具。

(1)MATLAB Engine又称为“引擎”,由 MATLAB提供的COM组件,C#通过运行时可调用包装(RCW)来访问该引擎。MATLAB 作为服务器端,C#程序则看作是客户端。使用这种MATLAB Engine实现混编的方法通常能调用MATLAB全部的功能,并且能支持所有类型的数据结构。但是安装MATLAB软件是前提条件,因为这种方法不能够脱离 MATLAB的运行环境,并且执行效率也比较低。

(2)MATLAB Builder NE工具是MATLAB 7.3版本之后加入的功能,用于将M语言编写的函数或M文件编译为.NET程序集,C#程序可以直接调用程序集的类。这种方式可以完全独立于MATLAB运行环境,程序运行速率也较高。鉴于以上优点,本文采用这种方式进行混合编程。

2 合成频谱仪数据处理的实现

本文的编程环境为 Visual Studio 2010、MATLAB R2011a 和.NET3. 5,以对数字化仪采集的时域数据进行快速傅立叶变换(FFT)为例,介绍混合编程的各个步骤。

(1)在 MATLAB 环境下创建一个定义了一个进行时域到频域变换的函数的M文件。该文件包含的函数用于编译成.NET程序集中类的一个方法。文件名为”myfft .m”,函数名为”myfft”,文件内容如下:

function Y=myfft(X)

n=length(X);

f=fft(x,n);

Y=abs(f)/length(f)*2;

end

如果希望在类中包含多个函数,需要建立多个M文件,一个M文件包含一个函数。

(2)将 M 文件打包编译为.NET程序集。在MATLAB 命令窗口中键入”deploytool”,在出现的 Deployment Project窗口中选择新建工程项目,项目名称为”matlabclass.prj”,类型为”.NET Assembly”。在弹出的.NET Assembly窗口的Build标签中,添加一个类名为”MatlabFunctions”的类,在该类下添加上面定义的M文件,如果希望包含多个函数,将每个包含函数的M文件添加到该类下。点击窗口中的Settings菜单,在弹出的Project Settings窗口中设置程序集的命名空间为”MatlabClass”,设置.net框架为” 3. 5”。保存设置后,点击.NET Assembly窗口中的Build按钮将文件编译为.NET程序集,编译后的文件为matlabclass.dll,被保存在项目目录下的distrib 子目录中。

(3)在C#程序中添加对该文件的引用,并且由于MATLAB函数的输入参数和返回值都是MWArray型数组,MATLAB关于MWArray型的定义都在公共程序集MWArray.dll中,为了使用这些类型还需要添加对MWArray.dll的引用。

(4)在数据处理模块中,调用发布的.NET程序集中的类,实现从时域数据转换到频域数据,代码如下:

//创建.NET程序集中的类

MatlabClass.MatlabFunctions mat = new MatlabClass.MatlabFunctions();

//根据时域数据构造输入参数

MWNumericArray mw = new MWNumericArray(sampledata);

//调用myfft函数得到频域数据

MWArray mwret = mat.myfft(mw);

3 结束语

事实证明,将M语言编写的函数或M文件编译为.NET程序集,C#程序直接调用程序集中类的方式进行混合编程是可行的,在合成仪器开发过程中,不再需要耗费大量时间用于开发数据处理系列函数,大大提高了合成仪器开发的效率。

参考文献

[1]覃钊.基于.NET 的 MATLAB 与 Visual Basic 混合编程的研究[J].城市勘测,2012(06).

[2]范婵娇,李晓欧.C#与Matlab混合编程在BEAM绘制中的应用[J].微计算机信息,2012(08).

作者单位

中国电子科技集团公司第四十一研究所 山东省青岛市 266555