国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

C#與MATLAB混合編程在AE信號(hào)分析中的應(yīng)用

2021-11-17 12:04劉玉德
計(jì)算機(jī)仿真 2021年9期
關(guān)鍵詞:特征參數(shù)組件應(yīng)用程序

秦 政,劉玉德

(北京工商大學(xué)材料與機(jī)械工程學(xué)院,北京 100048)

1 引言

材料中局域源能量快速釋放而產(chǎn)生瞬態(tài)彈性波的現(xiàn)象稱為聲發(fā)射(acoustic emission,AE)。受聲發(fā)射信號(hào)自身特性、檢測(cè)儀器以及外界環(huán)境的影響,檢測(cè)到的聲發(fā)射電信號(hào)往往與真實(shí)信號(hào)有很大差距。因此,在聲發(fā)射技術(shù)發(fā)展中,各種可能的信號(hào)處理方法都曾在聲發(fā)射信號(hào)處理上進(jìn)行嘗試。目前,在實(shí)驗(yàn)和工程實(shí)踐中最常選用的聲發(fā)射信號(hào)分析方法是聲發(fā)射參數(shù)分析法,而快速準(zhǔn)確的對(duì)聲發(fā)射信號(hào)中的持續(xù)時(shí)間、上升時(shí)間、振鈴計(jì)數(shù)、能量、RMS、ASL等特征參數(shù)進(jìn)行提取和分析是聲發(fā)射信號(hào)研究的重要先決條件[1]。

目前,聲發(fā)射信號(hào)檢測(cè)系統(tǒng)通常將聲發(fā)射原始波形信號(hào)分割為離散的撞擊信號(hào)(Hit),存儲(chǔ)在文本文件中。后續(xù)的聲發(fā)射信號(hào)研究主要通過對(duì)這些撞擊文件分析來完成。而一段聲發(fā)射原始波形信號(hào)會(huì)被分割為成千上萬甚至幾十萬個(gè)撞擊文件。針對(duì)數(shù)量如此龐大的聲發(fā)射撞擊文件,提出使用混合編程的的方法完成對(duì)聲發(fā)射信號(hào)的存儲(chǔ)、顯示、處理和分析。

MATLAB是由MathWorks公司開發(fā)的一種高級(jí)編程語言,主要用于數(shù)值計(jì)算,編程和可視化。它支持包括C,C++,C#,F(xiàn)ortran,Java等其它編程語言進(jìn)行接口連接。得益于MATLAB語言豐富的庫函數(shù)、強(qiáng)大的矩陣運(yùn)算能力和數(shù)據(jù)繪制功能,其在聲發(fā)射信號(hào)處理方面相較于其它編程語言更加靈活,便捷。雖然MATLAB提供的一些制作交互界面的方法,如MATLAB GUI 等,能夠滿足一些簡(jiǎn)單圖形用戶界面的需求,但在開發(fā)更加復(fù)雜的軟件方面稍顯力不從心[2-5]。

C#語言是一種現(xiàn)代的,通用的,面向?qū)ο蟮木幊陶Z言。作為由C/C++衍生出來的編程語言,C#能夠在快速開發(fā)的同時(shí)調(diào)用底層平臺(tái)的所有功能,使得編程人員可以快速編寫各種基于.NET平臺(tái)的應(yīng)用程序,在編寫桌面應(yīng)用程序方面有著簡(jiǎn)單高效的特點(diǎn)[6,7]。同時(shí),利用C#語言編寫的桌面應(yīng)用程序可以利用ADO.NET技術(shù)同SQL Server數(shù)據(jù)庫進(jìn)行數(shù)據(jù)通信,針對(duì)大量聲發(fā)射信號(hào)撞擊文件的存儲(chǔ)有得天獨(dú)厚的優(yōu)勢(shì)。在信號(hào)處理分析方面,C#多依賴于各種第三方數(shù)值計(jì)算庫。這些第三方類庫編寫水平參差不齊,無法同MATLAB豐富的庫函數(shù)相比擬。

C#和MATLAB在各自領(lǐng)域都有著巨大優(yōu)勢(shì),通過MATLAB強(qiáng)大的數(shù)值計(jì)算能力進(jìn)行聲發(fā)射信號(hào)處理核心算法的實(shí)現(xiàn),并使用C#進(jìn)行用戶界面設(shè)計(jì)并與數(shù)據(jù)庫進(jìn)行通信,實(shí)現(xiàn)聲發(fā)射信號(hào)的可視化和數(shù)據(jù)庫存儲(chǔ)。二者取長(zhǎng)補(bǔ)短能夠提高聲發(fā)射信號(hào)處理和分析的效率[8]。

