秦 政,劉玉德
(北京工商大學材料與機械工程學院,北京 100048)
材料中局域源能量快速釋放而產生瞬態(tài)彈性波的現象稱為聲發(fā)射(acoustic emission,AE)。受聲發(fā)射信號自身特性、檢測儀器以及外界環(huán)境的影響,檢測到的聲發(fā)射電信號往往與真實信號有很大差距。因此,在聲發(fā)射技術發(fā)展中,各種可能的信號處理方法都曾在聲發(fā)射信號處理上進行嘗試。目前,在實驗和工程實踐中最常選用的聲發(fā)射信號分析方法是聲發(fā)射參數分析法,而快速準確的對聲發(fā)射信號中的持續(xù)時間、上升時間、振鈴計數、能量、RMS、ASL等特征參數進行提取和分析是聲發(fā)射信號研究的重要先決條件[1]。
目前,聲發(fā)射信號檢測系統(tǒng)通常將聲發(fā)射原始波形信號分割為離散的撞擊信號(Hit),存儲在文本文件中。后續(xù)的聲發(fā)射信號研究主要通過對這些撞擊文件分析來完成。而一段聲發(fā)射原始波形信號會被分割為成千上萬甚至幾十萬個撞擊文件。針對數量如此龐大的聲發(fā)射撞擊文件,提出使用混合編程的的方法完成對聲發(fā)射信號的存儲、顯示、處理和分析。
MATLAB是由MathWorks公司開發(fā)的一種高級編程語言,主要用于數值計算,編程和可視化。它支持包括C,C++,C#,Fortran,Java等其它編程語言進行接口連接。得益于MATLAB語言豐富的庫函數、強大的矩陣運算能力和數據繪制功能,其在聲發(fā)射信號處理方面相較于其它編程語言更加靈活,便捷。雖然MATLAB提供的一些制作交互界面的方法,如MATLAB GUI 等,能夠滿足一些簡單圖形用戶界面的需求,但在開發(fā)更加復雜的軟件方面稍顯力不從心[2-5]。
C#語言是一種現代的,通用的,面向對象的編程語言。作為由C/C++衍生出來的編程語言,C#能夠在快速開發(fā)的同時調用底層平臺的所有功能,使得編程人員可以快速編寫各種基于.NET平臺的應用程序,在編寫桌面應用程序方面有著簡單高效的特點[6,7]。同時,利用C#語言編寫的桌面應用程序可以利用ADO.NET技術同SQL Server數據庫進行數據通信,針對大量聲發(fā)射信號撞擊文件的存儲有得天獨厚的優(yōu)勢。在信號處理分析方面,C#多依賴于各種第三方數值計算庫。這些第三方類庫編寫水平參差不齊,無法同MATLAB豐富的庫函數相比擬。
C#和MATLAB在各自領域都有著巨大優(yōu)勢,通過MATLAB強大的數值計算能力進行聲發(fā)射信號處理核心算法的實現,并使用C#進行用戶界面設計并與數據庫進行通信,實現聲發(fā)射信號的可視化和數據庫存儲。二者取長補短能夠提高聲發(fā)射信號處理和分析的效率[8]。
目前,常用的MATLAB與C#混合編程的方法有以下三種:
第一種是利用.NET程序集[11]。MATLAB Complier能夠將要調用的M函數文件生成擴展名為*.dll的.NET程序集,用戶可以在C#項目中添加對該程序集的引用,調用程序集內部方法[13]。需要注意的是,如果運行程序的計算機中未安裝MATLAB軟件,還需要在計算機中安裝MATLAB組件運行環(huán)境(MATLAB Component Runtime,MCR),它可以分析用戶程序,自動實現一個運行該程序的最小環(huán)境而不需要安裝完整的MATLAB。這種方法可以將含有聲發(fā)射信號特征參數提取和分析算法的MATLAB函數編譯為適用于C#項目的.NET組件,將聲發(fā)射信號算法“融合”進C#窗體應用程序中,使得聲發(fā)射信號分析處理更加靈活,簡便。
第二種是利用MATLAB引擎(Engine)。MATLAB引擎是指MATLAB提供的一組接口函數,用戶可以通過MATLAB引擎實現對MATLAB程序的控制。這種方式將MATLAB作為計算引擎服務器,而外部應用程序作為客戶端,用戶向客戶端發(fā)出數據請求,客戶端通過MATLAB引擎向MATLAB服務器端發(fā)出數據參數和MATLAB命令,MATLAB服務器端經過計算后將計算結果經MATLAB引擎返回給客戶端[9]。在Windows系統(tǒng)中,外部應用程序與計算引擎服務器是利用IEngine接口實現的。MATLAB計算引擎應用提供的MATLAB功能最為全面,包含MATLAB的全部函數,還可以執(zhí)行MATLAB命令。這些功能有利于聲發(fā)射信號的小波分析、模態(tài)聲發(fā)射分析、人工神經網絡模式識別等方面的研究。由于調用引擎的時候需要在后臺啟動MATLAB進程,使用這種方法要求用戶必須安裝MATLAB軟件。這種情況反而使得聲發(fā)射特征參數分析變得更加繁瑣,也削弱了C#與MATLAB混合編程的優(yōu)勢。
第三種是利用COM技術[10]。COM(Component Object Model,組件對象模型),是由微軟推出的一套接口規(guī)范,通過設定不同組件之間需要遵守的標準與協(xié)議,主要用來實現跨語言、跨進程之間的模塊通信。基于COM標準,可以開發(fā)不同的COM對象,而對象以接口的形式提供服務。一般地,COM對象與客戶之間是遵循控制器/服務器工作模式的。在COM的基礎上,COM自動化服務允許一個應用程序(控制器或客戶端)控制由另一個應用程序(服務器)導出的控件對象。其核心是采用統(tǒng)一的IDispatch接口。MATLAB是一款支持COM標準的軟件,它既可以作為自動化控制器控制其它應用程序,也可以由作為自動化控制器的其它應用程序控制?;谶@一點,用戶可以在其它應用程序下運行MATLAB組件及MATLAB程序本身,這一方法類似于MATLAB引擎技術,使聲發(fā)射信號特征參數分析的變的稍顯復雜。不僅如此,還可以利用MATLAB Complier將M函數編譯為COM組件供其它應用程序調用,這一方法的效果在聲發(fā)射分析中類似于.NET組件法,但編譯的COM組件在使用時往往還需要進行注冊,并可能出現“DLL地獄”問題。
基于前一節(jié)的內容,本文著重研究.NET程序集的方法在進行聲發(fā)射信號處理分析混合編程時的應用.該方法的具體步驟包括:
1)在MATLAB中編寫可以運行的M函數。
2)利用MATLAB Complier 將M函數編譯成.NET程序集。
3)在C#項目中添加對生成的.NET程序集以及MWArray.dll的引用。
4)編寫C#代碼調用.NET程序集中的方法。
3.1.1 聲發(fā)射信號特征參數提取算法實現
以聲發(fā)射信號參數中的持續(xù)時間為例,持續(xù)時間是信號第一次越過門檻至最終降至門檻所經歷的時間間隔,用μs表示,可用于對特殊波源類型和噪聲的鑒別[12]。為實現上述功能,運行MATLAB R2018a,編寫如下M函數:
function duration=Duration(data,threshold,pregain)
beginTime=1;
while ~(beginTime>=length(data)-1‖ data(beginTime)>(10^((threshold+pregain)/20))*(10^-6))
beginTime=beginTime+1;
end
endIndex=1;
flipData=flipud(data);
while ~(endIndex>=length(flipData)-1‖ flipData(endIndex)>(10^((threshold+pregain)/20))*(10^-6))
endIndex=endIndex+1;
end
endTime=length(data)-endIndex+1;
duration=(endTime-beginTime);
if duration<0
duration=0;
end
M函數中包含三個輸入參數和一個輸出參數。三個輸入參數分別表示聲發(fā)射信號數據,設置的閾值以及前置放大增益,輸出參數表示聲發(fā)射信號的持續(xù)時間。
3.1.2 利用MATLAB Complier制作.NET組件
在MATLAB命令行窗口中運行deploytool命令,出現MATLAB Complier窗口,單擊Library Complier,出現標題為MATLAB Complier - untitled1.prj的窗口,如圖1所示。在工具欄TYPE中選擇.NET Assembly,在EXPORTED FUNCTIONS中添加編寫的M函數Duration.m。在Library information 中可以輸入工程文件的名字以及文件描述等相關信息。在Namespace中輸入方法所在的命名空間MatlabParameter.在Class Name中雙擊Class1修改類的名稱為Parameter,在Method Name中添加Duration.m作為Parameter類的方法。右擊方法名,點擊Delete可刪除已添加的方法。點擊Add Class可添加新的類。點擊Package進行編譯打包工作。編譯結束后MATLAB會在工程路徑下生成工程文件夾,在for_redistribution_files_only子文件夾中找到與命名空間名稱同名的動態(tài)鏈接庫文件MatlabParameter.dll,即所要加載的dll文件。
圖1 MATLAB Complier 工程窗口
3.1.3 在C#項目中使用.NET程序集
使用程序集前必須添加對程序集的引用,在C#項目中通過瀏覽找到Duration.dll的位置,添加至引用。因為C#與MATLAB之間的語言思路與計算方式不同, 數據間無法直接傳遞,.Net組件中運用MWArray類型作為中間類型, 使得C#中數據的類型與MATLAB中數據的類型皆可轉換至MWArry,從而達到相互轉換的目的。因此,需要添加MATLAB安裝路徑下MATLABR2018a oolboxdotnetbuilderinwin64v4.0中的MWArry.dll至引用以進行數據交換。同時添加命名空間MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility。
具體的數據類型轉換原則如下:
1)將C#數據類型轉換為MATLAB適用的數據類型,如果C#數據類型為int,double等類型,可以直接隱式轉換為MWArray類型;如果C#數據類型為數組類型,需要先將數據類型轉換為MWArrry的子類,包括MWNumericArray,MWCharArray,MWLogicalArray等類型(其中MWNumericArray對應C#中double,float,int等類型,MWCharArray對應Char,String等類型,MWLogicalArray對應Boolean類型),再將子類型賦值給父類型MWArray。
2)將MATLAB類型轉換為C#類型,由MATLAB函數返回的數據均為MWArray類型,需要先強制轉換為子類型,再轉換為C#中相應的數據類型。
在界面的計算按鈕相應事件中添加如下代碼。
∥定義三個MWNumericArray類型的變量
MWNumericArray mwPregain=pregain;
MWNumericArray mwThreshold=threshold;
MWNumericArray mwData;
MatlabParameter matlabParameter=new MatlabParameter();
DataTable dt=new DataTable();
DataTable dtResult=new DataTable();
dtResult.Columns.Add("Duration",typeof(float));
dt=parameter.GetRawData(strWhere);
∥批量計算聲發(fā)射信號數據的持續(xù)時間
for (int i=0; i < dt.Rows.Count; i++)
{
∥將以string類型存儲的聲發(fā)射信號數據轉為double類型
string[]strAWave=@dt.Rows[i][1].ToString().Split(newstring[]{ " " },
StringSplitOptions.RemoveEmptyEntries);
double[] dAWave=new double[strAWave.Length];
for (int j=0; j < strAWave.Length; j++)
{
dAWave[j]=Convert.ToDouble(strAWave[j]);
}
mwData=dAWave;
DataRow item=dtResult.NewRow();
∥計算,將MWArray類型的數據轉換為double類型
item["Duration"]=@( (MWNumericArray)matlabParameter.Duration(mwData,mwThreshold,mwPregain)).ToScalDouble();
dtResult.Rows.Add(item);
}
return dtResult;
首先,定義了三個MWNumericArrary類型的輸入變量,并將閾值和前置放大增益賦值給對應的兩個變量;其次,在調用.NET程序集中方法前創(chuàng)建包含這個方法的實例;MatlabParameter matlabParameter=new MatlabParameter();
然后,對以string類型儲存的聲發(fā)射信號數據進行處理,分割字符串,得到每個數據并轉換為double類型,再將double類型的數據存入double類型數組中,通過賦值得到MWNumericArrary類型的聲發(fā)射信號數據;接著,調用.NET程序集中的方法matlabParameter.Duration()對聲發(fā)射信號數據進行計算:
item["Duration"]=@( (MWNumericArray)matlabParameter.Duration(mwData,mwThreshold,mwPregain)).ToScalarDouble();
由于返回值為MWArray類型,需先強制轉換為MWNumericArray類型,再轉換為Double類型,讀入DataTable中以便在C#窗體中顯示。
聲發(fā)射信號的特征參數分析方法不僅要對單個特征參數進行提取和分析,還要對特征參數進行經歷分析、分布分析和關聯(lián)分析。最常用最直觀的分析方式是進行圖形分析,繪制相關的經歷分析圖、分布分析圖和關聯(lián)分析圖進行研究。
由MATLAB函數編譯的.NET組件不僅可以對矩陣進行操作,完成數值計算,還可以在MCR環(huán)境中調用MATLAB特有的句柄圖形系統(tǒng),實現對圖形窗口對象的操作。
以聲發(fā)射信號的經歷分析m函數為例。
function HisVar(varargin)
narginchk(0,3)
if nargin==0
clf;
elseif nargin==3
clf;
x=varargin{1};
y=varargin{2};
flag=varargin{3};
switch flag
case 0
bar(x,y);
xlabel(′時間/s′)
title(′振鈴統(tǒng)計′)
ylabel(′振鈴計數′)
……
end
end
bar()函數為二維長條圖繪制函數。調用該函數會調用MATLAB圖形窗口Figure并在Figure中繪制長條圖。
在C#窗體應用程序中封裝一個用于捕捉窗口句柄的類,利用Windows操作系統(tǒng)的窗口函數捕捉Figure窗體句柄,可實現將獨立的Figure窗口嵌入C#窗體中,優(yōu)化混合編程的融合性,增加用戶體驗度[14]。
運用.NET程序集的方法實現了聲發(fā)射信號分析處理軟件的開發(fā)。不僅實現對聲發(fā)射信號參數的提取,繪制聲發(fā)射信號參數的經歷分析圖,分布分析圖和關聯(lián)分析圖功能,還利用ADO.NET技術實現對聲發(fā)射信號撞擊文件以及特征參數的數據庫存儲。原始信號數據的撞擊波形文件如圖2所示。聲發(fā)射信號參數提取模塊如圖3所示,點擊“計算”可以實現對導入數據庫中的聲發(fā)射信號的參數提取,包括信號的振鈴計數,上升時間,持續(xù)時間,能量,幅值,RMS,ASL等。圖4是經歷分析模塊的界面[14-17],展示振鈴計數隨時間的變化。圖5是分布分析界面,展示了所有撞擊信號的幅度分布。圖6是關聯(lián)分析模塊界面,顯示了第四通道信號的RMS關聯(lián)圖。
圖2 聲發(fā)射信號文件
圖3 聲發(fā)射參數計算結果
圖4 經歷分析界面
圖5 分布分析界面
圖6 關聯(lián)分析界面
通過聲發(fā)射信號分析處理程序的實例,對一種基于.NET程序集的C#與MATLAB混合編程的方法進行了研究。其能夠將MATLAB函數轉換為.NET程序集后應用在C#程序中,既可以利用MATLAB強大的科學計算能力來降低聲發(fā)射信號處理算法的開發(fā)難度,又可以利用C#友好的界面設計模塊和代碼執(zhí)行能力來提高聲發(fā)射信號處理分析的效率。給出的操作過程和代碼實例均說明此方法能夠結合MATLAB和C#優(yōu)勢,高效完成聲發(fā)射信號特征參數分析的工作,具有簡單快捷,可實用性強的特點。