まとめ:
輪列の振動信号が車輪レールノイズの影響を受けやすく、故障特徴の抽出が難しいという問題を解決するために、最適化された変分モード分解(変分モード分解、VMD)とマルチスケールサンプルエントロピーに基づく方法。エネルギー(マルチスケールサンプルエントロピーエネルギー)が提案されています。、MSEEN)の故障診断方法の指標。まず,ホイールとレールの接触関係を考慮してホイールセット振動試験ベンチを構築し,ホイールセット振動試験を通常条件,ホイール平坦傷,車軸亀裂,平坦傷亀裂カップリング故障状態で実施した。第二に,遺伝的アルゴリズムを使用して,サンプルエントロピー,相関係数および平均二乗誤差を適合度値として用いて,VMDの最適な分解数と分解中心周波数を検索した。次に、最適化された VMD に基づいて、さまざまな状態のホイールセット振動信号が分解され、固有モード関数 (固有モード関数、IMF) 成分の MSEEN インデックスが抽出されます。最後に、このインデックスはホイールセットの故障診断のために BP ニューラル ネットワークと結合され、合計認識率は 94.44% に達します。この方法は、実際の運転状態における車輪軸の故障診断の参考となります。
学習内容:
実際の運転条件における車輪軸振動信号は、車輪レールのランダム励振や環境騒音などの影響を受け、非線形・非定常特性を持っており、従来の信号処理手法では故障特徴情報を抽出することが困難です。
経験的モード分解 (EMD) に基づいて提案された変分モード分解 (VMD) は、非定常信号を異なる時間スケールの定常信号に分解することができます。VMD は堅牢で、特定のアンチノイズおよびアンチモーダル エイリアシング能力を備えています。Liu Xiuli らは、VMD とウェーブレット解析を使用して、遊星歯車の摩耗の故障情報を抽出しました。Wu Dongsheng らは、VMD を使用してベアリング信号のノイズを除去し、KPCA を通じて障害特徴情報を抽出しました。Meng Zongらは、IMF成分のエネルギー比率を計算することでVMD分解の数を決定し、軸受の弱い故障特徴を抽出した。Jiao Bolongらは、batアルゴリズムを使用して、サンプルエントロピーを指標として使用してVMDの分解数と分解中心周波数を最適化し、ローター亀裂の故障特性を強調しました。Wu Shoujun らは、波形法を使用して VMD 分解の数を決定し、
ギアボックスの故障信号を前処理しました。Hu Aijun らは、最大相関尖度に基づいて VMD の最適な分解中心周波数を取得し、軸受複合断層を分離しました。
情報エントロピーは信号の障害状態を直接反映することができ、機器の障害特性の指標としてよく使用されます。Wu Shoujun らは、ギアボックスの故障の特性指標として拡散エントロピーを使用しました。Ai Yanting 氏は、融合エントロピー距離を確立し、ローターの亀裂と摩擦によるカップリングの故障を診断しました。Li Weiらは、マルチスケールのファジィエントロピーに基づいてギアボックスの故障を診断した。Pan Zhen らは、マルチスケール順列エントロピーを固有値として使用して、逆止弁の故障を診断しました。サンプルエントロピーに基づいて提案されたマルチスケールサンプルエントロピーは、データを粗視化することにより単一スケールでのみ分析されるエントロピー値の制限を改善し、故障特性をより正確に反映することができます。
プラットフォームの写真:
このテストベンチを使用して、通常の状態、ホイールの平らな傷、車軸の亀裂、およびカップリングの故障状態におけるホイール セット システムの振動応答をテストします。車軸の亀裂深さはワイヤーカットにより得られた0.1 d(dは車軸の直径)であり、ホイール扁平傷の種類は図2に示すようにホイール表面摩耗です。結合故障が確立された場合、両者の損傷の程度は変化しません。2 つの垂直渦電流変位センサーが車輪セットの周囲に配置されています。サンプリング周波数は 5000 Hz、サンプリング時間は 10 秒、ホイールセットの回転速度は 600 r/min です。
アルゴリズム原理:
アルゴリズムの最適化:
マルチスケール サンプル エントロピーは分布故障の影響を受けにくいため、信号エネルギー (EN) インデックスも同時に導入され、時系列 xi の信号エネルギー EEN の計算式は次のようになります。ホイール セット故障
診断特徴ベクトルとしてのサンプル エントロピー エネルギー インデックス XMSEEN、XMSEEN = {x1, x2}、ここで、x1、x2 はそれぞれ IMF1 コンポーネントのマルチスケール サンプル エントロピー HMSE と信号エネルギー EEN です。
最終結果:
コード:
Vxin: forwardtszs ボタン: 571485322
公式アカウント: 転がり軸受の故障診断と寿命予測
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 20 19:24:58 2019
@author: Vinícius Rezende Carvalho
"""
import numpy as np
def VMD(f, alpha, tau, K, DC, init, tol):
"""
u,u_hat,omega = VMD(f, alpha, tau, K, DC, init, tol)
Variational mode decomposition
Python implementation by Vinícius Rezende Carvalho - vrcarva@gmail.com
code based on Dominique Zosso's MATLAB code, available at:
https://www.mathworks.com/matlabcentral/fileexchange/44765-variational-mode-decomposition
Original paper:
Dragomiretskiy, K. and Zosso, D. (2014) ‘Variational Mode Decomposition’,
IEEE Transactions on Signal Processing, 62(3), pp. 531–544. doi: 10.1109/TSP.2013.2288675.
Input and Parameters:
---------------------
f - the time domain signal (1D) to be decomposed
alpha - the balancing parameter of the data-fidelity constraint
tau - time-step of the dual ascent ( pick 0 for noise-slack )
K - the number of modes to be recovered
DC - true if the first mode is put and kept at DC (0-freq)
init - 0 = all omegas start at 0
1 = all omegas start uniformly distributed
2 = all omegas initialized randomly
tol - tolerance of convergence criterion; typically around 1e-6
Output:
-------
u - the collection of decomposed modes
u_hat - spectra of the modes
omega - estimated mode center-frequencies
"""
if len(f)%2:
f = f[:-1]
# Period and sampling frequency of input signal
fs = 1./len(f)
ltemp = len(f)//2
fMirr = np.append(np.flip(f[:ltemp],axis = 0),f)
fMirr = np.append(fMirr,np.flip(f[-ltemp:],axis = 0))
# Time Domain 0 to T (of mirrored signal)
T = len(fMirr)
t = np.arange(1,T+1)/T
# Spectral Domain discretization
freqs = t-0.5-(1/T)
# Maximum number of iterations (if not converged yet, then it won't anyway)
Niter = 500
# For future generalizations: individual alpha for each mode
Alpha = alpha*np.ones(K)
# Construct and center f_hat
f_hat = np.fft.fftshift((np.fft.fft(fMirr)))
f_hat_plus = np.copy(f_hat) #copy f_hat
f_hat_plus[:T//2] = 0
# Initialization of omega_k
omega_plus = np.zeros([Niter, K])
if init == 1:
for i in range(K):
omega_plus[0,i] = (0.5/K)*(i)
elif init == 2:
omega_plus[0,:] = np.sort(np.exp(np.log(fs) + (np.log(0.5)-np.log(fs))*np.random.rand(1,K)))
else:
omega_plus[0,:] = 0
# if DC mode imposed, set its omega to 0
if DC:
omega_plus[0,0] = 0
# start with empty dual variables
lambda_hat = np.zeros([Niter, len(freqs)], dtype = complex)
# other inits
uDiff = tol+np.spacing(1) # update step
n = 0 # loop counter
sum_uk = 0 # accumulator
# matrix keeping track of every iterant // could be discarded for mem
u_hat_plus = np.zeros([Niter, len(freqs), K],dtype=complex)
#*** Main loop for iterative updates***
while ( uDiff > tol and n < Niter-1 ): # not converged and below iterations limit
# update first mode accumulator
k = 0
sum_uk = u_hat_plus[n,:,K-1] + sum_uk - u_hat_plus[n,:,0]
# update spectrum of first mode through Wiener filter of residuals
u_hat_plus[n+1,:,k] = (f_hat_plus - sum_uk - lambda_hat[n,:]/2)/(1.+Alpha[k]*(freqs - omega_plus[n,k])**2)
# update first omega if not held at 0
if not(DC):
omega_plus[n+1,k] = np.dot(freqs[T//2:T],(abs(u_hat_plus[n+1, T//2:T, k])**2))/np.sum(abs(u_hat_plus[n+1,T//2:T,k])**2)
# update of any other mode
for k in np.arange(1,K):
#accumulator
sum_uk = u_hat_plus[n+1,:,k-1] + sum_uk - u_hat_plus[n,:,k]
# mode spectrum
u_hat_plus[n+1,:,k] = (f_hat_plus - sum_uk - lambda_hat[n,:]/2)/(1+Alpha[k]*(freqs - omega_plus[n,k])**2)
# center frequencies
omega_plus[n+1,k] = np.dot(freqs[T//2:T],(abs(u_hat_plus[n+1, T//2:T, k])**2))/np.sum(abs(u_hat_plus[n+1,T//2:T,k])**2)
# Dual ascent
lambda_hat[n+1,:] = lambda_hat[n,:] + tau*(np.sum(u_hat_plus[n+1,:,:],axis = 1) - f_hat_plus)
# loop counter
n = n+1
# converged yet?
uDiff = np.spacing(1)
for i in range(K):
uDiff = uDiff + (1/T)*np.dot((u_hat_plus[n,:,i]-u_hat_plus[n-1,:,i]),np.conj((u_hat_plus[n,:,i]-u_hat_plus[n-1,:,i])))
uDiff = np.abs(uDiff)
#Postprocessing and cleanup
#discard empty space if converged early
Niter = np.min([Niter,n])
omega = omega_plus[:Niter,:]
idxs = np.flip(np.arange(1,T//2+1),axis = 0)
# Signal reconstruction
u_hat = np.zeros([T, K],dtype = complex)
u_hat[T//2:T,:] = u_hat_plus[Niter-1,T//2:T,:]
u_hat[idxs,:] = np.conj(u_hat_plus[Niter-1,T//2:T,:])
u_hat[0,:] = np.conj(u_hat[-1,:])
u = np.zeros([K,len(t)])
for k in range(K):
u[k,:] = np.real(np.fft.ifft(np.fft.ifftshift(u_hat[:,k])))
# remove mirror part
u = u[:,T//4:3*T//4]
# recompute spectrum
u_hat = np.zeros([u.shape[1],K],dtype = complex)
for k in range(K):
u_hat[:,k]=np.fft.fftshift(np.fft.fft(u[k,:]))
return u, u_hat, omega