2 C#與MATLAB混合編程的常用方法研究

目前,常用的MATLAB與C#混合編程的方法有以下三種:

第一種是利用.NET程序集[11]。MATLAB Complier能夠?qū)⒁{(diào)用的M函數(shù)文件生成擴(kuò)展名為*.dll的.NET程序集,用戶可以在C#項(xiàng)目中添加對(duì)該程序集的引用,調(diào)用程序集內(nèi)部方法[13]。需要注意的是,如果運(yùn)行程序的計(jì)算機(jī)中未安裝MATLAB軟件,還需要在計(jì)算機(jī)中安裝MATLAB組件運(yùn)行環(huán)境(MATLAB Component Runtime,MCR),它可以分析用戶程序,自動(dòng)實(shí)現(xiàn)一個(gè)運(yùn)行該程序的最小環(huán)境而不需要安裝完整的MATLAB。這種方法可以將含有聲發(fā)射信號(hào)特征參數(shù)提取和分析算法的MATLAB函數(shù)編譯為適用于C#項(xiàng)目的.NET組件,將聲發(fā)射信號(hào)算法“融合”進(jìn)C#窗體應(yīng)用程序中,使得聲發(fā)射信號(hào)分析處理更加靈活,簡(jiǎn)便。

第二種是利用MATLAB引擎(Engine)。MATLAB引擎是指MATLAB提供的一組接口函數(shù),用戶可以通過MATLAB引擎實(shí)現(xiàn)對(duì)MATLAB程序的控制。這種方式將MATLAB作為計(jì)算引擎服務(wù)器,而外部應(yīng)用程序作為客戶端,用戶向客戶端發(fā)出數(shù)據(jù)請(qǐng)求,客戶端通過MATLAB引擎向MATLAB服務(wù)器端發(fā)出數(shù)據(jù)參數(shù)和MATLAB命令,MATLAB服務(wù)器端經(jīng)過計(jì)算后將計(jì)算結(jié)果經(jīng)MATLAB引擎返回給客戶端[9]。在Windows系統(tǒng)中,外部應(yīng)用程序與計(jì)算引擎服務(wù)器是利用IEngine接口實(shí)現(xiàn)的。MATLAB計(jì)算引擎應(yīng)用提供的MATLAB功能最為全面,包含MATLAB的全部函數(shù),還可以執(zhí)行MATLAB命令。這些功能有利于聲發(fā)射信號(hào)的小波分析、模態(tài)聲發(fā)射分析、人工神經(jīng)網(wǎng)絡(luò)模式識(shí)別等方面的研究。由于調(diào)用引擎的時(shí)候需要在后臺(tái)啟動(dòng)MATLAB進(jìn)程,使用這種方法要求用戶必須安裝MATLAB軟件。這種情況反而使得聲發(fā)射特征參數(shù)分析變得更加繁瑣,也削弱了C#與MATLAB混合編程的優(yōu)勢(shì)。

第三種是利用COM技術(shù)[10]。COM(Component Object Model,組件對(duì)象模型),是由微軟推出的一套接口規(guī)范,通過設(shè)定不同組件之間需要遵守的標(biāo)準(zhǔn)與協(xié)議,主要用來實(shí)現(xiàn)跨語言、跨進(jìn)程之間的模塊通信?;贑OM標(biāo)準(zhǔn),可以開發(fā)不同的COM對(duì)象,而對(duì)象以接口的形式提供服務(wù)。一般地,COM對(duì)象與客戶之間是遵循控制器/服務(wù)器工作模式的。在COM的基礎(chǔ)上,COM自動(dòng)化服務(wù)允許一個(gè)應(yīng)用程序(控制器或客戶端)控制由另一個(gè)應(yīng)用程序(服務(wù)器)導(dǎo)出的控件對(duì)象。其核心是采用統(tǒng)一的IDispatch接口。MATLAB是一款支持COM標(biāo)準(zhǔn)的軟件,它既可以作為自動(dòng)化控制器控制其它應(yīng)用程序,也可以由作為自動(dòng)化控制器的其它應(yīng)用程序控制?;谶@一點(diǎn),用戶可以在其它應(yīng)用程序下運(yùn)行MATLAB組件及MATLAB程序本身,這一方法類似于MATLAB引擎技術(shù),使聲發(fā)射信號(hào)特征參數(shù)分析的變的稍顯復(fù)雜。不僅如此,還可以利用MATLAB Complier將M函數(shù)編譯為COM組件供其它應(yīng)用程序調(diào)用,這一方法的效果在聲發(fā)射分析中類似于.NET組件法,但編譯的COM組件在使用時(shí)往往還需要進(jìn)行注冊(cè),并可能出現(xiàn)“DLL地獄”問題。

3 在聲發(fā)射信號(hào)處理分析中的應(yīng)用

基于前一節(jié)的內(nèi)容,本文著重研究.NET程序集的方法在進(jìn)行聲發(fā)射信號(hào)處理分析混合編程時(shí)的應(yīng)用.該方法的具體步驟包括:

1)在MATLAB中編寫可以運(yùn)行的M函數(shù)。

2)利用MATLAB Complier 將M函數(shù)編譯成.NET程序集。

3)在C#項(xiàng)目中添加對(duì)生成的.NET程序集以及MWArray.dll的引用。

4)編寫C#代碼調(diào)用.NET程序集中的方法。

3.1 在聲發(fā)射信號(hào)特征參數(shù)分析中的應(yīng)用

3.1.1 聲發(fā)射信號(hào)特征參數(shù)提取算法實(shí)現(xiàn)

以聲發(fā)射信號(hào)參數(shù)中的持續(xù)時(shí)間為例,持續(xù)時(shí)間是信號(hào)第一次越過門檻至最終降至門檻所經(jīng)歷的時(shí)間間隔,用μs表示,可用于對(duì)特殊波源類型和噪聲的鑒別[12]。為實(shí)現(xiàn)上述功能,運(yùn)行MATLAB R2018a,編寫如下M函數(shù):

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函數(shù)中包含三個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)。三個(gè)輸入?yún)?shù)分別表示聲發(fā)射信號(hào)數(shù)據(jù),設(shè)置的閾值以及前置放大增益,輸出參數(shù)表示聲發(fā)射信號(hào)的持續(xù)時(shí)間。

3.1.2 利用MATLAB Complier制作.NET組件

在MATLAB命令行窗口中運(yùn)行deploytool命令,出現(xiàn)MATLAB Complier窗口,單擊Library Complier,出現(xiàn)標(biāo)題為MATLAB Complier - untitled1.prj的窗口,如圖1所示。在工具欄TYPE中選擇.NET Assembly,在EXPORTED FUNCTIONS中添加編寫的M函數(shù)Duration.m。在Library information 中可以輸入工程文件的名字以及文件描述等相關(guān)信息。在Namespace中輸入方法所在的命名空間MatlabParameter.在Class Name中雙擊Class1修改類的名稱為Parameter,在Method Name中添加Duration.m作為Parameter類的方法。右擊方法名,點(diǎn)擊Delete可刪除已添加的方法。點(diǎn)擊Add Class可添加新的類。點(diǎn)擊Package進(jìn)行編譯打包工作。編譯結(jié)束后MATLAB會(huì)在工程路徑下生成工程文件夾,在for_redistribution_files_only子文件夾中找到與命名空間名稱同名的動(dòng)態(tài)鏈接庫文件MatlabParameter.dll,即所要加載的dll文件。

圖1 MATLAB Complier 工程窗口

3.1.3 在C#項(xiàng)目中使用.NET程序集

使用程序集前必須添加對(duì)程序集的引用,在C#項(xiàng)目中通過瀏覽找到Duration.dll的位置,添加至引用。因?yàn)镃#與MATLAB之間的語言思路與計(jì)算方式不同, 數(shù)據(jù)間無法直接傳遞,.Net組件中運(yùn)用MWArray類型作為中間類型, 使得C#中數(shù)據(jù)的類型與MATLAB中數(shù)據(jù)的類型皆可轉(zhuǎn)換至MWArry,從而達(dá)到相互轉(zhuǎn)換的目的。因此,需要添加MATLAB安裝路徑下MATLABR2018a oolboxdotnetbuilderinwin64v4.0中的MWArry.dll至引用以進(jìn)行數(shù)據(jù)交換。同時(shí)添加命名空間MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility。

