程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> MATLAB與VC++混合編程實現一維小波多尺度分解.

MATLAB與VC++混合編程實現一維小波多尺度分解.

編輯:關於VC++

引言

小波分析世紀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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved