在機泵群智能監測預知維修系統平臺的開發中,需要對旋轉機械設備的運行狀態進行診斷。目前國內外普遍采用的行之有效的方法是共振解調法,又稱高頻共振法或包絡分析法。這就需要將采集的振動信號通過希爾伯特變換進行包絡。其基本原理為,對采集的振動信號進行解調處理,獲得富含故障信息的解調波,通過對此解調波的振幅和頻譜的分析,從而確定故障發生的部位。
整個的系統開發是在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
+關注
關注
185文章
2977瀏覽量
230637 -
函數
+關注
關注
3文章
4338瀏覽量
62735 -
C++
+關注
關注
22文章
2111瀏覽量
73703
發布評論請先 登錄
相關推薦
評論