具體的數(shù)據(jù)類型轉(zhuǎn)換原則如下:

1)將C#數(shù)據(jù)類型轉(zhuǎn)換為MATLAB適用的數(shù)據(jù)類型,如果C#數(shù)據(jù)類型為int,double等類型,可以直接隱式轉(zhuǎn)換為MWArray類型;如果C#數(shù)據(jù)類型為數(shù)組類型,需要先將數(shù)據(jù)類型轉(zhuǎn)換為MWArrry的子類,包括MWNumericArray,MWCharArray,MWLogicalArray等類型(其中MWNumericArray對(duì)應(yīng)C#中double,float,int等類型,MWCharArray對(duì)應(yīng)Char,String等類型,MWLogicalArray對(duì)應(yīng)Boolean類型),再將子類型賦值給父類型MWArray。

2)將MATLAB類型轉(zhuǎn)換為C#類型,由MATLAB函數(shù)返回的數(shù)據(jù)均為MWArray類型,需要先強(qiáng)制轉(zhuǎn)換為子類型,再轉(zhuǎn)換為C#中相應(yīng)的數(shù)據(jù)類型。

在界面的計(jì)算按鈕相應(yīng)事件中添加如下代碼。

∥定義三個(gè)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);

∥批量計(jì)算聲發(fā)射信號(hào)數(shù)據(jù)的持續(xù)時(shí)間

for (int i=0; i < dt.Rows.Count; i++)

{

∥將以string類型存儲(chǔ)的聲發(fā)射信號(hào)數(shù)據(jù)轉(zhuǎn)為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();

∥計(jì)算,將MWArray類型的數(shù)據(jù)轉(zhuǎn)換為double類型

item["Duration"]=@( (MWNumericArray)matlabParameter.Duration(mwData,mwThreshold,mwPregain)).ToScalDouble();

dtResult.Rows.Add(item);

}

return dtResult;

首先,定義了三個(gè)MWNumericArrary類型的輸入變量,并將閾值和前置放大增益賦值給對(duì)應(yīng)的兩個(gè)變量;其次,在調(diào)用.NET程序集中方法前創(chuàng)建包含這個(gè)方法的實(shí)例;MatlabParameter matlabParameter=new MatlabParameter();

然后,對(duì)以string類型儲(chǔ)存的聲發(fā)射信號(hào)數(shù)據(jù)進(jìn)行處理,分割字符串,得到每個(gè)數(shù)據(jù)并轉(zhuǎn)換為double類型,再將double類型的數(shù)據(jù)存入double類型數(shù)組中,通過賦值得到MWNumericArrary類型的聲發(fā)射信號(hào)數(shù)據(jù);接著,調(diào)用.NET程序集中的方法matlabParameter.Duration()對(duì)聲發(fā)射信號(hào)數(shù)據(jù)進(jìn)行計(jì)算:

item["Duration"]=@( (MWNumericArray)matlabParameter.Duration(mwData,mwThreshold,mwPregain)).ToScalarDouble();

由于返回值為MWArray類型,需先強(qiáng)制轉(zhuǎn)換為MWNumericArray類型,再轉(zhuǎn)換為Double類型,讀入DataTable中以便在C#窗體中顯示。

3.2 在聲發(fā)射信號(hào)分析可視化中的應(yīng)用

聲發(fā)射信號(hào)的特征參數(shù)分析方法不僅要對(duì)單個(gè)特征參數(shù)進(jìn)行提取和分析,還要對(duì)特征參數(shù)進(jìn)行經(jīng)歷分析、分布分析和關(guān)聯(lián)分析。最常用最直觀的分析方式是進(jìn)行圖形分析,繪制相關(guān)的經(jīng)歷分析圖、分布分析圖和關(guān)聯(lián)分析圖進(jìn)行研究。

由MATLAB函數(shù)編譯的.NET組件不僅可以對(duì)矩陣進(jìn)行操作,完成數(shù)值計(jì)算,還可以在MCR環(huán)境中調(diào)用MATLAB特有的句柄圖形系統(tǒng),實(shí)現(xiàn)對(duì)圖形窗口對(duì)象的操作。

以聲發(fā)射信號(hào)的經(jīng)歷分析m函數(shù)為例。

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(′時(shí)間/s′)

title(′振鈴統(tǒng)計(jì)′)

ylabel(′振鈴計(jì)數(shù)′)

……

end

end

bar()函數(shù)為二維長(zhǎng)條圖繪制函數(shù)。調(diào)用該函數(shù)會(huì)調(diào)用MATLAB圖形窗口Figure并在Figure中繪制長(zhǎng)條圖。

在C#窗體應(yīng)用程序中封裝一個(gè)用于捕捉窗口句柄的類,利用Windows操作系統(tǒng)的窗口函數(shù)捕捉Figure窗體句柄,可實(shí)現(xiàn)將獨(dú)立的Figure窗口嵌入C#窗體中,優(yōu)化混合編程的融合性,增加用戶體驗(yàn)度[14]。

4 軟件實(shí)例

運(yùn)用.NET程序集的方法實(shí)現(xiàn)了聲發(fā)射信號(hào)分析處理軟件的開發(fā)。不僅實(shí)現(xiàn)對(duì)聲發(fā)射信號(hào)參數(shù)的提取,繪制聲發(fā)射信號(hào)參數(shù)的經(jīng)歷分析圖,分布分析圖和關(guān)聯(lián)分析圖功能,還利用ADO.NET技術(shù)實(shí)現(xiàn)對(duì)聲發(fā)射信號(hào)撞擊文件以及特征參數(shù)的數(shù)據(jù)庫存儲(chǔ)。原始信號(hào)數(shù)據(jù)的撞擊波形文件如圖2所示。聲發(fā)射信號(hào)參數(shù)提取模塊如圖3所示,點(diǎn)擊“計(jì)算”可以實(shí)現(xiàn)對(duì)導(dǎo)入數(shù)據(jù)庫中的聲發(fā)射信號(hào)的參數(shù)提取,包括信號(hào)的振鈴計(jì)數(shù),上升時(shí)間,持續(xù)時(shí)間,能量,幅值,RMS,ASL等。圖4是經(jīng)歷分析模塊的界面[14-17],展示振鈴計(jì)數(shù)隨時(shí)間的變化。圖5是分布分析界面,展示了所有撞擊信號(hào)的幅度分布。圖6是關(guān)聯(lián)分析模塊界面,顯示了第四通道信號(hào)的RMS關(guān)聯(lián)圖。

圖2 聲發(fā)射信號(hào)文件

圖3 聲發(fā)射參數(shù)計(jì)算結(jié)果

圖4 經(jīng)歷分析界面

圖5 分布分析界面

圖6 關(guān)聯(lián)分析界面

5 結(jié)束語

通過聲發(fā)射信號(hào)分析處理程序的實(shí)例,對(duì)一種基于.NET程序集的C#與MATLAB混合編程的方法進(jìn)行了研究。其能夠?qū)ATLAB函數(shù)轉(zhuǎn)換為.NET程序集后應(yīng)用在C#程序中,既可以利用MATLAB強(qiáng)大的科學(xué)計(jì)算能力來降低聲發(fā)射信號(hào)處理算法的開發(fā)難度,又可以利用C#友好的界面設(shè)計(jì)模塊和代碼執(zhí)行能力來提高聲發(fā)射信號(hào)處理分析的效率。給出的操作過程和代碼實(shí)例均說明此方法能夠結(jié)合MATLAB和C#優(yōu)勢(shì),高效完成聲發(fā)射信號(hào)特征參數(shù)分析的工作,具有簡(jiǎn)單快捷,可實(shí)用性強(qiáng)的特點(diǎn)。

猜你喜歡
特征參數(shù)組件應(yīng)用程序
Android系統(tǒng)上移動(dòng)組件化應(yīng)用框架設(shè)計(jì)
基于視頻圖像序列的船用雷達(dá)目標(biāo)檢測(cè)和目標(biāo)特征參數(shù)提取
創(chuàng)建Vue組件npm包實(shí)戰(zhàn)分析
智能機(jī)械臂
艦載雷達(dá)TR組件沖擊計(jì)算方法分析
刪除Win10中自帶的應(yīng)用程序
谷歌禁止加密貨幣應(yīng)用程序
說話人識(shí)別特征參數(shù)MFCC的提取與分析
民用飛機(jī)預(yù)測(cè)與健康管理技術(shù)與系統(tǒng)特征參數(shù)研究
三星電子將開設(shè)應(yīng)用程序下載商店