EMD算法之Hilbert-Huang Transform原理詳解和案例分析

本分享爲腦機學習者Rose整理髮表於公衆號:腦機接口社區(微信號:Brain_Computer).QQ交流羣:941473018

Hilbert-Huang Transform 希爾伯特-黃變換

在我們正式開始講解Hilbert-Huang Transform之前,不妨先來了解一下這一偉大算法的兩位發明人和這一算法的應用領域。

Section I 人物簡介

希爾伯特:公認的數學界“無冕之王”,1943年去世於瑞士蘇黎世。除此之外,自不必過多介紹。

黃鍔:1937年出生於湖北省;1975年進入NASA(美國國家宇航局);美國國家工程院院士。

Section II Hilbert-Huang的應用領域

醫學領域:探測心率不齊、登革熱的擴散、血壓的變化
  交通領域:探測公路橋樑安全
  安全領域:辨識發言者的身份
  地理領域:地震工程
  航天領域:衛星資料分析

在瞭解了這一偉大發明的背景後,下面我們要正式的開始入手希爾伯特-黃變換了,我將嘗試以儘可能簡要的語言向大家介紹這一發明,並儘可能的避免不必要的數學推導。

Section III Hilbert-Huang的算法詳細介紹

如下圖所示,在希爾伯特-黃的運算步驟中,原始腦電信號/其他時序信號被作爲Huang的算法的輸入,在經過huang的算法處理過後被當做Hilbert的輸入進行處理。這便是Hilbert-Huang最簡單明瞭的運算步驟。在這裏爲了繼續往下的講解更加方便,我們先來介紹兩個概念。上文中,我們提到了“huang的算法”,在正式的書面語言中,我們並不這麼稱呼它,而是將“huang的算法”稱爲EMD(Empirical mode decomposition,經驗模式分解)。而另外一個概念IMF在這裏直接講解或許會使大家暈頭轉向(或許有人注意到圖中的IMF後面有一個‘s’,而這裏卻沒有加‘s’,對英語只有基礎瞭解的人也應猜到IMF不止一個)。

在這裏插入圖片描述

當講到這裏的時候,大部分人或許會萌生出一個念頭----“難道Huang僅僅是對Hilbert的錦上添花嗎”。好吧,至少本人當初就是這樣想的,畢竟Hilbert比huang更早出名,而且Hilbert是數學史上公認的“大牛”,哦,不對,是“大王”。用當前時興的話來說就是“huang有可能抱了Hilbert的大腿”。但當我真正瞭解了這一偉大的發明之後,我才徹徹底底打消了這個十分愚蠢的念頭。

我個人並不喜歡吊人胃口,這裏把結論說在前面“Huang的算法幾乎是Hilbert使用的前提條件,Hilbert Transform則是Hilbert-Huang算法的精要所在”(注意句中出現了“幾乎”一詞)。

下面我就給大家講一下這句話的由來。比如我們造了一款叫做“榔頭”的手機,“榔頭”手機對用戶的使用提出了下列要求:1.晚上不能使用。2.下雨天不能打。3.室內不能打。4.室外的偏遠郊區也不能打。

實際上,Hilbert正是這樣一款“榔頭”手機,它對用戶的使用提出了近乎苛刻的要求。Hilbert變換算法要求輸入信號只能是線性穩態的。請注意這裏是兩個詞“線性”“穩態”。無論是在自然界還是在人類社會中,絕大部分的信號要麼是“線性非穩態”,要麼是“非線性穩態”,要麼乾脆是“非線性非穩態”。我們關心的重點----EEG信號正是這樣一類“非線性非穩態”的信號。這也就導致了絕大部分信號不能夠愉快的進入Hilbert的“碗裏”來。此時,Huang的EMD算法起到了這樣的作用,它能夠將所有的時域信號轉化爲“線性穩態”,解了Hilbert算法的軟肋。

首先,我們先說一說Huang的EMD算法。爲了講解清晰起見,我將對照下圖予以講解:
在這裏插入圖片描述

上圖中,深藍色的線條是EEG信號(截取自瑞士聯邦理工學院DEAP數據庫 s01 trail1 channel1的前200個數據點)。圖中,紅線上的紅點是該EEG signal的極大值點,綠線上的綠點是該signal的極小值點。

我們分別爲極大值點和極小值點做三次包絡線做好的包絡線分別是紅色包絡線和綠色包絡線兩條線。爲這兩條線做出均值線即爲圖中圍繞y=0軸(注意y=0軸的位置,並非是圖中的座標系的x軸,x軸所代表的線是y=-10)震盪的淺藍色均值線。之後,我們將原始EEG信號減去均值線,得到疑似IMF線(圖中未標出)(這裏終於出現IMF了,可是我還是無法讓你直觀理解,大家先暫且忍忍,強行記憶一下)。之後,我們對疑似IMF進行判斷(需要同時滿足兩個條件,下面講)。如果滿足條件,則疑似IMF升級爲正式IMF。然後將原始信號減去正式IMF的結果賦值給原始信號,說白了就是讓這一IMF從原始信號裏“滾蛋”。就好比蒙面歌王的某一期的獲勝者一樣,都贏了,不滾幹嘛,難道還要和加時賽選手(減完後剩下的原始信號,也即新原始信號)在一起嗎?另一個方面,如果疑似IMF未能通過檢驗,則將當前IMF作爲原始信號,並回到做極值點的包絡線那一步重新開始。現在講一下兩個重要的條件:

條件1:均值線(總得有很多數構成吧)的平均值趨近於0(一般和0做差<0.1)
條件2:原始信號的極值點個數(包括極大值點個數+極小值點個數)和原始信號同y=0的交點個數之差不能大於1(小於等於1)

那麼這樣一個程序什麼時候可以循環結束呢,答案是,當某一次IMF被發現是單調函數或者是缺少極大/小值點即可讓程序結束。下圖是程序流程圖。
在這裏插入圖片描述

空口無憑,我們處理一段真正的腦電試試看(程序會在之後給出)
在這裏插入圖片描述

圖中共有4*2個圖,位於(1,1)這個位置的是腦電的原始信號。之後從(1,2)->(4,2)均爲IMF。其中,除了(1,1)自身,每一副圖都是(1,1)的一個IMF(現在知道什麼是IMF了吧)。通過觀察不難發現。一個典型的IMF分量的上下包絡線肯定是對稱的。最後一個IMF(4,2)被稱爲餘項用r表示。觀察即可知該IMF分量沒有極小值點(端點除外),所以程序纔會結束。通常來講,別的書上會這樣用數學公式告訴你:

在這裏插入圖片描述

其中ξ(t)就是原始信號,IMFi就是K個固有模態函數。rK就是原始信號減完IMF後剩下的餘項。

下面是求解EMD算法的Matlab源程序。

%非主函數,被調用
function n = findpeaks(x)%用於尋找極值點,該函數只會求極大值
%   Find peaks.
%   n = findpeaks(x)
    n = find(diff(diff(x)>0)<0);%一階導數大於0二階導數小於0的點
    u = find(x(n+1)>x(n));
    n(u) = n(u) + 1;
end
%非主函數,被調用<br>%判斷x是否單調,返回0代表不是單調,返回1代表是單調
function u = ismonotonic(x)
    u1 = length(findpeaks(x))*length(findpeaks(-x));%如果最大/最小值有一個爲0即可判斷程序滿足退出條件了
    if u1 > 0
        u = 0;
    else
        u = 1;
    end
end
%非主函數,被調用。判斷當前x是不是真IMF
function u = isimf(x)
    N  = length(x);
    u1 = sum(x(1:N-1).*x(2:N) < 0);%求x與y=0軸交點的個數
    u2 = length(findpeaks(x))+length(findpeaks(-x));%求極值點個數
    if abs(u1-u2) > 1
        u = 0;
    else
        u = 1;
    end
end
%非主函數,被調用,作用是獲得x的包絡線
function s = getspline(x)
    N = length(x);
    p = findpeaks(x);
    s = spline([0 p N+1],[0 x(p) 0],1:N);
end
%主函數
function imf = emd(x)
% Empiricial Mode Decomposition (Hilbert-Huang Transform)
% imf = emd(x)
% Func : findpeaks
    x = transpose(x(:));
    imf = [];
    while ~ismonotonic(x)
        x1 = x;
        sd = Inf;
        while (sd > 0.1) || ~isimf(x1)
            s1 = getspline(x1);
            s2 = -getspline(-x1);
            x2 = x1-(s1+s2)/2;
       
            sd = sum((x1-x2).^2)/sum(x1.^2);
            x1 = x2;
        end
    
        imf(end+1,:) = x1;
        x = x-x1;
    end
    imf(end+1,:) = x;
end

特此聲明,本程序爲我本人在網上找到的,除了註釋外,其他版權皆歸屬原作者,由於不清楚原作者是誰,未能標出,如果侵犯權利,請聯繫我刪除源碼。

Section IV Hilbert算法的介紹

在上一章中,我們介紹了EMD算法,在這一部分中,我會介紹Hilbert算法,這一節有些許數學趣味,對數學趣味不感興趣的直接跳到應用部分。
在這裏插入圖片描述
由最後一步可以知道,當頻率大於0時,相位向左移90度;反之,向右移90度。這便是希爾伯特變換。

一般來講,對於原始信號x(t)的希爾伯特變換H[x(t)],通常被寫爲

z(t)=x(t)+j H[x(t)]

其中,x(t)被稱爲覆信號z(t)的實部,H[x(t)]被稱爲覆信號z(t)的虛部, z(t)被稱爲x(t)的解析信號。

在這裏插入圖片描述

一般情況下,matlab會將z(t)給出,而不直接給出原始信號的希爾伯特變換,所以需要使用imag函數求解z(t)的虛部,這纔是真正的希爾伯特變換。

這篇文章來源於Mario-Chao的授權轉載。
參考:
https://www.cnblogs.com/hdu-zsk/p/4799470.html
EMD算法之Hilbert-Huang Transform原理詳解和案例分析
本文章由腦機學習者Rose筆記分享,QQ交流羣:941473018
更多分享,請關注公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章