您的位置:首页 > 编程语言 > MATLAB

MATLAB与VC++混合编程实现一维小波多尺度分解

2009-02-14 21:50 459 查看
引言



小波分析世纪80年代开始发展成熟起来的一个数学分支,其应用领域十分广泛,并逐步成为信号分析的又一有力工具。MATLAB的小波工具箱为我们提供了小波多尺度分解函数,方便了我们对小波的使用。但是用它所编写的软件不能脱离MATLAB编程环境在Windows平台下直接运行,代码执行效率低下,运行时占较多的系统资源,不能达到某些用户的需求。

VC++是由美国Microsoft 公司开发的可视化C/C++集成编程环境,是目前功能最强大的软件开发工具之一。被广泛应用于Win32平台的基础应用程序的开发。 它具有强大的图形界面编程能力且代码执行效率高,可生成脱离VC++环境而独立运行的应用程序。可是VC++在数值处理分析和算法工具等方面不如MATLAB。

本文结合VC++和MATLAB 的各自优点,以VC++图形界面作为前台框架,MATLAB作为后台进行数值运算和数据可视化,利用组件对象模型(COM)技术作为媒介,实现了一维小波多尺度分解。

1、一维小波多尺度分解原理及其MATLAB实现

1.1 一维小波多尺度分解原理




对上诉分解结果中的近似序列

再做一次分解,可得到{

}和{

},以此类推,直到指定级数的多尺度小波分解为止,分解过程如图1示。图中s为原始信号,cd1,ca1分别为分解后第1层的细节序列和近似序列,cd2,ca2分别为分解后第2层的细节序列和近似序列,以此类推。因为这种算法分解的数据结构是塔式结构,所以这种算法也常被称为塔式算法(Pyramid Algorithm)。



1.2 一维小波多尺度分解及重构的MATLAB实现



MATLAB 小波工具箱提供了以下几个实现一维小波分解和重构的函数[3]:

[C,L] = WAVEDEC(X,N,’wname’),多尺度一维小波分解函数。其中C为分解结构变量,L为个分解结构以及原始信号长度变量,X为原始信号,N为分解层度,’wname’为小波类型。

X = WAVEREC(C,L,’wname’),多尺度一维小波重构函数。其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。

D = DETCOEF(C,L,N),一维小波变换细节序列提取函数。其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。’wname’为小波类型。

A = APPCOEF(C,L,’wname’,N),一维小波变换近似序列提取函数。其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。

Y = WRCOEF(’type’,C,L,’wname’,N),一维小波系数单支重构函数。其中,当’type’ = ’a’时重构近似序列,当’type’ = ’d’时重构高频系数;C,L,’wname’,N含义同上。

Y = UPCOEF(’type’,S,’wname’,N),一维系数的直接小波重构函数。其中’type’,’wname’,N含义同上。S为小波分解系数变量。

2、MATLAB与VC++混合编程实现一维小波多尺度分解

2.1 MATLAB与VC++混合编程的实现方法

MATLAB与VC++混合编程有下列几种方法[9]:

(1)利用MATLAB引擎。该方法的优点是能支持所有的MATLAB函数。缺点是:混合编程后的可执行程序脱离不了MATLAB的运行环境;另外一方面在调用引擎之后是按照MATLAB的执行方式进行的,由于MATLAB是解释执行代码,运行速度很慢。

(2)利用MATLAB自带的mcc编译器。从MATLAB的5.1版本开始,MATLAB 提供了自带的C++Complier─mcc,该编译器不仅能够将MATLAB的*.m文件转换为C或C++的源代码,还能产生完全脱离MATLAB运行环境的独立的可执行程序。但是MATLAB本身的资料也说明该编译器如被用来建立独立的可执行程序,则不能够调用MATLAB工具箱中的函数。另外,利用它来转换的代码可读性不太好,且不支持图形函数,不常使用。

(3)利用Matcom编译。用Matcom进行转换非常简单、方便,生成的代码可读性很好,且在C编译器编译后其代码的执行效率高。但是,这种方法也不能支持所有MATLAB工具箱函数。

(4)利用MATLAB COM Builder。MATLAB提供的COM生成器(COM Builder),为实现MATLAB独立应用程序增加了又一个新途径。她把MATLAB开发的算法作成组件,这些组件作为独立的COM对象,可以直接被其他支持COM的语言如Visual C++、Visual Basic所引用,可以生成不依赖于MATLAB环境的独立程序,因此可获得最快的运行速度,不需进行代码转换,使得编程风格一致,可读性好。

笔者在比较几种方法优缺点的基础上,经大量实验后,确定采用第四种方法实现一维小波多尺度分解。

2.2 基于COM的MATLAB与VC++混合编程实现一维小波多尺度分解



如前述,利用MATLAB小波工具想提供的实现一维小波分解和重构的函数,并结合VC++与MATLAB的各自优缺点,采用基于COM技术的VC++与MATLAB的混合编程的方法实现对探测信号突变点的定位。以下步骤得到的程序均已在VC6.0,MATLAB7.01和Windows XP环境下运行通过:

(1)在MATLAB环境下编写所需M函数文件gzqfenjie.m、myplot.m、myprocess.m、mysave.m,并利用COMBuilder工具创建COM组件[1] [2],再对生成的COM组件打包,以保持开发软件的可移植性。

(2)VC中调用上述由MATLAB产生组件,形成一个可脱离MATLAB环境运行的可执行文件(*.exe),过程如下[1] [2]:

○1建立一个名为COMwavelet 基于对话框的MFC(exe)工程。添加相应控件。现在需对Precompiled Headers 进行设置: 工程→设置→C/C++→Y分类中选择Precompiled Headers, 接着选择M自动使用与补偿页眉, 在其中填写stdafx.h, 最后确定。

