Visual C++、LabVIEW、LabWindows/CVI与MATLAB接口技术[zhuan]

《Visual C++、LabVIEW、LabWindows/CVI与MATLAB接口技术》
发布者:王华  发布时间:2005-12-1 14:03:00
内容摘要

Visual C++、LabVIEW、LabWindows/CVI与MATLAB

接 口 技 术

王 华 袁中凡

(四川大学制造科学与工程学院,四川 成都610065)

E-mail: [email protected]

摘要:详细阐述了当今最为流行的面向对象的可视化编程工具Visual C++、虚拟仪器设计平台LabVIEW、LabWindows/CVI与计算、绘图功能强大的MATLAB之间的接口技术,从而相互融合,更好地发挥各自的优越性。并以实例证明了接口技术的有效性和可行性。

关键词: VC++ ;LabVIEW ;LabWindows/CVI ;MATLAB

正文
文字大小:大 中 小

;混合编程

中图法分类:TP311 文献标识码: A

The Interfacing Technology between

Visual C++, Labview, LabWindows/CVI and MATLAB

Wang Hua, Yuan Zhong-fan

(College of Manufacturing Sci. and Eng. ,Sichuan Univ. ,Chengdu 610065)

Abstract: The interfacing technology between Visual C++, LabVIEW, LabWindows/CVI and MATLAB is described in this article. Visual C++ is the most popular, Object Oriented, visual programming tool, and LabVIEW, LabWindows/CVI are two kinds of most excellent developing platform for virtual instrument at present, while MATLAB has powerful functions in calculating and drawing. Only by combining Matlab with Visual C++, LabVIEW, LabWindows/CVI respectively can we make best of their own advantages. The examples can demonstrate the effectiveness and feasibility of the interfacing technology.

Keywords: VC++;LabVIEW;LabWindow/CVI;MATLAB;mixed programming

1 引言

MATLAB是MathWorks公司开发的“演算纸”式的程序设计语言,是一个跨平台的科学计算环境,其具有强大的矩阵列运算、数值分析、信号处理、系统识别、图象语音处理等功能。应用MATLAB软件可以很方便地实现许多复杂的数学算法,而这些复杂的算法在其他开发环境中需要大量代码才能实现。但MATLAB也有不足之处,例如数据输入、硬件控制等方面相对较弱,程序执行速度也相对较慢且一般需要在MATLAB环境下运行。所以在解决实际工程问题时往往将MATLAB与其他高级语言混合编程,将MATLAB强大的数学功能服务于其他开发环境。Microsoft Visual C++(以下简称为VC++)是一种面向对象的可视化的高级编程工具,它是微软公司推出的支持32位操作系统的开发工具,它提供了对Microsoft最新技术的集成,提供了一个可视化的编程模式,是Windows平台上理想的开发工具。但VC++数学计算能力不强,复杂的数学算法难以实现。LabVIEW和LabWindows/CVI是目前最有影响的虚拟仪器开发平台,他们将计算机软件设计平台与数据的采集、分析、处理及结果表达等仪器专业工具有机地结合起来,作为交互式的高效率的集成开发环境,LabVIEW和Labwindows/CVI仍然无法满足复杂的数值计算和分析需求。本文结合上述各种开发环境的优缺点,阐述了VC++, LabVIEW, LabWindows/CVI和MATLAB混合编程的接口技术,并以实例成功证明了混合编程接口技术的优越性。

2 Visual C++与MATLAB接口通信技术

VC++可开发基于MFC的以及基于Windows API的Win32程序,其特点是代码效率高,执行速度快,可开发出风格多样的界面,其不足是开发数字图象处理算法时代码编写工作量很大,如果将MATLAB强大的数值处理功能融合于VC++开发环境,将为工程项目开发提供更有力的技术支持。VC++和MATLAB的接口有四种途径:

2.1 MATLAB自带编译器

通过MATLAB自带的编译器将M文件转化为C、C++等各种不同类型的源代码,并在此基础上根据应用需要生成MEX文件、独立可执行应用程序(stand-alone applications),大大提高了程序运行速度,提高代码执行效率。尤其是独立可执行应用程序可以完全脱离MATLAB环境独立运行,大大扩展了程序的应用范围。但是,MATLAB编译器不能编译脚本M文件、有object的M文件、用input或eval语句操作工作空间变量的M文件,同时,MATLAB编译器也不能编译MATLAB的内建函数。

