分解原理與實(shí)戰(zhàn):參數(shù)調(diào)優(yōu)及故障診斷全流程指南)
寫這篇東西的起因是我最近在折騰工業(yè)現(xiàn)場(chǎng)采集回來的振動(dòng)信號(hào)時(shí)發(fā)現(xiàn)圈子里聊VMD變分模態(tài)分解的人越來越多。不管你是做旋轉(zhuǎn)機(jī)械故障診斷還是拿傳感器數(shù)據(jù)做預(yù)測(cè)、分類幾乎都繞不開這個(gè)算法。但很多人卡在同一個(gè)地方看論文覺得VMD原理都能看懂自己一寫代碼就懵不知道K怎么設(shè)、懲罰因子怎么調(diào)、分解出來的模態(tài)到底拿什么用。這篇文章就是沖著解決這些問題來的我把VMD從原理到實(shí)際干活兒的完整路徑捋了一遍包括仿真信號(hào)怎么驗(yàn)證、故障特征怎么提、預(yù)測(cè)和分類任務(wù)怎么銜接中間穿插了不少我實(shí)打?qū)嵅冗^的坑。不管你是剛接觸信號(hào)處理的學(xué)生還是已經(jīng)在產(chǎn)線上做數(shù)據(jù)算法的工程師應(yīng)該都能從這里找到能直接上手的東西。很多人問過我同一個(gè)問題EMD經(jīng)驗(yàn)?zāi)B(tài)分解都已經(jīng)用了幾十年了為什么還要搞VMD答案其實(shí)很直接——EMD的數(shù)學(xué)理論底子薄。它本質(zhì)上是靠極值點(diǎn)包絡(luò)遞歸篩分的對(duì)噪聲和采樣率很敏感模態(tài)混疊是家常便飯而且分解結(jié)果沒有全局最優(yōu)的概念同一個(gè)信號(hào)你用不同端點(diǎn)條件跑一遍出來的IMF都可能不一樣。VMD換了一個(gè)完全不同的思路它把“分解”改寫成“構(gòu)造變分問題并求解”在頻域里預(yù)設(shè)K個(gè)模態(tài)每個(gè)模態(tài)被約束為圍繞一個(gè)中心頻率的窄帶成分然后通過交替方向乘子法迭代求解讓所有模態(tài)帶寬之和最小。這個(gè)過程不是經(jīng)驗(yàn)性的遞歸篩選而是目標(biāo)函數(shù)約束下的優(yōu)化問題所以結(jié)果穩(wěn)定性好得多數(shù)學(xué)解釋性也強(qiáng)很多。用大白話打個(gè)比方如果說EMD是一個(gè)手工藝人拿刻刀一塊塊把石頭多余部分剔掉那VMD就是你畫好K個(gè)格子讓信號(hào)內(nèi)容自主裝進(jìn)去算法負(fù)責(zé)把這幾個(gè)格子調(diào)整到體積總和最小、互不重疊。VMD需要你告訴它分幾格K值并且給它一個(gè)約束帶寬的“松緊度”懲罰因子alpha剩下的求解過程交給優(yōu)化器。這一點(diǎn)恰恰是VMD最容易被罵“玄學(xué)”的地方——因?yàn)镵和alpha確實(shí)是需要你自己定的定不好就分得稀碎或者混成一團(tuán)。但這篇文章后面我會(huì)專門講怎么用中心頻率觀察法和譜分離度指標(biāo)來定參這活兒有章法不是靠瞎試。VMD這個(gè)算法最早是Konstantin Dragomiretskiy和Dominique Zosso在2014年提出的論文名字叫《Variational Mode Decomposition》。到現(xiàn)在十年過去它已經(jīng)成為信號(hào)分解家族里和EMD、EEMD并駕齊驅(qū)的主流方法。它的核心優(yōu)勢(shì)總結(jié)起來就三條第一分解出來的模態(tài)是帶限信號(hào)有明確中心頻率第二對(duì)噪聲魯棒性明顯優(yōu)于EMD第三分解結(jié)果很少出現(xiàn)模態(tài)混疊前后兩次運(yùn)行結(jié)果一致這讓你在工程上做數(shù)據(jù)預(yù)處理時(shí)能拿到一套可復(fù)現(xiàn)、可落地的特征通道。1. VMD的核心機(jī)制與參數(shù)邏輯在上手VMD之前你得把它的數(shù)學(xué)機(jī)制和參數(shù)邏輯搞清楚否則后面全是瞎調(diào)。VMD的公式看著唬人一堆求和號(hào)、偏導(dǎo)號(hào)但它干的事其實(shí)可以用三句話講明白。1.1 變分框架把信號(hào)分解變成約束優(yōu)化VMD的第一步是在頻域把原始信號(hào)定義為K個(gè)模態(tài)分量的疊加每個(gè)模態(tài)是一個(gè)調(diào)幅調(diào)頻信號(hào)可以用希爾伯特變換求出對(duì)應(yīng)的解析信號(hào)然后把單邊頻譜平移到各自的基頻帶通過高斯平滑解調(diào)估計(jì)帶寬。所謂“變分”指的是它構(gòu)造了一個(gè)約束優(yōu)化問題要求所有模態(tài)分量之和等于原信號(hào)同時(shí)所有模態(tài)分量的估計(jì)帶寬之和最小。這個(gè)目標(biāo)函數(shù)長(zhǎng)這個(gè)樣子最小化每個(gè)模態(tài)的二階導(dǎo)數(shù)的L2范數(shù)平方和約束條件是模態(tài)求和等于原信號(hào)。這個(gè)線性約束下的變分問題怎么解VMD用的是增廣拉格朗日函數(shù)加上交替方向乘子法將原問題轉(zhuǎn)換成一個(gè)鞍點(diǎn)求解過程。在這個(gè)迭代過程中每個(gè)模態(tài)會(huì)在頻域里被更新中心頻率也會(huì)被重新評(píng)估。更新公式簡(jiǎn)化理解就是在頻域里對(duì)信號(hào)進(jìn)行Wiener濾波然后取濾波結(jié)果的質(zhì)心作為新一輪的中心頻率。這就能說明為什么VMD的模態(tài)往往非常干凈——它本質(zhì)上對(duì)每個(gè)模態(tài)都做了一次自適應(yīng)的帶通濾波。理解這個(gè)機(jī)制對(duì)你實(shí)際應(yīng)用有一個(gè)直接的指導(dǎo)意義VMD的模態(tài)不是像EMD那樣“篩”出來的而是在“頻帶劃分帶寬約束”框架下“優(yōu)化”出來的。所以你一定要在頻域里看VMD的結(jié)果不要只盯著時(shí)域波形。很多人拿著分解結(jié)果在時(shí)域里看半天很難看出問題但一旦把模態(tài)畫成頻譜圖每個(gè)模態(tài)的頻帶邊界、中心頻率和頻譜泄漏一目了然。1.2 K值和alpha值最關(guān)鍵的兩個(gè)旋鈕VMD參數(shù)里最關(guān)鍵的就是模態(tài)數(shù)K和懲罰因子alpha。K決定信號(hào)被分成多少條窄帶分量alpha決定每個(gè)模態(tài)帶寬的“松緊度”。這兩個(gè)參數(shù)一旦搭配失誤你后面無論接什么分類器、預(yù)測(cè)模型效果都會(huì)受到很大影響。K過小會(huì)導(dǎo)致欠分解不同頻帶的成分被硬塞進(jìn)同一個(gè)模態(tài)里出現(xiàn)模態(tài)混疊K過大會(huì)導(dǎo)致過度分解同一物理成分被切碎產(chǎn)生虛假模態(tài)尤其是高頻處會(huì)出現(xiàn)一堆沒有物理意義的殘差。alpha過小會(huì)使模態(tài)帶寬過大頻帶約束形同虛設(shè)alpha過大會(huì)讓模態(tài)帶寬被壓縮得太窄原本有物理意義的邊頻帶被過濾掉特別是齒輪箱信號(hào)很多故障特征恰恰分布在邊頻帶上alpha太大直接把這些特征抹掉了。怎么確定K和alpha一個(gè)非常經(jīng)典的方法是觀察中心頻率法你先設(shè)一個(gè)偏大的K分解完后看各個(gè)模態(tài)的中心頻率如果發(fā)現(xiàn)相鄰兩個(gè)模態(tài)的中心頻率非常接近比如差值小于該頻段帶寬的10%說明這個(gè)K造成了過分解應(yīng)該減少K。反過來如果你發(fā)現(xiàn)某個(gè)模態(tài)的頻譜明顯“鼓包”很大、內(nèi)部包含多個(gè)間隔明顯的譜峰說明這個(gè)模態(tài)是欠分解的應(yīng)該增大K。還有一種做法是構(gòu)造一個(gè)合成信號(hào)來測(cè)試——把幾個(gè)已知頻率的正弦波疊加用不同K跑一遍哪個(gè)K能把已知頻率成分準(zhǔn)確恢復(fù)出來就用哪個(gè)。這個(gè)方法在你看論文的時(shí)候很常見實(shí)操中也很有效。alpha的經(jīng)驗(yàn)值通常取2000這個(gè)值是原始論文和大量工程實(shí)踐中得出的平衡點(diǎn)。但注意默認(rèn)值不是萬能的。處理高頻振動(dòng)信號(hào)時(shí)alpha用2000往往偏大建議從500開始往上調(diào)處理趨勢(shì)項(xiàng)明顯的低頻信號(hào)比如溫度、壓力曲線alpha反而可以大一些4000到8000都行因?yàn)榈皖l成分帶寬窄高alpha有助于把趨勢(shì)和波動(dòng)干凈地分離。我自己的習(xí)慣是用中心頻率觀察法確定K再用“包絡(luò)譜故障特征頻率清晰度”來微調(diào)alpha——如果你的目標(biāo)是有明確故障特征頻率的旋轉(zhuǎn)機(jī)械就觀察故障特征頻率所在模態(tài)的能量是否集中在特征頻率及其倍頻附近是的話alpha就是合適的。1.3 噪聲容忍度與采樣率要求VMD有一個(gè)特點(diǎn)經(jīng)常被忽略它對(duì)噪聲的容忍度建立在“信號(hào)頻帶和噪聲頻帶可分”這一前提下。如果噪聲是白噪聲其頻譜是平坦的那么VMD在分解時(shí)每個(gè)模態(tài)都會(huì)被噪聲污染一點(diǎn)但如果噪聲集中在某個(gè)頻帶比如工頻干擾那么VMD能非常漂亮地把這個(gè)頻帶的干擾單獨(dú)拆成一個(gè)模態(tài)你直接把這個(gè)模態(tài)刪掉就完成了濾波。采樣率對(duì)VMD的影響也很直接。VMD的分解是在數(shù)字頻域進(jìn)行的你的采樣率決定了信號(hào)有效分析帶寬是0到fs/2。如果你關(guān)心的故障特征頻率在5000赫茲而你的采樣率只有8000赫茲那VMD在這個(gè)頻段的分解精度會(huì)大打折扣因?yàn)槟慰固仡l率只有4000赫茲。工程上做振動(dòng)故障診斷采樣率至少應(yīng)該是最高關(guān)注頻率的2.5倍以上留出足夠的頻域裕量。2. 工具選型與環(huán)境配置搞VMD你需要的代碼工具其實(shí)很輕量不用搭建重型平臺(tái)。選對(duì)工具能省掉你一大半的調(diào)試時(shí)間。下面把我用過、驗(yàn)證過的工具鏈列一下。2.1 Python vs MATLAB各有各的香學(xué)術(shù)界和工業(yè)界跑VMD主流就兩個(gè)平臺(tái)MATLAB和Python。MATLAB的優(yōu)勢(shì)在于信號(hào)處理工具箱太成熟了自帶豐富的濾波器設(shè)計(jì)和頻譜分析函數(shù)而且操作習(xí)慣對(duì)機(jī)械、電氣專業(yè)的老工程師非常友好看頻譜圖、調(diào)窗函數(shù)點(diǎn)兩下就行。但MATLAB是商業(yè)軟件授權(quán)費(fèi)不低而且在模型部署到生產(chǎn)環(huán)境時(shí)比較麻煩。Python這邊主要靠的是vmdpy這個(gè)第三方庫(kù)和PyEMD里附帶的相關(guān)功能配合scipy做濾波和頻譜分析numpy做矩陣運(yùn)算matplotlib畫圖。Python的優(yōu)勢(shì)是免費(fèi)開源、生態(tài)統(tǒng)一從數(shù)據(jù)處理到機(jī)器學(xué)習(xí)模型訓(xùn)練一條龍而且部署到產(chǎn)線嵌入式環(huán)境也更順滑。如果你是學(xué)生或者科研人員平時(shí)論文復(fù)現(xiàn)多建議直接學(xué)Python因?yàn)楝F(xiàn)在的公開代碼、數(shù)據(jù)集、競(jìng)賽baseline基本都是Python寫的。如果你是在傳統(tǒng)制造企業(yè)做設(shè)備維保團(tuán)隊(duì)里現(xiàn)有工具鏈?zhǔn)荕ATLAB而且短期不打算做在線部署那繼續(xù)用MATLAB也沒問題VMD的MATLAB實(shí)現(xiàn)網(wǎng)上有很多版本原作者的代碼也能找到。2.2 vmdpy庫(kù)安裝與驗(yàn)證在Python環(huán)境下最常用的VMD實(shí)現(xiàn)是vmdpy。安裝直接用pip就行它依賴numpy和scipy這也是你本來就該裝的。pip install vmdpy裝完之后做一個(gè)最簡(jiǎn)單的驗(yàn)證構(gòu)造一個(gè)三個(gè)正弦疊加的仿真信號(hào)頻率分別取50Hz、100Hz、300Hz看看能不能把它分成三個(gè)模態(tài)。代碼如下import numpy as np from vmdpy import VMD import matplotlib.pyplot as plt fs 1000 t np.linspace(0, 1, fs) s1 np.sin(2*np.pi*50*t) s2 0.6*np.sin(2*np.pi*100*t) s3 0.3*np.sin(2*np.pi*300*t) sig s1 s2 s3 0.05*np.random.randn(len(t)) alpha 2000 K 3 tau 0 tol 1e-7 u, u_hat, omega VMD(sig, alpha, tau, K, 0, 1, tol) for i in range(K): plt.subplot(K, 1, i1) plt.plot(t, u[i, :]) plt.show()注意VMD函數(shù)的返回值u是分解出的模態(tài)分量形狀是(K, N)每一行是一個(gè)模態(tài)u_hat是模態(tài)的頻域表示omega是迭代過程中中心頻率的收斂軌跡。第三個(gè)參數(shù)tau是噪聲容忍度一般設(shè)為0tol是迭代收斂閾值默認(rèn)1e-7就夠用。如果你跑這個(gè)代碼發(fā)現(xiàn)三個(gè)模態(tài)的波形和頻率都對(duì)得上說明環(huán)境就緒了。2.3 數(shù)據(jù)格式和輸入預(yù)處理VMD的輸入是一維時(shí)間序列無論你拿到的原始數(shù)據(jù)是振動(dòng)加速度、聲發(fā)射信號(hào)、電力負(fù)荷還是股價(jià)原則都一樣只取一維數(shù)值數(shù)組。如果你的原始數(shù)據(jù)是多通道的比如三軸加速度傳感器同時(shí)采了X、Y、Z三路信號(hào)那么請(qǐng)分別對(duì)每個(gè)通道做VMD分解不要試圖把一個(gè)三維數(shù)組直接塞進(jìn)VMD里——它處理不了也沒物理意義。輸入VMD之前一定要先做預(yù)處理。第一去均值。信號(hào)里有直流分量的話VMD會(huì)把直流單獨(dú)分出一個(gè)模態(tài)白占一個(gè)K而且直流模態(tài)的帶寬極窄對(duì)其他模態(tài)的解算有干擾。第二去除趨勢(shì)項(xiàng)。如果信號(hào)有明顯的線性漂移或多項(xiàng)式趨勢(shì)建議先用多項(xiàng)式擬合扣除否則趨勢(shì)項(xiàng)會(huì)和低頻模態(tài)糾纏。第三檢查是否有異常尖峰。傳感器偶爾會(huì)有沖擊干擾這類尖峰在頻域上表現(xiàn)為全頻帶能量抬高會(huì)直接影響模態(tài)帶寬收斂。對(duì)尖峰可以做中值濾波或閾值截?cái)嗵幚?。?dāng)然如果你的目標(biāo)就是檢測(cè)沖擊類故障那另說這類沖擊本身正是你要的故障特征。提示不要對(duì)同一個(gè)信號(hào)反復(fù)跑VMD并把每次結(jié)果都存下來。VMD雖然比EMD穩(wěn)定但在極端參數(shù)下比如K過大或alpha過小模態(tài)順序可能擺動(dòng)。真正常用的是把VMD作為一個(gè)確定性的預(yù)處理步驟參數(shù)一旦標(biāo)定結(jié)果就是可重復(fù)的。3. 仿真信號(hào)實(shí)操?gòu)姆纸獾津?yàn)證的完整流水線用仿真信號(hào)來驗(yàn)證VMD是最靠譜的第一步因?yàn)槟阒勒鎸?shí)成分是什么VMD拆得好不好一眼就能看出來。這一節(jié)把整個(gè)流程走一遍從生成信號(hào)、定參數(shù)、跑分解到用頻譜和相關(guān)系數(shù)做量化評(píng)估。3.1 設(shè)計(jì)帶噪聲的復(fù)合仿真信號(hào)真實(shí)工況下的信號(hào)很少是干干凈凈的幾個(gè)正弦波它至少包含以下成分周期性的工頻振動(dòng)、一次性的沖擊、緩慢變化的趨勢(shì)項(xiàng)、隨機(jī)噪聲以及偶爾出現(xiàn)的調(diào)制現(xiàn)象。為了盡可能模擬真實(shí)場(chǎng)景我們構(gòu)造一個(gè)復(fù)合信號(hào)fs 2000 t np.linspace(0, 1, fs) f1, f2, f3 20, 60, 200 trend 0.02 * t # 線性趨勢(shì)項(xiàng) sig_sin np.sin(2*np.pi*f1*t) 0.8*np.sin(2*np.pi*f2*t) 0.4*np.sin(2*np.pi*f3*t) impulse 0.6 * np.exp(-50 * (t-0.4)**2) * np.sin(2*np.pi*800*(t-0.4)) # 模擬沖擊 noise 0.1 * np.random.randn(len(t)) sig trend sig_sin impulse noise這個(gè)信號(hào)里既有低頻趨勢(shì)又有中頻周期振動(dòng)還有高頻衰減沖擊再加上高斯噪聲復(fù)雜度接近實(shí)戰(zhàn)。我們的預(yù)期是把趨勢(shì)項(xiàng)、20Hz、60Hz、200Hz周期成分、沖擊成分分開同時(shí)壓住噪聲。這里K至少取5我一般會(huì)先設(shè)K6留一個(gè)余量給噪聲聚合模態(tài)。3.2 中心頻率觀察法標(biāo)定K值跑完K6的分解后查看每個(gè)模態(tài)的中心頻率也就是從omega變量里取最后一列u, u_hat, omega VMD(sig, alpha, tau, K, 0, 1, tol) print(omega[-1, :])如果輸出的中心頻率序列是[3, 20, 59, 199, 800, 1100]左右恭喜分解效果理想。如果出現(xiàn)[20, 63, 64, 201,...]這種說明有兩個(gè)模態(tài)中心頻率靠太近它們?cè)跔?zhēng)搶同一個(gè)頻帶這就是過分解。這時(shí)候需要減小K。如果出現(xiàn)[20, 61, 210]這種中心頻率間距拉得很大但60Hz和200Hz之間的頻段里信號(hào)能量明顯還是糊成一團(tuán)說明欠分解了要增大K。中心頻率觀察法的核心邏輯是這樣的VMD求解過程中每個(gè)模態(tài)的中心頻率會(huì)自動(dòng)收斂到信號(hào)實(shí)際存在的頻帶中心如果兩個(gè)中心頻率最終收斂到幾乎同一個(gè)位置那么信號(hào)里根本沒有那么多獨(dú)立頻帶你就是分多了。實(shí)際標(biāo)定中我會(huì)在K4到K8之間各跑一遍每次都把omega打出來看用一組中心頻率的“間距”來選K。中心頻率間距至少應(yīng)大于各自模態(tài)帶寬的一半否則分出來的模態(tài)在頻域上是重疊的物理意義就不干凈。3.3 量化評(píng)估分解效果只看波形和中心頻率還不夠還需要量化指標(biāo)來評(píng)估。最常用的三個(gè)指標(biāo)是正交性指數(shù)模態(tài)之間兩兩相關(guān)系數(shù)、重構(gòu)誤差分解后重構(gòu)信號(hào)與原始信號(hào)的均方誤差、模態(tài)能量占比。兩兩相關(guān)系數(shù)直接用numpy.corrcoef算如果兩個(gè)模態(tài)的相關(guān)系數(shù)超過0.6說明它們之間有嚴(yán)重的互相泄漏這次分解失敗。重構(gòu)誤差控制在原始信號(hào)能量的1%以內(nèi)是正常的如果超過這個(gè)數(shù)說明VMD沒有收斂到好的解要么調(diào)高迭代次數(shù)要么檢查參數(shù)。模態(tài)能量占比有一個(gè)經(jīng)驗(yàn)規(guī)律隨機(jī)白噪聲的能量會(huì)均勻攤到各個(gè)模態(tài)里也就是說如果一個(gè)信號(hào)是純白噪聲每個(gè)模態(tài)的方差會(huì)差不多如果你的信號(hào)有明確物理成分那么前幾個(gè)模態(tài)能量之和應(yīng)該占到總能量的95%以上后面的小能量模態(tài)基本就是噪聲。我每次跑完仿真信號(hào)都會(huì)把這三個(gè)指標(biāo)打印出來看一眼??粗笜?biāo)不對(duì)就及時(shí)調(diào)參別等后面接分類模型的時(shí)候才發(fā)現(xiàn)特征早就被污染了。4. 故障診斷實(shí)戰(zhàn)基于VMD軸承包絡(luò)譜的特征提取仿真驗(yàn)證通過之后就該上真實(shí)數(shù)據(jù)了。故障診斷是VMD最經(jīng)典、用得最成熟的應(yīng)用場(chǎng)景這一節(jié)以滾動(dòng)軸承故障診斷為例把從數(shù)據(jù)準(zhǔn)備到故障模式分類的完整鏈路走一遍。4.1 軸承故障的機(jī)理與數(shù)據(jù)集準(zhǔn)備滾動(dòng)軸承的故障類型主要分為外圈故障、內(nèi)圈故障、滾動(dòng)體故障和保持架故障每一種都有對(duì)應(yīng)的特征頻率計(jì)算公式。以電機(jī)主軸軸承為例外圈故障特征頻率BPFO的計(jì)算公式是[ BPFO \frac{n}{2} \times f_r \times \left(1 - \fraczxl6ubaz{D}\cos\theta\right) ]其中n是滾動(dòng)體個(gè)數(shù)f_r是轉(zhuǎn)頻d是滾動(dòng)體直徑D是節(jié)圓直徑θ是接觸角。內(nèi)圈故障特征頻率BPFI的公式是[ BPFI \frac{n}{2} \times f_r \times \left(1 \fraczxl6ubaz{D}\cos\theta\right) ]實(shí)際訓(xùn)練分類模型時(shí)不需要每次都手算這些公式但你必須理解特征頻率的含義故障一旦發(fā)生周期性沖擊會(huì)在頻譜上產(chǎn)生以特征頻率為間隔的邊頻帶而包絡(luò)譜分析就是先對(duì)原始信號(hào)做希爾伯特變換得到包絡(luò)再對(duì)包絡(luò)做FFT這樣故障沖擊的低頻重復(fù)頻率會(huì)被凸顯出來。準(zhǔn)備數(shù)據(jù)集方面公開可用的軸承故障數(shù)據(jù)主要是凱斯西儲(chǔ)大學(xué)CWRU數(shù)據(jù)集里面包含不同負(fù)載、不同故障尺寸的內(nèi)圈、外圈、滾動(dòng)體故障數(shù)據(jù)以及正常狀態(tài)數(shù)據(jù)采樣頻率有12kHz和48kHz兩種。這份數(shù)據(jù)是學(xué)術(shù)界公認(rèn)的benchmark用來驗(yàn)證VMD分類模型的pipeline完全足夠。工業(yè)現(xiàn)場(chǎng)的私有數(shù)據(jù)也可以但要注意工況參數(shù)是否完整因?yàn)樨?fù)載、轉(zhuǎn)速不同同一故障的特征頻率也會(huì)漂移。4.2 VMD包絡(luò)譜的特征提取步驟拿到原始振動(dòng)信號(hào)后我的處理流程是這樣的第一步信號(hào)分段。一個(gè)原始樣本通常是10秒甚至更長(zhǎng)的連續(xù)記錄不能直接整段塞進(jìn)模型。我會(huì)按每段1024點(diǎn)或2048點(diǎn)進(jìn)行滑窗切分保證每一小段內(nèi)信號(hào)的平穩(wěn)性。第二步對(duì)每一段做帶通濾波通常帶通范圍根據(jù)經(jīng)驗(yàn)設(shè)在1kHz到10kHz之間把高頻故障沖擊成分保留下來濾掉軸系低頻大能量干擾。第三步VMD分解K一般取4到6alpha取800到2000這里注意別固化K要根據(jù)中心頻率觀察法確認(rèn)。第四步對(duì)分解出的每個(gè)模態(tài)分別做包絡(luò)譜計(jì)算故障特征頻率處的幅值。這一步的操作細(xì)節(jié)很考驗(yàn)經(jīng)驗(yàn)。軸承故障的沖擊成分往往落在高頻諧振帶上VMD會(huì)把高頻諧振的衰減振動(dòng)拆成一個(gè)模態(tài)然后再對(duì)這個(gè)模態(tài)取包絡(luò)譜就能清楚看到故障特征頻率BPFO、BPFI那一支。換句話說VMD在這里扮演的角色相當(dāng)于一個(gè)自適應(yīng)帶通濾波器它自動(dòng)把故障沖擊頻帶挑出來了。這個(gè)過程比直接對(duì)整個(gè)原始信號(hào)做包絡(luò)譜要干凈得多因?yàn)樵夹盘?hào)里包含轉(zhuǎn)頻及其諧波、齒輪嚙合頻率等大能量低頻成分直接做包絡(luò)譜會(huì)把特征頻率淹沒掉。代碼大致長(zhǎng)這樣# 對(duì)第i個(gè)模態(tài)求包絡(luò)譜 from scipy.signal import hilbert analytic hilbert(u[i, :]) env np.abs(analytic) spectrum np.abs(np.fft.rfft(env)) freqs np.fft.rfftfreq(len(env), d1/fs)4.3 構(gòu)造故障特征指標(biāo)而不是直接丟原始頻譜剛才提到對(duì)每個(gè)模態(tài)算完包絡(luò)譜之后不要急著把所有頻譜值拼成一個(gè)長(zhǎng)向量當(dāng)特征。直接堆頻譜向量有兩大問題一是維度太高1024點(diǎn)樣本的FFT向量有513維直接喂分類器容易過擬合二是頻譜中大量頻點(diǎn)與故障無關(guān)會(huì)增加噪聲和冗余。更工程化的做法是提取一組有物理意義的標(biāo)量特征故障特征頻率處的幅值與噪聲基底之比SNR指標(biāo)各階特征頻率幅值之和包絡(luò)譜的峰值因子時(shí)域包絡(luò)均方根/平均值分解模態(tài)的排列熵用來捕捉信號(hào)的隨機(jī)性和非線性程度精細(xì)復(fù)合多尺度熵對(duì)小樣本故障數(shù)據(jù)尤其好用能有效區(qū)分不同故障模式這組特征本身沒有代碼上的奇技淫巧但它們?cè)诜诸惼鞫说谋憩F(xiàn)要遠(yuǎn)好于直接丟頻譜向量。我在CWRU數(shù)據(jù)集上對(duì)比過拿原始頻譜向量訓(xùn)練XGBoost分類器準(zhǔn)確率大概在94%左右換用上述特征集后同樣的模型能到大概是98%以上的水平而且訓(xùn)練時(shí)間和過擬合風(fēng)險(xiǎn)都顯著下降。特征構(gòu)造完成后把正常、內(nèi)圈故障、外圈故障、滾動(dòng)體故障四類樣本的特征矩陣堆起來打上標(biāo)簽就可以進(jìn)入分類模型環(huán)節(jié)了。支持向量機(jī)SVM徑向基核函數(shù)在這個(gè)場(chǎng)景下好用因?yàn)楣收咸卣骶S度低、樣本量小、類別邊界明顯非線性。用網(wǎng)格搜索把SVM的C和gamma掃一遍交叉驗(yàn)證準(zhǔn)確率就能穩(wěn)定在95%以上。如果樣本量大到幾千條換XGBoost或隨機(jī)森林也可以但注意故障診斷場(chǎng)景下絕大多數(shù)情況是小樣本SVM和隨機(jī)森林在實(shí)踐中更穩(wěn)。4.4 Python代碼CWRU數(shù)據(jù)VMDSVM分類實(shí)操為了讓你能直接復(fù)現(xiàn)我把流程整理成一個(gè)完整的腳本框架。這個(gè)框架的思路是先讀數(shù)據(jù)、切段、VMD分解再提取特征、歸一化然后用SVM訓(xùn)練和評(píng)估。import numpy as np from vmdpy import VMD from scipy.signal import hilbert from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler def extract_features(signal_segment, fs, K5, alpha2000): u, _, _ VMD(signal_segment, alpha, 0, K, 0, 1, 1e-7) feats [] for i in range(K): analytic hilbert(u[i, :]) env np.abs(analytic) # 包絡(luò)譜峰值因子 feats.append(np.max(env) / np.sqrt(np.mean(env**2))) # 包絡(luò)譜的均方根 feats.append(np.sqrt(np.mean(env**2))) # 排列熵可以再單獨(dú)實(shí)現(xiàn) return np.array(feats) # X: 樣本矩陣 (n_samples, n_features) # y: 標(biāo)簽矩陣 X np.array([extract_features(seg, fs) for seg in segments]) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, stratifyy) scaler StandardScaler().fit(X_train) X_train scaler.transform(X_train) X_test scaler.transform(X_test) clf SVC(C10, gammascale, kernelrbf) clf.fit(X_train, y_train) print(clf.score(X_test, y_test))這個(gè)框架里的extract_features函數(shù)用了峰值因子和均方根做示例實(shí)際使用中可以替換成特征頻率幅值、排列熵、精細(xì)復(fù)合多尺度熵等。注意scipy.signal.hilbert返回的是復(fù)信號(hào)取幅值才是包絡(luò)。注意訓(xùn)練集和測(cè)試集一定要做分層抽樣stratify因?yàn)楣收项悇e樣本數(shù)可能不均衡。不做分層的話少數(shù)類樣本全部落在測(cè)試集里你的準(zhǔn)確率會(huì)出現(xiàn)虛高或虛低生產(chǎn)環(huán)境里這類問題尤其致命。5. 數(shù)據(jù)預(yù)測(cè)與信號(hào)特征分類VMD作為特征前端VMD不只服務(wù)故障診斷在時(shí)間序列預(yù)測(cè)和信號(hào)分類任務(wù)里同樣是利器。這一節(jié)聊聊VMD怎么作為特征前端給預(yù)測(cè)模型和分類模型做數(shù)據(jù)預(yù)處理。5.1 VMD在時(shí)間序列預(yù)測(cè)中的降噪與趨勢(shì)分離時(shí)間序列預(yù)測(cè)的難點(diǎn)在于信號(hào)里同時(shí)包含趨勢(shì)項(xiàng)、周期項(xiàng)、隨機(jī)波動(dòng)和噪聲一個(gè)模型很難同時(shí)刻畫出這么多不同性質(zhì)的成分。VMD可以先把序列分解成若干個(gè)模態(tài)其中低頻模態(tài)對(duì)應(yīng)趨勢(shì)項(xiàng)中頻模態(tài)對(duì)應(yīng)周期性波動(dòng)高頻模態(tài)對(duì)應(yīng)噪聲和隨機(jī)部分然后再對(duì)每個(gè)模態(tài)分別建模預(yù)測(cè)最后把各模態(tài)的預(yù)測(cè)結(jié)果加起來。這是一個(gè)經(jīng)典而且好用的分解-預(yù)測(cè)pipeline。比如說電力負(fù)荷預(yù)測(cè)負(fù)荷序列有明顯的日周期、周周期和季節(jié)趨勢(shì)還夾雜節(jié)假日等異常波動(dòng)。把序列VMD分解成K5到7個(gè)模態(tài)對(duì)每個(gè)模態(tài)分別訓(xùn)練一個(gè)LSTM或輕量級(jí)模型預(yù)測(cè)后加總和直接用單一LSTM預(yù)測(cè)原始序列相比均方誤差通常能下降20%到40%。具體操作時(shí)要注意VMD必須在滑動(dòng)窗口內(nèi)重新做不能一次性把全量歷史數(shù)據(jù)分解完再切訓(xùn)練集和測(cè)試集。因?yàn)橐坏┻M(jìn)入在線預(yù)測(cè)模式新的數(shù)據(jù)點(diǎn)不斷進(jìn)來模態(tài)的中心頻率和帶寬會(huì)隨窗口移動(dòng)而微調(diào)如果拿訓(xùn)練期固定參數(shù)的分解結(jié)果去套新數(shù)據(jù)效果會(huì)變差。我建議的方法是把預(yù)測(cè)歷史窗口固定成W個(gè)點(diǎn)每來一個(gè)新點(diǎn)就用最近W個(gè)點(diǎn)重新做一次VMD然后對(duì)最新模態(tài)賦值預(yù)測(cè)下一點(diǎn)。這樣訓(xùn)練和預(yù)測(cè)狀態(tài)一致模型才穩(wěn)。5.2 小樣本分類場(chǎng)景下的VMD特征工程分類任務(wù)里VMD的亮眼表現(xiàn)主要集中在小樣本場(chǎng)景。比如生產(chǎn)線上光學(xué)檢測(cè)設(shè)備不足想用低成本振動(dòng)傳感器加分類模型來判斷裝配質(zhì)量這種場(chǎng)景下高質(zhì)量故障樣本往往難獲得可能總共就兩三百條有效樣本。這種情況下直接用原始波形訓(xùn)練深度學(xué)習(xí)模型幾乎必然過擬合用VMD做特征壓縮再配傳統(tǒng)模型就非常合適。處理思路是對(duì)每條樣本信號(hào)做VMD分解然后從各模態(tài)中提取統(tǒng)計(jì)特征和復(fù)雜度特征形成一個(gè)新的特征矩陣。這個(gè)矩陣的維度遠(yuǎn)低于原始信號(hào)的時(shí)間長(zhǎng)度而且每個(gè)特征都有明確的物理含義。配合高斯過程回歸或者SVM這類小樣本友好的模型分類和預(yù)測(cè)的穩(wěn)定性都很好。前段時(shí)間我?guī)鸵粋€(gè)做工業(yè)機(jī)器人產(chǎn)線的朋友處理軸承故障診斷數(shù)據(jù)他給的數(shù)據(jù)集只有兩百多個(gè)樣本而且是三軸振動(dòng)、多工況混合。我先分通道做VMD再?gòu)哪B(tài)里提取頻譜特征和熵特征特征維度控制在30維以內(nèi)用隨機(jī)森林交叉驗(yàn)證準(zhǔn)確率穩(wěn)定在93%左右。同樣的數(shù)據(jù)直接喂給一維CNN反復(fù)調(diào)參也就89%。不是說CNN不行而是樣本量撐不起那么大的模型容量。5.3 語(yǔ)言模型和結(jié)構(gòu)化數(shù)據(jù)分類中VMD的適配思路VMD并不僅局限于傳感器信號(hào)。結(jié)構(gòu)化數(shù)據(jù)分類里如果你處理的是一組時(shí)間順序排列的數(shù)值特征——比如傳感器序列、序列化交易數(shù)據(jù)、時(shí)序數(shù)值型表格——同樣可以先對(duì)每條序列做VMD分解然后提取模態(tài)特征作為分類模型的輸入。注意這里不是讓你把VMD硬套到表格數(shù)據(jù)上VMD適用的前提永遠(yuǎn)是“有序的時(shí)間序列”沒有先后順序的獨(dú)立特征列不要用VMD。至于語(yǔ)言模型做分類思路就更偏Meta-learning了。你可以把某個(gè)Token序列的embedding向量序列當(dāng)成一個(gè)高維信號(hào)來分解看看哪些頻率成分對(duì)應(yīng)語(yǔ)義特征哪些對(duì)應(yīng)語(yǔ)法噪聲。這個(gè)方向上發(fā)表的研究還比較前沿實(shí)際落地難度不小而且需要你自己設(shè)計(jì)適配框架。我的建議是除非你在做純研究否則還是先理解VMD在傳感器信號(hào)里的確定性優(yōu)勢(shì)再?zèng)Q定是不是要往文本方向拓展。6. 高頻問題排查這些坑我都踩過VMD雖然上手快但工程應(yīng)用里總有一些來回出現(xiàn)的坑。這部分我按問題清單的形式整理出來每一條都是我實(shí)際調(diào)試中遇到并解決的。6.1 分解出的模態(tài)在某一段明顯不連續(xù)甚至出現(xiàn)突變這個(gè)問題最常見的原因是端點(diǎn)效應(yīng)。VMD在信號(hào)兩端做希爾伯特變換和濾波時(shí)邊界點(diǎn)附近會(huì)出現(xiàn)誤差尤其是在信號(hào)起止點(diǎn)不是自然周期邊界的時(shí)候。解法有幾個(gè)第一數(shù)據(jù)切段時(shí)取重疊段比如1024點(diǎn)一段滑窗步長(zhǎng)取512點(diǎn)讓邊界部分的誤差被后續(xù)重疊數(shù)據(jù)覆蓋第二對(duì)每段數(shù)據(jù)先做鏡像延拓或邊界對(duì)稱延拓再分解分解完再截掉延拓部分第三用Hann窗對(duì)每段數(shù)據(jù)進(jìn)行加窗預(yù)處理降低端點(diǎn)權(quán)重。我實(shí)際用下來鏡像延拓加重疊切段的組合最有效加窗會(huì)讓邊緣數(shù)據(jù)變形反而對(duì)沖擊檢測(cè)不友好。6.2 兩個(gè)模態(tài)中心頻率很接近總覺得在“搶”成分這大概率是K設(shè)置過大導(dǎo)致的過分解特別是當(dāng)信號(hào)里有較寬頻帶的沖擊或者調(diào)幅調(diào)頻成分時(shí)VMD會(huì)傾向于把一個(gè)寬頻帶切成兩個(gè)窄模態(tài)而這兩個(gè)模態(tài)的中心頻率可能相差不到10Hz。處理方法不是只調(diào)K而是結(jié)合alpha一起來增加alpha讓模態(tài)帶寬約束更緊這樣VMD更傾向于用更少的模態(tài)去覆蓋頻譜同時(shí)降低K重跑觀察中心頻率分離是否合理。如果降低K之后兩個(gè)模態(tài)合并成一個(gè)并且重構(gòu)誤差沒有明顯增大說明之前就是過分解。6.3 同樣的數(shù)據(jù)、同樣的參數(shù)兩次跑出來的結(jié)果不一樣VMD理論上應(yīng)該沒有問題但如果你在代碼里用了并行計(jì)算或調(diào)整了某些數(shù)值庫(kù)版本浮點(diǎn)累加順序可能導(dǎo)致微小差異。這類差異在絕大多數(shù)情況下不影響分類結(jié)果但如果你要做嚴(yán)格的可復(fù)現(xiàn)實(shí)驗(yàn)就把numpy的隨機(jī)種子固定并且把VMD的初始中心頻率初始化邏輯寫死。實(shí)際上VMD求解器是從中心頻率均勻覆蓋整個(gè)頻帶開始的理論上初始化是確定的出現(xiàn)隨機(jī)性往往是你代碼里其他環(huán)節(jié)引入了隨機(jī)性比如斷言的np.random沒設(shè)種子。6.4 VMD分解后重構(gòu)信號(hào)和原信號(hào)誤差太大重構(gòu)誤差過大的原因一是迭代沒收斂tol設(shè)置太松比如設(shè)成1e-3迭代沒跑滿就停了二是數(shù)據(jù)里有異常值導(dǎo)致某個(gè)模態(tài)被拉偏。建議把tol保持在1e-7左右同時(shí)檢查輸入數(shù)據(jù)是否有NaN或無窮值。還有一個(gè)比較少見的坑如果你的數(shù)據(jù)長(zhǎng)度太短比如只有128個(gè)點(diǎn)VMD的頻域分辨率不夠模態(tài)更新會(huì)出現(xiàn)數(shù)值不穩(wěn)定這種情況下先做插值或延長(zhǎng)數(shù)據(jù)段再分解。6.5 包絡(luò)譜里看不到故障特征頻率但時(shí)域里明顯有周期沖擊這說明故障沖擊的主要能量分布和諧振頻帶沒有對(duì)齊。處理方向是檢查帶通濾波范圍先用寬帶傅里葉頻譜看沖擊能量集中的頻帶再針對(duì)這個(gè)頻帶做帶通再做VMD和包絡(luò)譜。不要在不知道諧振頻帶的情況下直接對(duì)全頻帶做VMD那樣故障特征會(huì)被結(jié)構(gòu)共振的大能量掩蓋住。還有一個(gè)可能就是你選擇的模態(tài)不是包含沖擊的那個(gè)模態(tài)。VMD各模態(tài)輸出順序在默認(rèn)實(shí)現(xiàn)下是由低到高的別想當(dāng)然地認(rèn)為第一個(gè)模態(tài)就是故障模態(tài)逐模態(tài)看包絡(luò)譜或先看峭度指標(biāo)就知道該看哪一個(gè)了。6.6 小樣本下分類模型效果差先檢查特征而不只是換模型很多人一看到分類準(zhǔn)確率不行就換更強(qiáng)的模型但大多數(shù)情況下問題出在特征質(zhì)量上。做過一個(gè)測(cè)試同樣的小樣本故障數(shù)據(jù)用原始波形特征做XGBoost準(zhǔn)確率88%換成VMD模態(tài)的精細(xì)復(fù)合多尺度熵特征同樣的XGBoost準(zhǔn)確率94%。模型沒變變的只是特征。所以排查順序應(yīng)該是特征是否有區(qū)分度畫個(gè)TSNE或PCA降維可視化看類別聚類情況→ 特征是否有信息泄漏比如歸一化時(shí)用了全量數(shù)據(jù)的均值和方差→ 模型復(fù)雜度是否匹配樣本量 → 最后才是換模型參數(shù)。7. 一些補(bǔ)充的經(jīng)驗(yàn)和擴(kuò)展思路VMD這套東西用熟了之后你會(huì)發(fā)現(xiàn)它最大的價(jià)值不是某一個(gè)具體任務(wù)上的精度提升而是把信號(hào)處理這個(gè)環(huán)節(jié)變成了一個(gè)模塊化的、可復(fù)現(xiàn)的流程。把K、alpha這些參數(shù)標(biāo)定一次后續(xù)跑數(shù)據(jù)就不用再操心這在工程上能節(jié)省大量時(shí)間。擴(kuò)展方向上目前值得留意的有這幾個(gè)。第一個(gè)是同VMD與深度學(xué)習(xí)結(jié)合做端到端診斷。不是把VMD和CNN串成pipeline而是把VMD的頻域分解作為神經(jīng)網(wǎng)絡(luò)的第一層讓網(wǎng)絡(luò)在訓(xùn)練中自適應(yīng)調(diào)整模態(tài)參數(shù)這和純粹手調(diào)參數(shù)相比上限更高但它對(duì)數(shù)據(jù)和算力的要求也線性上升。第二個(gè)是基于VMD模態(tài)的重構(gòu)降噪做數(shù)據(jù)增強(qiáng)。對(duì)同一條樣本去掉高頻噪聲模態(tài)后重構(gòu)新樣本相當(dāng)于對(duì)原始樣本做了一次自適應(yīng)的去噪壓縮。把原始樣本和重構(gòu)樣本混合起來訓(xùn)練可以小幅提升魯棒性適合在樣本少的場(chǎng)景下試。第三個(gè)我之前提過的是融合多個(gè)熵指標(biāo)作為特征。排列熵、樣本熵、精細(xì)復(fù)合多尺度熵各有側(cè)重排列熵捕捉信號(hào)隨機(jī)性樣本熵捕捉復(fù)雜度精細(xì)復(fù)合多尺度熵捕捉多尺度上的自相似性。把它們從VMD分解的各個(gè)模態(tài)上提取出來拼在一起往往能拿到很穩(wěn)的小樣本分類特征組合。在實(shí)際調(diào)試中我還是建議你給自己搭一個(gè)“參數(shù)標(biāo)定記錄表”把每次實(shí)驗(yàn)的K、alpha、數(shù)據(jù)段長(zhǎng)度、特征組合、模型、準(zhǔn)確率都記下來別嫌麻煩。這個(gè)表看起來土但調(diào)試效率會(huì)翻倍。你在一個(gè)數(shù)據(jù)集上跑出90%和95%的區(qū)別往往不是模型技巧的差距而是參數(shù)搜索記錄帶來的調(diào)參節(jié)奏差距。這行的經(jīng)驗(yàn)就是這么積累出來的。