999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2021-11-17 12:04:34劉玉德
計(jì)算機(jī)仿真 2021年9期
關(guān)鍵詞:程序信號分析

秦 政,劉玉德

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

1 引言

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

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

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

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

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

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

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

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

第二種是利用MATLAB引擎(Engine)。MATLAB引擎是指MATLAB提供的一組接口函數(shù),用戶可以通過MATLAB引擎實(shí)現(xiàn)對MATLAB程序的控制。這種方式將MATLAB作為計(jì)算引擎服務(wù)器,而外部應(yīng)用程序作為客戶端,用戶向客戶端發(fā)出數(shù)據(jù)請求,客戶端通過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ā)射信號的小波分析、模態(tài)聲發(fā)射分析、人工神經(jīng)網(wǎng)絡(luò)模式識別等方面的研究。由于調(diào)用引擎的時(shí)候需要在后臺啟動MATLAB進(jìn)程,使用這種方法要求用戶必須安裝MATLAB軟件。這種情況反而使得聲發(fā)射特征參數(shù)分析變得更加繁瑣,也削弱了C#與MATLAB混合編程的優(yōu)勢。

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

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

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

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

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

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

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

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

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

以聲發(fā)射信號參數(shù)中的持續(xù)時(shí)間為例,持續(xù)時(shí)間是信號第一次越過門檻至最終降至門檻所經(jīng)歷的時(shí)間間隔,用μs表示,可用于對特殊波源類型和噪聲的鑒別[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ā)射信號數(shù)據(jù),設(shè)置的閾值以及前置放大增益,輸出參數(shù)表示聲發(fā)射信號的持續(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會在工程路徑下生成工程文件夾,在for_redistribution_files_only子文件夾中找到與命名空間名稱同名的動態(tài)鏈接庫文件MatlabParameter.dll,即所要加載的dll文件。

圖1 MATLAB Complier 工程窗口

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

使用程序集前必須添加對程序集的引用,在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對應(yīng)C#中double,float,int等類型,MWCharArray對應(yīng)Char,String等類型,MWLogicalArray對應(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ā)射信號數(shù)據(jù)的持續(xù)時(shí)間

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

{

∥將以string類型存儲的聲發(fā)射信號數(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類型的輸入變量,并將閾值和前置放大增益賦值給對應(yīng)的兩個(gè)變量;其次,在調(diào)用.NET程序集中方法前創(chuàng)建包含這個(gè)方法的實(shí)例;MatlabParameter matlabParameter=new MatlabParameter();

然后,對以string類型儲存的聲發(fā)射信號數(shù)據(jù)進(jìn)行處理,分割字符串,得到每個(gè)數(shù)據(jù)并轉(zhuǎn)換為double類型,再將double類型的數(shù)據(jù)存入double類型數(shù)組中,通過賦值得到MWNumericArrary類型的聲發(fā)射信號數(shù)據(jù);接著,調(diào)用.NET程序集中的方法matlabParameter.Duration()對聲發(fā)射信號數(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ā)射信號分析可視化中的應(yīng)用

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

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

以聲發(fā)射信號的經(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ù)為二維長條圖繪制函數(shù)。調(diào)用該函數(shù)會調(diào)用MATLAB圖形窗口Figure并在Figure中繪制長條圖。

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

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

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

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

圖5 分布分析界面

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

5 結(jié)束語

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

猜你喜歡
程序信號分析
信號
鴨綠江(2021年35期)2021-04-19 12:24:18
隱蔽失效適航要求符合性驗(yàn)證分析
完形填空二則
試論我國未決羈押程序的立法完善
電力系統(tǒng)不平衡分析
電子制作(2018年18期)2018-11-14 01:48:24
基于FPGA的多功能信號發(fā)生器的設(shè)計(jì)
電子制作(2018年11期)2018-08-04 03:25:42
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
電力系統(tǒng)及其自動化發(fā)展趨勢分析
基于LabVIEW的力加載信號采集與PID控制
主站蜘蛛池模板: 97视频精品全国在线观看| 日韩毛片免费观看| 茄子视频毛片免费观看| 亚亚洲乱码一二三四区| 国产精品手机在线播放| 中文国产成人精品久久一| 国产精品白浆在线播放| 动漫精品啪啪一区二区三区| 免费日韩在线视频| 亚洲中文无码h在线观看| 午夜福利网址| 另类综合视频| 国内丰满少妇猛烈精品播| 国产男人天堂| 国产尤物视频在线| 国产精品福利社| 日本精品一在线观看视频| 久久男人资源站| 不卡午夜视频| 亚洲Av综合日韩精品久久久| 国产成人精品高清不卡在线| 国产小视频免费观看| 亚洲AV人人澡人人双人| 日本国产精品一区久久久| 一级毛片不卡片免费观看| 97视频免费在线观看| 国产欧美日韩精品第二区| 香蕉久人久人青草青草| 日韩大乳视频中文字幕| 中文字幕无线码一区| 久久婷婷综合色一区二区| 国产精品成人一区二区| 色老头综合网| 尤物视频一区| 中文字幕免费在线视频| 毛片一级在线| 国产亚洲精久久久久久久91| 无码日韩精品91超碰| 一级毛片免费播放视频| 久草中文网| 日本人又色又爽的视频| 国产精品污污在线观看网站| 国产欧美成人不卡视频| 日韩视频福利| 亚洲日韩第九十九页| h网址在线观看| 永久免费无码日韩视频| 精品撒尿视频一区二区三区| 欧洲高清无码在线| 国产丝袜精品| 天天综合网色| 久久人妻xunleige无码| 午夜无码一区二区三区在线app| 香蕉久久国产精品免| 亚洲一区二区三区中文字幕5566| 日本一区中文字幕最新在线| 国产成人一区| 国产成人免费视频精品一区二区| 久久综合色88| yjizz视频最新网站在线| 亚洲男人的天堂网| 自慰网址在线观看| 亚洲制服中文字幕一区二区| 午夜精品久久久久久久无码软件| 国产在线自揄拍揄视频网站| 91小视频在线| 国产超薄肉色丝袜网站| 99在线观看视频免费| 福利小视频在线播放| 国产成人精品综合| 99视频在线观看免费| 国产午夜无码片在线观看网站 | 精品一区二区三区四区五区| 99久久国产自偷自偷免费一区| 亚洲无码91视频| 欧美天堂久久| 亚洲婷婷六月| 视频一本大道香蕉久在线播放 | 最新精品国偷自产在线| 免费a在线观看播放| 日韩免费视频播播| 日韩小视频在线观看|