2.2 在VC++中调用MATLAB数学库函数

在VC++的集成环境下进行程序设计,MATLAB C++数学库最大的应用价值就在于脱离MATLAB环境运行。VC++调用MATLAB数学库和图形库有几个明显的优点:执行速度快;内存需求小;可以发布给没有MATLAB的用户使用。但它也有几个明显的缺点:不能调用图形句柄系统的函数;不能调用MATLAB工具箱中的函数;在MATLAB中的一些方法在C/C++中得不到支持。

使用MATLAB数学函数库的环境设置(假设MATLAB安装在E盘根目录下)

1)在VC++开发环境中由Tools->Options…->Directories,在Show directorie for栏中首先选择Includefiles,再在Show directorie for中加入:E:/MATLAB/extern/include 和E:/MATLAB/extern/include/cpp;然后在Show directorie for栏中选择Library files,再在Dircetories中分别加入E:/MATLAB/bin、E:/MATLAB/extern/lib。

2)在VC++开发环境中由Project->Settings…->C/C++,在C/C++的Category栏中选择Preprocessor,然后在出现的Preprocessor definition栏中加入MSVC,MSWIND。

3)设置运行时动态链接库。由VC++开发环境中Project->Settings…->C/C++,在C/C++的Category栏中选择Code Generation,然后在出现的User run-time library栏中选择Multithreaded DLL。

4)在完成1),2),3)步骤以后,就可以建立工程了。在源程序中必须加上#include “MATLAB.hpp”,但在工程编译之前要把libmx.lib, libmatlb. lib, libmatpm.lib和libmmfile.lib等文件添加到工程中,其方法是由VC++开发环境中Project->Add to Project->Files…弹出的Insert Files to Project对话框中,从目录E:/MATLAB/extern/lib中选择上述文件后按“OK”按纽即可。

2.3用Matcom软件实现VC++与MATLAB的接口通信

Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。相比Matlab自带的编译器Compiler,Matcom可生成不需MATLAB环境支持的exe文件,从而脱离MATLAB环境对MATLAB函数和过程进行有效调用。Matcom的应用主要有三个方面:1)利用Matcom生成独立执行的exe文件;2)利用Matcom生成动态链接库(DLL)文件;3)利用Matcom提供的Visual Matcom功能使Matcom工具条显示在VC++集成环境中。启动VC++6.0,由Tools->Customize,选择Add-ins and Maro Files,点击Brouse,选择文件类型为lib,在Matcom/bin下找到MVCIDE.dll文件并点击OK,这样Matcom工具条就出现在VC++集成环境下了,可在VC++中直接编译M文件。

使用Matcom时的Visual C++环境设置

1)在VC++开发环境中由Tools->Options…->Directories->Show Directories for,在Include files和Library files两项中分别加入Matcom下的lib目录,如“D:/MATCOM45/lib”。

2)在VC++开发环境中由Project->Add To Project->Files,将D:/MATCOM45/lib/v4501.lib加入工程,然后在V C++源文件的头文件处应包含matlib.h。VC++源文件中调用由M文件转换的VC++代码之前应用“initM(Matcom_VERSION):”函数来初始化类库调用,并用“exitM();”函数来结束类库调用。因此在main.cpp文件中加入下列代码:

int main()

{initM(Matcom_VERSION):

…………//转换成功的c++代码

exitM();

return 0;

}

2.4在VC++中调用MATLAB引擎engine实现接口通信

与其他三种接口方式相比,MATLAB引擎所提供的MATLAB功能支持是最全面的。通过引擎,应用程序实际上会打开一个新的MATLAB进程,可以控制它完成任何计算和绘图操作,对所有的数据结构都提供100%的支持。MATLAB引擎采用客户机+服务器模式,其实质是用Active X自动化DDE技术来实现VC++与MATLAB之间的数据通信。在具体应用程序中,VC++作为客户端负责用户接口和提出数据请求,而MATLAB则属于服务端,向客户端提供数据服务。MATLAB提供了以下几个引擎函数与客户端进行交互:

(1) engOpen:启动MATLAB引擎;

(2) engClose:关闭MATLAB引擎;

(3) engEvalString:向MATLAB发送一个字符串,让MATLAB执行;