○2将上面在MATLAB界面生成的Myproject_idl.h、Myproject_idl_i.c以及<MATLAB安装位置>\extern\include 下的mwcomtypes.h和mwcomutil.h文件拷贝到COMwavelet工程目录下,再加入到VC 工程中:选择工程->添加工程->文件,选择刚才拷贝到COMwavelet目录下的四个文件。此时发现工程中出现一个类Imyclass,这就是我们要操作的类。

○3在COMwaveletdlg.cpp中添加如下的头文件。

#include "component_idl.h"

#include "mwcomtypes.h"

#include "mwcomutil.h"

#include "comdef.h" //用于CString 向VARIANT数据类型的转换

○4为界面添加所需控件和相应代码,调试程序,最后形成可脱离MATLAB环境运行的可执行文件(*.exe),界面如图2示。





3、应用实例

小波分析是近年来兴起的一种新的数学分支,它在信噪分离、信号特征提取、信号频率分析、信号奇异性检测、故障诊断 、BIT虚警抑制以及语音信号处理等许多科学领域内获得了巨大的突破,得到广泛的应用。由于篇幅有限,现仅以信号奇异性检测为原理的汽轮发电机转子匝间短路故障检测为例说明VC和MATLAB混合编程实现一维小波多尺度分解的实用性,方便性。

3.1 转子绕组匝间短路信号的检测原理



汽轮发电机转子绕组匝间短路是汽轮发电机常见的故障,会造成发电机转子磁极间的电磁负荷不平衡、热不平衡,使轴系振动加大,严重时可造成机组的损坏。因此,对发电机转子绕组匝间短路故障进行检测具有重要意义。

目前,用转子动态下气隙线圈探测的方法来检测发电机转子线圈是否发生匝间短路故障是目前研究的热点,其原理是当转子绕组存在匝间短路时,就会引起磁场的不对称,破坏气隙磁场的正常分布,同时故障所在槽的槽漏磁齿谐波也会相应发生变化。在定转子气隙中安装微分探测线圈,其电势波形反映了发电机气隙磁通密度的变化,通过对微分探测线圈上的电势采样数据进行分析和处理,得到探测信号突变点,对故障槽进行定位。

3.2 小波分析在实际检测的应用

小波分析方法是一种窗口大小(即窗口面积)固定但其形状可改变,时间窗和频率窗都可改变的时频局部化分析方法。这一方法克服了傅立叶变换不能对信号进行局部化分析的严重缺点,同时具有很强的特征提取功能。小波分析在时域、频域都具有良好的局部化性质,使其尤其适用于突变(奇异)信号的处理。

为了方便起见,并根据由微分探测线圈得到的探测信号特点,我们选取半个周期的探测信号进行分析。探测信号中每一个峰值表示发电机转子的一个槽,在确定故障槽前,我们对对每个槽进行编号。将该信号存放在文件名为data112904.dat的数据文件中,利用上述笔者设计的一维小波多尺度分解界面对其进行分解和重构。操作过程如下:点击“Browse”导入数据文件data112904.dat,选取与故障信号相适应的Daubechies小波类中的db10小波,在分解层数中选择1,点“开始”按钮对数据文件进行与故障信号相适应的db10小波进行1层分解和重构。采用检索小波高频分解系数的模极大值点的方法定位故障槽。结果如图4示,三个信号从上到下依次为半个周期的微分线圈探测信号(1~16槽)、该信号的低频重构和高频重构。观察高频重构信号确定故障槽为3槽。若需要保存需保存的项,只要在如图2示界面中钩选需要保存的项,点击“保存”按钮即可。



4、结论

本文采用了基于COM的MATLAB与VC++混合编程方法实现对MATLAB一维小波分解、系数提取以及信号重构函数的调用。并用实例说明如何在脱离MATLAB运行环境的情况下,方便地运行该系统对一维信号进行小波多尺度分解与重构。实践证明,作为MathWorks公司力推的混编工具,COM Builder给VC调用MATLAB函数实现一维小波多才尺度分解带来了极大的便利,这种方法不仅实现了VC的可视化界面与MATLAB强大的数值分析和图形显示能力的有效结合,而且可以完全脱离MATLAB环境运行,有效节省了系统资源,缩短了软件开发周期。

参考文献



  [1] 王晓春, 曹鸣, 罗永新.基于COM的VC与MATLAB的混合编程技术.现代电子技术,2004年第19期总第186期:15-17.

  [2] 周灵.基于COM的VC调用MATLAB的方法及实现[J].中国科技信息.2006年第24期:131-133.

  [3] MATLAB7.0在图像处理中的应用[M].北京:机械工业出版社,2005,289-290.

  [4] 高爱乃. 基于离散小波基尺度变换下交变语音信号边缘检测方法研究[J]. 国外电子测量技术. 2005年11月第24卷第11期:9-11.

  [5] 张涛,永健,禹兴华. 基于小波分析的BIT虚警抑制方法研究[J]. 电子测量技术,2007第8期:44-47.

  [6] 汤红诚 李著信. 小波变换在故障诊断中应用[J]. 仪器仪表学报, 2003年8月第24卷第4期增刊:407-409.

  [7] 陈小玄,罗大庸,单勇腾.小波分析在转子绕组匝间短路故障诊断中的应用[J].2007年3月第11卷第2期:143-152.

  [8] 李建平.小波分析与信号处理[M].重庆:重庆出版社,1997, 193-198.

  [9]杨高波等.精通MATLAB7.0 混合编程[M].北京:电子工业出版社,2006,39-42
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: