在机泵群智能监测预知维修系统平台的开发中,需要对旋转机械设备的运行状态进行诊断。目前国内外普遍采用的行之有效的方法是共振解调法,又称高频共振法或包络分析法。这就需要将采集的振动信号通过希尔伯特变换进行包络。其基本原理为,对采集的振动信号进行解调处理,获得富含故障信息的解调波,通过对此解调波的振幅和频谱的分析,从而确定故障发生的部位。
整个的系统开发是在Visual C++平台上实现的,然而Visual C++在数据处理上远不如MATLAB方便、快捷,所以在编写VC++应用程序时,为了利用MATLAB的强大的数值计算和处理功能来完成信号处理,采用了MATLAB的C++数学库来进行计算。
VC++中调用MATLAB函数
MATLAB中的大多数函数都是基于MATLAB的数学库函数,若数学库中没有需要的函数,则通过编写.m文件,并调用数学库中相应的函数来实现。Matlab的数学库可以把大部分.m文件写成应用程序编译成可执行的exe程序,脱离MATLAB环境,也可以通过mcc编译为C/C++文件。
在使用MATLAB函数过程中,存在两种情况,一是数学库中有的函数,二是数学库中没有的函数。下面对这两种情况进行分别介绍。
● 调用数学库中的函数
在VC++中调用数学库中的函数可以进行直接的调用。但是由于MATLAB和C++之间的调用方式不尽相同。在MATLAB中的变量都是数组形式,因而VC++中调用都是通过MATLAB中的mwArray类型变量来进行赋值和传递变量的。一般使用的转换函数有hozcat、row2cat、ExtractScalar和ExtractData等。
在调用MATLAB数学库函数的VC++文件中加入头文件“matlab.hpp”,就可以直接使用MATLAB数学库函数,其方式与使用VC++中的函数相同,只是传递的参数类型不同。还需要对VC++环境和工程进行设置。
● 调用数学库没有的函数
MATLAB数学库中没有的函数基本上都是.m文件。调用这些函数时,要使用mcc-t-L Cpp name把.m文件编译为相应的.hpp和.cpp文件。把生成的相应.hpp和.cpp文件加入到VC++工程中,在工程中使用这个函数的文件中加入相应的头文件(.hpp文件)。
在MATLAB中大部分.m文件不是独立的,有许多一个.m文件中嵌套调用别的.m文件。在这种情况下,需要把在这个.m文件中嵌套调用的其他.m文件代码复制到这个.m文件。总之,在这个.m文件没有嵌套调用别的.m文件,仅仅只有数学库中函数和一些基本算法,是个独立的.m文件。有一点需要注意的是,将所需要的函数的在这个.m文件中的部分代码,一定要放到最前面,即在这个.m文件中可能包括多个子程序。
如果不知道这个.m文件中是否调用了别的.m文件,通过mcc编译即可被发现。没有调用其他.m文件的文件,编译后只生成以这个文件命名的.hpp和.cpp文件,而如果调用了其他.m文件,则生成三个文件,分别是以这个文件命名的.hpp、.cpp文件和嵌套调用的那个.m文件命名的.hpp文件。
如何脱离MATLAB环境运行
上面介绍了VC++中调用MATLAB函数的方法,此时应用程序需要和MATLAB环境同时运行,并且通过MATLAB的执行程序路径,调用了MATLAB的动态连接库,实际上并没有完全脱离MATLAB,这是由于mcc功能上的限制。
如何真正脱离MATLAB呢?MATLAB提供了一个发行程序包,位于<MATLAB>\extern\lib\win32 \mglinstaller.exe,执行它后将在指定目录下解压缩出bin和toolbox两个子目录,其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。重新启动之后,应用程序就可以在没有安装MATLAB的环境下运行了。
应用例程
在机泵群智能监测预知维修系统平台的开发中,利用共振解调技术对设备振动的低频冲击所激起的高频共振波进行包络检波和低通滤波,即解调,获得一个对应于低频冲击的,而又放大并展宽了的共振解调波;通过此共振解调波的幅值和频谱分析,就可以在故障特征频率及其倍频处看到清晰的谱峰,而不含故障冲击的信号缺不会在共振解调波的频谱图中出现谱峰,因此很容易确定故障发生的部位。
由上所述,在系统开发的数据处理模块中,需要对采集的振动信号进行包络分析,这一数据分析过程是通过调用MATLAB中的希尔伯特变换函数来实现。
建立的工程文件名为Test。
(1)在MATLAB的安装目录下找到hilbert.m文件和shiftdim.m文件(hilbert.m文件中嵌套调用了shiftdim),然后在shiftm.m文件中的代码复制到hilbert.m文件中,并另存为hilbert1.m文件。
(2)在MATLAB的Command Window下使用命令mcc -t -L Cpp hilbert1,生成hilbert1.hpp和hilbert1.cpp两个文件,编译完后生成的函数名就是hilbert1(即文件名)。
(3)在VC++中建立工程test,并按照2.1中进行相关设置,使用hibert1函数
#include “stdafx.h”
#include “matlab.hpp”
#include “hilbert1.hpp”
void mccDemo()
{mwArray m3,m1,m2,t1;
double *dd=new double[1024];
double *d2=new double[1024];
for(int i=1;i<=1024;i++)
t[ i]=i/1000.0;
t1=row2mat(1,1024,t);//把生成的时间序列赋给mwArray数组变量
m1=100*sin(50*t1);
m1.ExtractData(dd);
m3=hilbert1(m1,1024);//进行希尔伯特变换
m2=abs(m3); //MATLAB数学库函数,进行求模运算
m2.ExtractData(d2); //把mwArray的数据转换为double数组中
delete dd;
delete d2;
}
运行结果如图1所示,轴承振动信号的包络幅值谱图。测点的转速频率为15Hz,当轴承内圈有故障时,该轴承的采样信号的时域波形经包络分析后,对其进行相应的频谱分析,得出轴承的内圈故障特征频率。其中,对时域波形的包络分析,就是通过上述的调用过程实现的。
从图1可以看出最大幅值处的频率为88.87Hz,而理论上,用特征频率计算公式求得的故障特征频率为88.6Hz。因此,可以说明此方法是可行的。
结论
利用VC++来完成智能巡检系统的界面设计、数据管理、底层I/O等功能,而利用MATLAB来完成数据处理分析核心算法的设计,两者的有机结合降低了程序的开发难度和周期,提高了开发效率。该方法对其他领域如系统仿真、图像处理等专业领域也有很强的指导意义和推广价值。
-
matlab
+关注
关注
182文章
2963浏览量
230155 -
函数
+关注
关注
3文章
4306浏览量
62430 -
C++
+关注
关注
22文章
2104浏览量
73494
发布评论请先 登录
相关推荐
评论