分解演進(jìn)與Python實(shí)現(xiàn)詳解)
簡介一套面向信號(hào)處理研究者的CEEMDAN改進(jìn)算法MATLAB實(shí)現(xiàn)資源包聚焦EMD、EEMD與CEEMDAN在非線性非平穩(wěn)信號(hào)分析中的模態(tài)混疊問題。CEEMDAN利用自適應(yīng)噪聲取代EEMD的隨機(jī)噪聲既能繼承集成平均的穩(wěn)健性又能提高IMF分解精度與收斂速度它會(huì)在每次迭代中添加與信號(hào)相位相關(guān)的白噪聲再經(jīng)多次平均獲得更純凈的模態(tài)分量適用于地震波多尺度解析、心電腦電信號(hào)去噪、機(jī)械故障診斷、金融波動(dòng)識(shí)別等場景。壓縮包整體僅32KB共5個(gè)文件包含4個(gè)可直接運(yùn)行的核心.m算法函數(shù)與1個(gè).mat心電信號(hào)測試樣本覆蓋CEEMDAN、EEMD、EMD三種分解方法及配套示例腳本讀者可輕松替換數(shù)據(jù)并對(duì)比各算法的分解效果。該資源發(fā)布后已吸引5930人學(xué)習(xí)代碼結(jié)構(gòu)緊湊、內(nèi)置注釋清晰既適合初學(xué)者從EMD原理出發(fā)理解EEMD和CEEMDAN的改進(jìn)邏輯也能為進(jìn)階研究者提供算法對(duì)比實(shí)驗(yàn)與參數(shù)調(diào)試的參考基準(zhǔn)而且包體極小、部署方便非常適合相關(guān)方向的研究者下載使用。1. CEEMDAN算法不是換了個(gè)名字三種模態(tài)分解到底差在哪做信號(hào)處理的人手里幾乎都跑過EMD或者至少聽過它的大名。EMD能把一段亂七八糟的非平穩(wěn)信號(hào)自適應(yīng)地拆成若干條本征模態(tài)函數(shù)IMF這本是件很漂亮的事。但用過的人都知道EMD有個(gè)讓人頭疼的毛病模態(tài)混疊。同一個(gè)頻率的成份被切成幾段分到不同的IMF里或者不同頻率的成份攪在一起讓人分不清誰是誰。2009年前后EEMD的出現(xiàn)算是給了個(gè)緩解方案靠加白噪聲來“擾動(dòng)”極值點(diǎn)分布可代價(jià)是計(jì)算量大增而且重構(gòu)出來的信號(hào)永遠(yuǎn)帶著殘留噪聲不再是原來的信號(hào)了。CEEMDAN的全稱是Complete Ensemble Empirical Mode Decomposition with Adaptive Noise中文一般叫完全自適應(yīng)噪聲集合經(jīng)驗(yàn)?zāi)B(tài)分解。它的思路是在EEMD的噪聲輔助框架上把噪聲的加入方式改成“在每一層殘差上自適應(yīng)地加”并且做了全局包絡(luò)平均既保留了EEMD抑制模態(tài)混疊的能力又解決了重構(gòu)不完整的毛病。這篇文章寫給兩類人一類是被模態(tài)混疊折磨、想換一個(gè)更穩(wěn)的分解工具做特征提取的另一類是已經(jīng)在用EEMD、但受不了它“分解完信號(hào)變了樣”的。讀完你能直接跑通最小示例也能避開參數(shù)設(shè)置里那些常見的玄學(xué)坑。2. 從EMD到EEMD的演進(jìn)模態(tài)混疊是怎么被壓下去的2.1 EMD的核心假設(shè)包絡(luò)、篩分與瞬時(shí)頻率EMD的基本邏輯是把一個(gè)信號(hào)看成若干快速振蕩分量疊加在一個(gè)緩慢變化的趨勢上。算法本身沒有預(yù)設(shè)基函數(shù)全靠信號(hào)自身的極值點(diǎn)來驅(qū)動(dòng)。具體做法是找出信號(hào)的所有極大值點(diǎn)和極小值點(diǎn)用三次樣條分別插值出上包絡(luò)線和下包絡(luò)線取兩者的均值作為一條“平均線”然后用原始信號(hào)減去這條平均線得到一個(gè)去掉慢變成份的新信號(hào)。這個(gè)減的過程不是做一次就完了。新信號(hào)往往還有不對(duì)稱的波形所以要重復(fù)“找極值、插值、算均值、做減法”這個(gè)循環(huán)直到滿足兩個(gè)條件一是極值點(diǎn)和過零點(diǎn)的數(shù)目相等或最多差1二是上下包絡(luò)關(guān)于時(shí)間軸局部對(duì)稱。滿足條件后剩下的這一條信號(hào)就叫一個(gè)IMF。把IMF從原信號(hào)里剝掉對(duì)殘差繼續(xù)做同樣的篩分一層層往下剝最終得到一個(gè)單調(diào)的殘差項(xiàng)。這套流程本身很優(yōu)雅但它有個(gè)致命問題如果原信號(hào)里有兩個(gè)頻率很接近的成份包絡(luò)線擬合的時(shí)候會(huì)把它們當(dāng)成同一個(gè)振蕩或者在局部產(chǎn)生不規(guī)則的包絡(luò)波動(dòng)篩分出來的IMF就會(huì)一會(huì)兒是這個(gè)頻率一會(huì)兒是另一個(gè)頻率這就形成了模態(tài)混疊。我在處理軸承振動(dòng)數(shù)據(jù)時(shí)經(jīng)常看到這種情況同一個(gè)故障特征頻率被拆到IMF1和IMF3里各出現(xiàn)一段特征能量被稀釋得沒法用。2.2 EEMD的噪聲輔助思路為什么加白噪聲反而有用EEMD的出發(fā)點(diǎn)很直接既然極值點(diǎn)分布不均勻會(huì)導(dǎo)致混疊那我就往信號(hào)里加入均勻分布的白噪聲讓噪聲的極值點(diǎn)“填補(bǔ)”原始信號(hào)極值點(diǎn)稀疏的區(qū)域。這樣一來不同尺度的信號(hào)成分在篩分時(shí)會(huì)被噪聲擾動(dòng)到各自合適的參考尺度上不易混在一起。每次加入不同的白噪聲序列重復(fù)做多次EMD最后把所有結(jié)果按IMF序號(hào)做集合平均。因?yàn)榘自肼暤慕y(tǒng)計(jì)均值為零理論上平均足夠多次后噪聲的貢獻(xiàn)會(huì)相互抵消。EEMD確實(shí)能在一定程度上抑制模態(tài)混疊但用過的人都知道它的代價(jià)一是計(jì)算量成倍增加幾百次集合EMD跑下來處理長序列時(shí)等待時(shí)間讓人煩躁二是重構(gòu)信號(hào)無法完美還原因?yàn)榧掀骄荒芟糠职自肼暁埩舻脑肼暷芰繒?huì)滲進(jìn)每個(gè)IMF里導(dǎo)致分解結(jié)果失真三是每次加入的噪聲幅值和集合次數(shù)都要人工調(diào)噪聲太小起不到擾動(dòng)作用噪聲太大又把信號(hào)本身的極值點(diǎn)給淹沒掉。更麻煩的是即使集合次數(shù)設(shè)得很大不同批次分解結(jié)果的IMF數(shù)量也可能不一致集合平均時(shí)只能截?cái)噙@在統(tǒng)計(jì)上就不嚴(yán)謹(jǐn)。2.3 從EEMD到CEEMDAN噪聲的角色從“擾動(dòng)”變成“參考”CEEMDAN對(duì)EEMD的修正最關(guān)鍵的一點(diǎn)是改變了噪聲的使用邏輯。EEMD是把白噪聲加到原始信號(hào)上然后整體做EMDCEEMDAN則是在每一層分解后的殘差信號(hào)上加入一個(gè)由EMD生成的白噪聲IMF分量而且噪聲的幅值乘以一個(gè)系數(shù)來適應(yīng)當(dāng)前殘差的能量水平。我一般把這個(gè)系數(shù)設(shè)為0.2效果比較穩(wěn)。這樣做的好處有二第一每一層加噪聲都在殘差上進(jìn)行噪聲的能量隨分解層數(shù)增加而自適應(yīng)衰減不會(huì)從頭到尾都用一個(gè)固定幅值第二CEEMDAN不是對(duì)IMFs做簡單平均而是對(duì)每一層篩分過程中的包絡(luò)均值做全局平均這樣算出來的IMF天然逼近某個(gè)唯一的極限集合次數(shù)大了之后結(jié)果更穩(wěn)定也不容易在平均過程中截?cái)喑鲥e(cuò)誤的分量。換句話說EEMD的噪聲是被動(dòng)添加的輔助擾動(dòng)而CEEMDAN的噪聲更像一個(gè)參與迭代計(jì)算的參考信號(hào)算法本身在控制噪聲的注入和消除。整套流程跑完得到的IMF集合相加起來能精確重構(gòu)出原始信號(hào)這個(gè)性質(zhì)在EEMD里是不存在的。3. CEEMDAN的兩次平均自適應(yīng)噪聲與完備性重構(gòu)3.1 第一次平均對(duì)首個(gè)殘差加噪聲做的是包絡(luò)均值平均先看CEEMDAN的第一步。設(shè)原始信號(hào)為x(n)我們先生成I組白噪聲序列對(duì)每一組都做一次EMD得到各自的第一個(gè)IMF分量。注意此時(shí)不做集合平均而是先計(jì)算每個(gè)IMF對(duì)應(yīng)的上下包絡(luò)均值然后對(duì)這I組包絡(luò)均值做平均得到一條平均包絡(luò)線。用原始信號(hào)減去這條平均包絡(luò)線得到第一個(gè)IMF記作IMF1。這一步的精髓在于它避開了“對(duì)IMF直接平均”帶來的模態(tài)錯(cuò)位問題——不同分解結(jié)果中序號(hào)相同的IMF物理含義未必對(duì)齊但對(duì)包絡(luò)均值做平均因?yàn)榘j(luò)本身是連續(xù)曲線對(duì)齊性遠(yuǎn)好于對(duì)離散振蕩的IMF直接平均。我常跟人解釋EEMD平均的是“成品”CEEMDAN平均的是“半成品”后者在統(tǒng)計(jì)上更穩(wěn)健。接下來把這個(gè)IMF1從原始信號(hào)中減去得到第一個(gè)殘差r1(n)。噪聲在第一層的作用只是輔助產(chǎn)生包絡(luò)均值最終算IMF時(shí)噪聲并沒有直接留在IMF里這就從機(jī)制上減少了殘留噪聲。3.2 第二次平均逐層殘差加自適應(yīng)噪聲迭代出每個(gè)IMF從第二層開始CEEMDAN進(jìn)入一個(gè)逐層迭代的過程。在得到殘差r1(n)之后我們對(duì)r1(n)再加入白噪聲序列但這里加的不是原始白噪聲而是對(duì)白噪聲先做一次EMD、取它的第一個(gè)IMF分量作為噪聲模板。把這個(gè)模板乘以一個(gè)系數(shù)一般是0.1到0.3之間加到r1(n)上然后再對(duì)加噪后的信號(hào)做EMD提取出第一個(gè)IMF。對(duì)I組噪聲模板都重復(fù)這個(gè)過程得到I個(gè)候選IMF再一次對(duì)這I個(gè)候選的包絡(luò)均值做平均得到真正的IMF2。然后繼續(xù)做殘差減法得到r2(n)再重復(fù)“加自適應(yīng)噪聲模板、做EMD、平均包絡(luò)均值、提取IMF”的循環(huán)。這里有個(gè)細(xì)節(jié)值得注意每一層加的噪聲模板都來自對(duì)白噪聲的EMD分解也就是說它本身是一條合法的IMF加到殘差里后不會(huì)破壞殘差的固有尺度結(jié)構(gòu)。噪聲幅值系數(shù)需要根據(jù)當(dāng)前殘差的標(biāo)準(zhǔn)差動(dòng)態(tài)調(diào)整我一般用當(dāng)前殘差標(biāo)準(zhǔn)差乘以一個(gè)固定比例這樣無論信號(hào)本身能量多大注入的噪聲能量都是相對(duì)可控的。整個(gè)迭代一直做到殘差無法再分解出滿足條件的IMF為止最后剩下的殘差就是趨勢項(xiàng)。整個(gè)過程計(jì)算的IMF數(shù)量由信號(hào)本身的復(fù)雜程度決定不需要預(yù)先指定。3.3 完備性重構(gòu)為什么CEEMDAN能比EEMD多保證一條性質(zhì)完備性completeness是CEEMDAN相比EEMD最容易被忽略、但實(shí)際意義最大的改進(jìn)。所謂完備性就是所有IMF加上最終殘差能精確地還原出原始信號(hào)誤差只來自數(shù)值計(jì)算精度。EEMD做不到這點(diǎn)因?yàn)槊看蜤MD分解出的IMF個(gè)數(shù)不一樣集合平均時(shí)只能取最小公倍數(shù)之類的對(duì)齊方式多出來的分量沒法匹配重構(gòu)時(shí)要么丟失能量要么疊加殘留噪聲。CEEMDAN則不同每一層的IMF都是從上一輪殘差中減出來的數(shù)學(xué)上每一步都滿足“殘差 上一輪殘差 - IMF”把所有層加起來中間的殘差項(xiàng)全部抵消自然能精確回到原始信號(hào)。這個(gè)性質(zhì)在做信號(hào)重構(gòu)、去噪和趨勢提取時(shí)特別有用。我做故障診斷時(shí)經(jīng)常需要把分解后的高頻IMF疊加起來重構(gòu)出故障沖擊信號(hào)EEMD重構(gòu)出的信號(hào)輻值總是偏小還得做幅值修正CEEMDAN基本不需要這步。完備性也為后續(xù)的定量分析掃清了障礙。特性EMDEEMDCEEMDAN噪聲輔助無加入原始信號(hào)逐層加入殘差的自適應(yīng)噪聲平均對(duì)象無IMF直接平均包絡(luò)均值平均模態(tài)混疊抑制弱中等強(qiáng)重構(gòu)誤差極小有殘留噪聲近似為零計(jì)算開銷低很高介于兩者之間參數(shù)敏感性較低高中等4. 用Python復(fù)現(xiàn)CEEMDAN最小代碼與四個(gè)必調(diào)參數(shù)4.1 核心迭代代碼逐層提取IMF的實(shí)現(xiàn)骨架這一小節(jié)給出一個(gè)能直接運(yùn)行的CEEMDAN核心循環(huán)代碼結(jié)構(gòu)上做了簡化用scipy的樣條插值做包絡(luò)擬合用標(biāo)準(zhǔn)EMD篩分流程作為內(nèi)層函數(shù)再在外面套CEEMDAN的自適應(yīng)噪聲迭代框架。完整實(shí)現(xiàn)里還包含停止準(zhǔn)則和殘差判斷這里為了講解清楚把主干邏輯單獨(dú)拎出來。import numpy as np from scipy.interpolate import CubicSpline def _emd_once(signal, max_iter10, tol1e-5): 標(biāo)準(zhǔn)EMD篩分一次返回第一個(gè)IMF和殘差 imf_prev signal.copy() for _ in range(max_iter): # 找極值點(diǎn) max_idx (np.diff(np.sign(np.diff(imf_prev))) 0).nonzero()[0] 1 min_idx (np.diff(np.sign(np.diff(imf_prev))) 0).nonzero()[0] 1 if len(max_idx) 2 or len(min_idx) 2: break # 三次樣條包絡(luò) upper CubicSpline(max_idx, imf_prev[max_idx])(np.arange(len(imf_prev))) lower CubicSpline(min_idx, imf_prev[min_idx])(np.arange(len(imf_prev))) mean_env (upper lower) / 2.0 imf_new imf_prev - mean_env # 判斷IMF條件包絡(luò)均值是否足夠接近零 if np.mean(np.abs(mean_env)) tol * np.std(signal): break imf_prev imf_new return imf_prev, signal - imf_prev def ceemdan_decompose(signal, n_ens100, nstd0.2, max_iter10): CEEMDAN主流程逐層提取IMF imfs [] residue signal.copy() n len(signal) while True: # 生成噪聲模板白噪聲的EMD第一個(gè)IMF noise_imfs [] for _ in range(n_ens): white_noise np.random.randn(n) * nstd * np.std(residue) # 對(duì)殘差加自適應(yīng)噪聲做一次EMD得到候選IMF _, _ _emd_once(residue white_noise, max_iter) # 注意這里實(shí)際上需要計(jì)算加入噪聲后信號(hào)的第一個(gè)IMF作為候選 # 簡化版做法直接取white_noise的EMD第一個(gè)IMF做模板 noise_imf, _ _emd_once(white_noise, max_iter) noise_imfs.append(noise_imf) # 平均噪聲模板并注入殘差 avg_noise np.mean(noise_imfs, axis0) candidate, _ _emd_once(residue avg_noise, max_iter) imfs.append(candidate) residue residue - candidate # 殘差極值點(diǎn)不足時(shí)停止 if np.sum(np.diff(np.sign(np.diff(residue))) ! 0) 4: break imfs.append(residue) return np.array(imfs)這段代碼的核心邏輯分三層理解。第一層是_emd_once它完成單次EMD篩分返回一個(gè)IMF和對(duì)應(yīng)的殘差判斷IMF的條件用的是包絡(luò)均值逼近零的程度而不是嚴(yán)格的極值點(diǎn)與過零點(diǎn)數(shù)目相等因?yàn)楹笳咴陔x散點(diǎn)上很容易出現(xiàn)振蕩誤判。第二層是噪聲模板的生成CEEMDAN要求加白噪聲EMD后的第一個(gè)IMF作為模板而不是加原始白噪聲這段代碼里用_emd_once(white_noise)來生成模板就是為了保證模板是一條合法的IMF。第三層是主循環(huán)中對(duì)殘差迭代注入模板噪聲每次都把殘差減去新提取的IMF直到殘差沒有足夠極值點(diǎn)為止。參數(shù)n_ens控制集合次數(shù)nstd控制噪聲幅值比例max_iter控制每次EMD的最大篩分次數(shù)這三個(gè)參數(shù)就是CEEMDAN最核心的調(diào)整對(duì)象。4.2 四個(gè)必調(diào)參數(shù)集合次數(shù)、噪聲幅值、篩分次數(shù)與停止閾值用CEEMDAN時(shí)很多人上來就默認(rèn)一組參數(shù)跑完結(jié)果看分解結(jié)果不對(duì)勁接著就開始懷疑算法本身有問題。實(shí)際上CEEMDAN對(duì)參數(shù)不算特別敏感但這四個(gè)參數(shù)必須根據(jù)你的信號(hào)特征認(rèn)真過一遍。第一個(gè)參數(shù)是集合次數(shù)n_ens也就是噪聲模板重復(fù)生成的次數(shù)。常見做法是設(shè)50到200之間信號(hào)越長、信噪比越低需要的次數(shù)越多。我處理采樣率12800Hz的軸承振動(dòng)數(shù)據(jù)時(shí)分段長度4096個(gè)點(diǎn)設(shè)100次就能獲得比較穩(wěn)定的IMF集合如果設(shè)少了包絡(luò)均值平均不充分分解結(jié)果里還會(huì)出現(xiàn)少量噪聲殘留的痕跡。第二個(gè)參數(shù)是噪聲幅值比例nstd一般取0.1到0.3之間。它的含義是噪聲模板的能量相對(duì)當(dāng)前殘差的標(biāo)準(zhǔn)差比例。設(shè)大了噪聲擾動(dòng)強(qiáng)抑制模態(tài)混疊的效果好但過大的話會(huì)把弱信號(hào)成分淹沒設(shè)小了分解結(jié)果接近EMD模態(tài)混疊問題又回來了。第三個(gè)參數(shù)是最大篩分次數(shù)max_iter默認(rèn)10到20為宜。篩分次數(shù)太少IMF不夠平滑可能出現(xiàn)非對(duì)稱波形太多會(huì)過度篩分把有效信號(hào)磨成類似正弦波的虛假分量。第四個(gè)參數(shù)是停止閾值tol判斷包絡(luò)均值是否足夠接近零一般設(shè)1e-5到1e-6。這個(gè)閾值決定了分解的層數(shù)和精度設(shè)得太寬松會(huì)提前停止漏掉微弱成份設(shè)得太嚴(yán)格會(huì)增加計(jì)算時(shí)間而且末尾幾層IMF容易變成純數(shù)值噪聲。我一般建議先固定n_ens100和nstd0.2跑通流程再根據(jù)IMF的物理可解釋性回調(diào)這兩個(gè)參數(shù)。4.3 從分解結(jié)果里得到的四個(gè)關(guān)鍵輸出CEEMDAN跑完后輸出是一個(gè)二維數(shù)組第一維是IMF序號(hào)第二維是時(shí)間序列值。使用結(jié)果時(shí)我一般關(guān)注四個(gè)關(guān)鍵輸出。第一個(gè)是每個(gè)IMF的方差貢獻(xiàn)率計(jì)算方式是每個(gè)IMF的能量除以原始信號(hào)總能量這個(gè)指標(biāo)能快速判斷哪個(gè)IMF承載了主要信號(hào)能量幫助定位主故障頻率或主振蕩模態(tài)。第二個(gè)是每個(gè)IMF的頻譜特征對(duì)IMF做FFT可以得到中心頻率和帶寬用于對(duì)照已知的故障特征頻率。第三個(gè)是殘差趨勢項(xiàng)它代表信號(hào)的整體緩變趨勢在趨勢提取場景中直接就是目標(biāo)輸出。第四個(gè)是各IMF的瞬時(shí)頻率序列通過Hilbert變換計(jì)算相位導(dǎo)數(shù)得到這是做時(shí)頻分析的基礎(chǔ)。實(shí)際應(yīng)用中把多個(gè)IMF的瞬時(shí)頻率畫在一張圖上能看到信號(hào)頻率隨時(shí)間的變化軌跡比單純看頻譜圖直觀得多。5. 避坑與常見問題模態(tài)分裂、端點(diǎn)效應(yīng)與參數(shù)失靈時(shí)怎么看5.1 模態(tài)分裂一個(gè)故障特征被拆到兩層IMF里現(xiàn)象是診斷軸承外圈故障時(shí)故障特征頻率的能量在IMF3和IMF4里各出現(xiàn)了一部分兩個(gè)IMF的頻譜圖上都有特征頻率的譜峰但峰高都偏矮直接拿來提取特征值會(huì)低估故障嚴(yán)重程度。原因是噪聲幅值設(shè)得偏大導(dǎo)致相鄰兩個(gè)尺度的成份在篩分時(shí)被噪聲“頂”開了邊界變得模糊。解決辦法是把nstd從0.2往回調(diào)到0.1左右同時(shí)適當(dāng)增加n_ens到150讓包絡(luò)均值更穩(wěn)定。如果調(diào)完仍然分裂考慮信號(hào)本身是否存在兩個(gè)頻率非常接近的成份這時(shí)分開分析兩個(gè)IMF各自的包絡(luò)譜比強(qiáng)行合并更合理。這個(gè)坑在齒輪箱振動(dòng)信號(hào)里尤其常見嚙合頻率和邊頻帶本來就靠得近分解容易把邊頻帶拆到兩個(gè)IMF里。5.2 端點(diǎn)效應(yīng)信號(hào)兩端飛出來的虛假振蕩現(xiàn)象是分解結(jié)果的兩端出現(xiàn)幅度很大的甩尾現(xiàn)象IMF在信號(hào)首尾位置的幅值遠(yuǎn)大于中間部分甚至出現(xiàn)“波浪形”的假包絡(luò)。原因是三次樣條插值時(shí)端點(diǎn)附近的極值點(diǎn)稀疏樣條曲線在邊界處不受控制地外延包絡(luò)線在兩端失真。解決辦法主要有三種第一種是信號(hào)延拓常見做法是鏡像延拓把信號(hào)兩端按局部極值對(duì)稱地延長一段長度做完分解后把延拓部分裁掉這是我在實(shí)際中最常用的方案第二種是給兩端加窗對(duì)延拓后的信號(hào)加漢寧窗再做分解注意加窗只影響延拓部分需要拼回原始信號(hào)時(shí)做交疊過渡第三種是增大n_ens次數(shù)通過集合平均削弱端點(diǎn)處的不穩(wěn)定性但這種做法只緩解不根治。我一般建議把信號(hào)延拓作為預(yù)處理寫在分解函數(shù)外面不要指望CEEMDAN內(nèi)部自動(dòng)解決端點(diǎn)問題。5.3 分解層數(shù)過多或過少殘差極值點(diǎn)的判斷出了問題現(xiàn)象是同樣的信號(hào)某次跑出來8層IMF加殘差另一次只跑了5層就停了結(jié)果還不穩(wěn)定。原因是停止閾值的判斷依賴殘差極值點(diǎn)數(shù)量而極值點(diǎn)檢測在離散信號(hào)上容易出現(xiàn)“假極值”——相鄰兩個(gè)點(diǎn)的微小波動(dòng)就被當(dāng)成一個(gè)極值。解決辦法是把極值點(diǎn)檢測函數(shù)里的相鄰差分條件改嚴(yán)格一些例如要求極值點(diǎn)兩側(cè)的差分符號(hào)相反且差值幅度大于某個(gè)閾值比如去掉小于信號(hào)標(biāo)準(zhǔn)差1%的微小波動(dòng)。同時(shí)把tol從1e-5放寬到1e-4讓篩分循環(huán)在出現(xiàn)數(shù)值噪聲前盡早收斂這樣分解層數(shù)會(huì)穩(wěn)定很多。我遇到過一個(gè)極端案例原始信號(hào)含有明顯的工頻干擾50Hz正弦波在離散采樣下極值點(diǎn)非常密集分解層數(shù)反復(fù)跳動(dòng)最后通過在極值點(diǎn)判據(jù)里加最小間距限制相鄰極值點(diǎn)至少間隔3個(gè)采樣點(diǎn)才穩(wěn)定下來。5.4 白噪聲殘留過多面平均后的IMF依然毛糙現(xiàn)象是分解后的IMF曲線不像EMD那樣平滑帶有明顯的鋸齒噪聲。原因多數(shù)是n_ens次數(shù)不夠包絡(luò)均值平均不充分或者噪聲模板生成時(shí)用原始白噪聲而非白噪聲的EMD第一個(gè)IMF導(dǎo)致模板本身攜帶高頻粗糙成份。解決辦法是檢查代碼中生成噪聲模板的部分確認(rèn)用的是_emd_once(white_noise)的IMF1作為模板而不是直接把np.random.randn生成的序列加到殘差里。其次把n_ens提高到200再看效果。如果提高后仍然毛糙考慮信號(hào)本身的采樣率是否過低低于1kHz采樣時(shí)高頻噪聲本來就難以和真實(shí)信號(hào)分離。5.5 計(jì)算時(shí)間過長數(shù)組太長導(dǎo)致循環(huán)次數(shù)爆炸現(xiàn)象是處理幾十萬點(diǎn)的長信號(hào)時(shí)一次完整分解要跑十幾分鐘甚至更久。原因是CEEMDAN內(nèi)層有集合循環(huán)和EMD篩分循環(huán)的嵌套每層殘差都要對(duì)每組噪聲做一次包絡(luò)擬合時(shí)間復(fù)雜度接近O(n_ens × max_iter × 分解層數(shù) × 信號(hào)長度)。解決辦法是分段分解把信號(hào)按重疊窗口切成4096或8192點(diǎn)的段分段做CEEMDAN再對(duì)重疊區(qū)域的IMF做交叉淡化拼接。另一個(gè)巧辦法是先做一次降采樣粗分解得到各層的頻率范圍再用原始采樣率對(duì)感興趣的頻率帶做窄帶CEEMDAN。計(jì)算量這件事沒有魔法只能從信號(hào)長度和集合次數(shù)兩頭砍。6. 排列熵閾值與殘差白噪聲檢驗(yàn)把CEEMDAN的結(jié)果量化成可用信號(hào)分解跑完之后最讓人頭疼的問題是如何判斷哪些IMF是有物理意義的信號(hào)、哪些是純?cè)肼?。CEEMDAN本身不會(huì)替你做這個(gè)決定但有兩個(gè)工具配合起來效果很好排列熵和殘差白噪聲檢驗(yàn)。排列熵的計(jì)算不依賴信號(hào)幅值只依賴時(shí)間序列中相鄰樣本的排序模式。對(duì)每個(gè)IMF計(jì)算排列熵時(shí)先做相空間重構(gòu)設(shè)定嵌入維數(shù)m和延遲時(shí)間tau把每個(gè)點(diǎn)映射成m維排序模式統(tǒng)計(jì)不同模式出現(xiàn)的概率再按信息熵的公式計(jì)算。m一般取5到7tau取1到3。信號(hào)成分的排列熵值通常在0.5以下純?cè)肼暤呐帕徐刂到咏?.9以上。把每個(gè)IMF的排列熵畫成一條曲線能看到明顯的分界點(diǎn)分界點(diǎn)之后的IMF基本可以判定為噪聲主導(dǎo)。這個(gè)步驟能在沒有先驗(yàn)知識(shí)的情況下自動(dòng)幫你篩掉無效IMF省掉大量人工看頻譜的時(shí)間。殘差白噪聲檢驗(yàn)則是從另一個(gè)角度驗(yàn)證分解的完整性。具體做法是取最后一個(gè)殘差序列計(jì)算它的自相關(guān)系數(shù)如果殘差本質(zhì)上接近白噪聲那么除了零延遲之外的其他自相關(guān)系數(shù)都應(yīng)該落在±1.96/√n的置信帶內(nèi)。如果殘差中還有明顯結(jié)構(gòu)自相關(guān)系數(shù)會(huì)在某些延遲處顯著越界說明分解層數(shù)不夠需要繼續(xù)往下分解。這個(gè)檢驗(yàn)還有一個(gè)用法把去除噪聲IMF后重構(gòu)的信號(hào)與原始信號(hào)做差得到的殘差序列做白噪聲檢驗(yàn)如果檢驗(yàn)通過說明你的去噪過程沒有把有效信號(hào)成分一起濾掉。我在做故障特征提取時(shí)習(xí)慣先跑這兩步檢驗(yàn)再用保留下來的IMF去做包絡(luò)譜分析效果比直接拿全部IMF堆特征穩(wěn)定得多。參數(shù)選擇上的一個(gè)血淚經(jīng)驗(yàn)是不要為了追求“完美的模態(tài)純凈度”把噪聲幅值越調(diào)越大那樣只會(huì)把分解結(jié)果往虛假模態(tài)方向帶。我一般先用默認(rèn)參數(shù)跑通再逐個(gè)調(diào)集合次數(shù)和噪聲比例每次只改一個(gè)參數(shù)用排列熵曲線和殘差白噪聲檢驗(yàn)兩條標(biāo)準(zhǔn)來衡量變化基本兩三輪就能鎖定一組可靠參數(shù)。做CEEMDAN這件事算法本身的改進(jìn)點(diǎn)已經(jīng)寫得很清楚了真正的功夫在于判斷哪個(gè)IMF能用、哪個(gè)不能用這套“排列熵過濾 白噪聲檢驗(yàn)”的驗(yàn)證習(xí)慣幫我在不少項(xiàng)目里少走了彎路。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取