(4) engOutputBuffer:确定存放MATLAB输出结果缓冲区域;

(5) engGetArray:从MATLAB工作空间获取一个变量;

(6) engPutArray:将mxArray结构体变量输送到MATLAB工作空间;

在VC++集成开发环境中建立和调试MATLAB引擎的基本步骤如下:

1)启动VC++6.0,建立MFC AppWizard(exe)类型工程。

2)项目工程创建完毕后,在VC++开发环境中由Tools->Options…->Directories->Show Directories for,在Include files和Library files两项中分别加入MATLAB根目录/extern/include、MATLAB根目录/extern/lib/win32/microsoft/msvc60,然后选择OK按纽。

3)在VC++开发环境中,选择下拉式菜单Project中的菜单项Settings,打开工程设置属性页,选择Link页面,在Object/Library modules编辑框中,添加文件名libmx.lib。

步骤2)只需设置一次,而步骤3)则每个工程都要单独设定,因为每个工程使用的MATLAB函数可能不一样。

经上述几个步骤,用户便完成了对VC++6.0开发环境调用ATLAB引擎函数的调用、设置以及MATLAB引擎程序的建立,经过编译、链接后便可执行。

2.5应用举例

前面主要基于VC++与MATLAB各自的优缺点,提出了将他们混合编程接口的四种途径,与其他三种方法相比较,用MATLAB引擎实现接口,节省大量的系统资源,应用程序整体性能好,引擎提供的MATLAB支持功能最全面,可充分发挥MATLAB的数值计算和图形处理的功能,对所有数据结构提供完全支持,该接口技术适于科研,提高效率。在实际工程问题中,用户可根据具体情况选择适合自己的接口技术。笔者针对每一种接口技术,都在计算机上进行了调试、验证,事实证明上面的四种VC++与MATLAB的接口技术都完全正确、有效。限于篇幅,在这只对用MATLAB引擎实现接口详细举例。

MATLAB在信号处理和图形显示方面具有VC++无法比拟的优势,在MATLAB中实现FFT算法只需要一个函数fft()就可实现,如果采用VC++将需要很长的代码,并且还需要理解FFT的原理。如果采用VC++调用MATLAB引擎函数来实现FFT算法,就大大减少了编程的工作量,提高了编程效率,可以很方便的实现信号的FFT变换。

现有模拟信号x(t)=sin(2πft)+3sin(4πft),求N点DFT的幅值谱。其主要步骤如下

1) 用VC++生成一个Engdemo的单文档MFC应用程序。

2) 根据2.4所介绍的方法设置编译环境。

3) 添加一个新的cpp文件进入工程,其文件名为matlab.cpp,代码如下:

#include stdafx.h

#include engine.h

void MatlabDraw()

{

Engine *ep;

//打开MATLAB引擎,建立与本地MATLAB的连接

if(!(ep=engOpen(NULL)))

MessageBox(NULL,不能打开MATLAB引擎,engine demo,MB_OK);

//向MATLAB传送数据,分析、运算数据

engEvalString(ep,N=1024;);

engEvalString(ep,t=0:0.001:1.023;);

engEvalString(ep,f=100;);

engEvalString(ep,x=sin(2*pi*f*t)+3*sin(2*pi*2*f*t););

//进行FFT变换,并将运算结果以图象形式显示出来返回VC++

engEvalString(ep, y=fft(x,N););

engEvalString(ep, fre=abs(y););

engEvalString(ep,subplot(2,1,1););

engEvalString(ep,plot(t,x););

engEvalString(ep,xlabel('时间'););

engEvalString(ep,subplot(2,1,2););

engEvalString(ep,plot(fre(1:600););

engEvalString(ep,xlabel('频率'););

MessageBox(NULL,please any key ,engine demo,MB_OK);

//关闭引擎

engClose(ep);

}

4) 添加一个“Engine”菜单,在“Engine”菜单下添加一个“demo”菜单项。

5) 实现“demo”菜单项的消息函数。

void CEngdemoView::OnEngineDemo()

{

MatlabDraw();

}

6) 在文件EngdemoView.cpp的头部添加函数声明:

Extern void MATLABDraw();

编译运行程序,单击“Engine”菜单上的“demo”菜单项,后台启动MATLAB,并显示如图1结果:

 

图1 时域信号及其频谱(其中上图为时域信号,下图为频谱)

3 虚拟仪器开发平台Labview、Labwindows/CVI与MATLAB接口技术

LabVIEW是目前国际上唯一的编译型图形化编程语言,其提供了丰富的数据采集、分析及存储的库函数,是一个开放型的开发环境,拥有大量与其它应用程序通信的VI库。例如LabVIEW使用自动化ActiveX、DDE和SQL,可与其它Windows应用程序集成;在对硬件的支持方面,LabVIEW集成了与GPIB、VXI、PXI、RS-232/485、PLC和插入式数字采集设备等进行数据通信的全部功能。 LabVIEW还直接支持动态数据交换(DDE)、结构化查询语言(SQL)、TCP和UDP网络协议等。Labwindows/CVI以标准C语言为基础,将计算机软件设计平台与数据的采集、分析、处理及结果表达等仪器专业工具有机地结合起来,作为交互式的集成开发环境,Labwindows/CVI提供大量与外部代码或软件进行接口的机制,如DLL(动态链接库)、DDE(共享库)、ActiveX控件等。LabWindows/CVI是熟悉C语言的开发设计人员开发检测、数据采集、信号处理、监控等虚拟仪器的理想工具。

尽管如此,但LabVIEW和Labwindows/CVI仍然无法满足复杂的数值计算和分析需求,所以在大型的测试系统和虚拟仪器开发中,Labwindows/CVI就显得力不从心,而MATLAB是一种高效率的数学计算工具,将它和LabVIEW、LabWindows/CVI混合起来编程是一种非常有效开发途径。下面就LabVIEW、LabWindows/CVI与MATLAB之间的接口技术进行详细介绍,并举例验证。

3.1 Labview与MATLAB的接口

LabVIEW可通过MATLAB Script节点与MATLAB通信

3.1.1 MATLAB Script节点

MATLAB Scrip节点使得用户既可以将在MATLAB下编写的M程序导入到流程图中,又可在流程图中根据MATLAB程序的语法编辑M程序。在LabVIEW中选择该节点的操作为:在流程图编辑窗口中由Function->Mathematics->Formula->MATLAB Scrip,将该节点添加到流程图中。打开MATLAB Scrip节点之后,可直接在其框图内编写MATLAB程序代码。如果事先已经将MATLAB程序编好,则可直接将其导入到节点中,可通过单击“Import”完成导入。还可以通过在节点边框上右击鼠标右键,在弹出式菜单中选择“Add Import”或“Add Output”增加输入、输出变量,起到在LabVIEW和MATLAB之间传递参数的作用。

3.1.2 MATLAB Script应用示例

前面详细介绍了MATLAB Script节点的使用方法,下面通过虚拟信号提取的仿真设计加以演示。

1)小波分析在信号提取中的应用

在信号的采集、传输与处理过程中,由于外界或电路内部因素的干扰,使得信号被噪声污染,所处理的噪声或高频信号中夹杂着一些有用的缓变信号,通过小波分析可将缓变的有用信号从噪声或其他高频信号中识别出来。在实际工程中,有用信号通常表现为频率较低、平稳的信号,而噪声信号或其他高频信号则表现为频率较高的信号。应用小波分析进行信号提取主要涉及到小波的分解与重构。

2)虚拟信号提取仪的设计

在本例中含有噪声的一维信号表示为:

s(i)=f(i)+e(i) ,i=0,1,2,…,n-1

其中,f(i)为真实的低频缓变信号——Sine Wave,;e(i)为噪声信号——Uniform White Noise

在该仿真过程中,Labview通过数据采集或仿真生成含有噪声或高频信号的低频缓变信号,通过虚拟仪器前面板设置信号提取处理的参数,将参数通过LabVIEW与MATLAB的接口传递给MATLAB相应的功能函数,完成信号分析与处理功能,最后将处理结果回传给LABVIEW进行显示。

MATLAB小波工具箱提供了许多小波分析功能函数,包括小波分析通用函数、小波函数、一维小波变换、二维小波变换、小波包算法等。在该仿真过程中主要应用了WEDN函数,该函数可直接对一维信号消噪,其调用格式为:

[XD,CXD,LXD]=WDEN(X,TPTR,SORH,SCAL,N,‘wname’),函数的返回值是经过对原始信号X进行消噪处理后的信号XD及其分解结构[CXD,LXD]。式中SORH指定软阈值(SORH=‘s’)或硬阈值( SORH=‘h’)的选择;TPTR指定阈值的选取规则,它有四种选择:‘rigrsure’,‘heursure’,‘sqtwolog’,‘minimaxi’,本程序中选择‘heursure’即选择首次选择的启发式变量作为阈值;N为小波分解的层数;wname指定分解时所用的小波。小波信号提取仿真过程的设计步骤如下:

1) 打开LabVIEW,在前面板开发窗口中放置二个波形显示控件(Waveform Graph),一个用于显示含噪声的波形,另一个用于显示消除噪声后的波形;放置三个数值输入控件,分别用于设置低频缓变信号频率、消噪层数(X)、采样频率。

2) 在流程图窗口中放置正弦波形发生器(Sine Wave.vi)、均匀分布的随机信号发生器(Uniform White Noise.vi),分别用来产生正弦波序列和均匀分布的随机序列,它们分别用来仿真低频缓变信号和噪声信号;添加加法器(Add)将低频缓变信号和噪声信号叠加;由Function->Mathematics->Formula操作,选择MATLAB Script放到流程图编辑框中,添加输入变量XX,X和输出变量XD,对应数据类型分别为Real Vector,Real,Real Vector。

3) 按照如图2所示的连线图,进行数据流向的连接;在MATLAB Script节点编辑框中编写M程序。

 

图2 虚拟信号仿真仪流程图

4)运行程序。单击前面板上的“低频缓变信号频率”按纽,选择仿真正弦信号的频率;单击“消噪层数”按纽,确定消噪层数;单击“采样频率”按纽,选择仿真正弦信号的采样频率。最后运行仪器VI文件,运行结果如图3所示

 

图3 运行结果

由此可以看出,运用LabVIEW和MATLAB软件的接口技术,通过小波分析成功地实现了信号提取的仿真过程。通过这个例子可以看到,基于LabVIEW 和MATLAB接口技术的虚拟仪器的开发是完全可行的。Labview是图形化仪器编程语言,其方便易用,尽管其提供了大量的信息功能处理函数,但毕竟功能有限。而MATLAB有强大的矩阵列运算、数值分析、信号处理、系统识别、图象语音处理等功能,通过接口技术在LabVIEW中调用MATLAB是开发虚拟仪器的有效途径。

3.2 LabWindows/CVI与MATLAB的接口通信

通过在LabWindows/CVI环境下建立一个数据交换ActiveX服务控件可以实现与MATLAB之间的接口通信。建立ActiveX服务的方法有两种:下面对两种方法分别介绍,读者可根据自己的实际情况而具体选择。

1.在LabWindows/CVI6.0窗口中,用户自行创建ActiveX服务函数,但这种方法要求先装MATLAB,后装Labview/CVI。其步骤如下:

1) 打开LabWindows/CVI窗口中选择Tools->Create ActiveX Controller弹出ActiveX Controller Wizard-Welcome对话框,单击Next,会在ActiveX Controller Wizard-Choose Server中列表显示出系统已安装的ActiveX Server,在列表中选择Matlab Automation Server Type Library选项。

2)单击Next后,弹出ActiveX Controller Wizard-Configure对话框,需要对目标fp文件命名并设定存放路径,假设文件名为MATLABatvx.fp,存放路径为D:/CVI6.0/Work,单击Next。

3)在弹出的ActiveX Controller Wizard-Advanced Options对话框中单击Advanced Options…,按下Check All按纽,其余按照默认方式,单击Next后,系统将自动生成MATLABatvx.fp、MATLABatvx.c、MATLABatvx.h、MATLABatvx.obj和MATLABatvx.sub 5个文件,在目录D:/CVI6.0/Work下找到如图4所示的五个图标。

 

图4 ActiveX服务函数图标

2.利用LabWindows/CAI自带的ActiveX服务函数进行接口通信

5.0以上版本的LabWindows/CAI的CVI/samples/activex/matlab中直接提供有Labview/CVI和MATLAB接口通信的ActiveX服务函数:matlabsrvr.c、matlabsrvr.h、matlabsrvr.obj、matlabsrvr.fp、matlabsrvr.sub,但是由于各个用户所装的MATLAB版本的不同,在实现混合编程时,并不能直接应用CVI/samples/activex/matlab下的ActiveX服务函数,因为不同版本MATLAB软件的Matlab Application的注册码是不同的,这就需要修改MATLAB的注册码。经笔者悉心研究,总结其方法及其步骤如下:

1)打开注册表编辑器,查到用户安装的相应版本Matlab Application的注册码,以version6.5为例,其注册码是{554F6053-79D4-11D4-B067-009027BA5F81}

2)由CVI/samples/acticex/matlab打开ActiveX服务函数matlabsrvr.c,将matlabsrvr.c中的自带的MATLAB注册码5.01版本:

GUID clsid={0x669CEC94,0x6E22,0x11CF,0xA4,0xD6,0x0,0xA0,0x24,0x58,0x3C,0x19};

改写为:

GUID clsid={0x554F6053,0x79D4,0x11D4,0xB0,0x67,0x0,0x90,0x27,0xBA,0x5f,0x81};

以上是两种方法,但得到的ActiveX服务函数的功能是一样的,即包含了LabWindows/CVI同MATLAB的混合编程所要用到的最基本的功能函数,包括:打开MATLAB函数,关闭MATLAB函数,发送矩阵函数,接受矩阵函数,运行MATLAB功能函数的函数,MATLAB窗口最大最小化函数等。为了方便开发者实现LabWindows/CVI环境下与MATLAB混合编程,NI公司还专门配置了一个更加友好的接口函数文件matlabutil.c。

在LabWindows/CVI中实现与MATLAB混合编程的具体方法:

ActiveX服务函数创建完毕后,就可实现混合编程了。启动LabWindows/CVI,选择File->New->UserInterface(*.uir)创建仪器面板文件,面板设计完毕后保存该文件,取名为Example.uir.,选择Code->Generate->All Code,编写原代码,并以名Example.c保存。经过面板设计和原代码编写后就可创建并保存工程文件了,在工程文件窗口中选择Edit->Add Files to Project,添加Example.c、Example.h、Example.uir,并添加上文提到的ActiveX服务函数,在工程文件、用户面板编辑或代码窗口中操作Run->Run Project,就可调试、运行工程文件了。由于篇幅所限,笔者在此就不举例了。相信只要熟悉LabWindows/CVI的读者都会根据上述方法很顺利的实现LabWindows/CVI环境下与MATILAB混合编程了。

4.结束语

本文系统地介绍了Visual C++、LabVIEW、LabWindows/CVI与MATLAB之间的接口技术,它们的实现极大地缩短了程序开发周期,减轻了编程工作量,提高了工作效率。在工程研究中,这种混合编程的接口技术将会有很大的应用。本文所举例程在VC++6.0、MATLAB6.5、LabVIEW6.1中调试全部通过,验证了上述接口技术的正确性。

参考文献

[1] (美) David J. Kruglinski, Socot wingo, George Shepherd.Programming Visual C++6.0技术内幕[M].北京:北京希望电子出版社,1999.

[2]MATLAB C++ Math Library Reference[M] . 2000. MathWorks Inc.

[3]NI公司.LabWindows/CVI programmer Reference Manual[M],2001.

[4]何强.MATLAB扩展编程[M].北京:清华大学出版社,2002.

[5]刘君华.基于LabIEW的虚拟仪器设计[M].北京:电子工业出版社,2003.

[6]陈亚勇.MATLAB信号处理详解[M]. 北京:人民邮电出版社,2001.

[7]陶红.MATLAB与C/Visual C++混合编程的实现[J].计算机工程与应用,2000,(10).

[8]郑力新.LabWindows/CVI与MATLAB软接口技术及应用[J].自动化仪表,2004,(4).

[9]聂开俊.LabWindows/CVI中ActiveX服务器的开发[J].计算机仿真,2004,(12).

作者简介:王 华(1981-),男,甘肃临泽人,四川大学制造科学与工程学院在读硕士研究生,主要研究方向:机械电子工程;袁中凡(1950-),男,四川大学制造科学与工程学院教授、博士生导师,主要研究方向:机械电子工程。

 

作者联系方式:四川大学制造科学与工程学院2004级研究生1班 王华

邮编:610065

E-mail: [email protected]

电话:028-85404459

手机:13194863492

你可能感兴趣的:(编程,C++,matlab,引擎,fft,preprocessor)