【轉】小波與小波包、小波包分解與信號重構、小波包能量特征提取 暨 小波包分解后實現按頻率大小分布重新排列(Matlab 程序詳解)


轉:https://blog.csdn.net/cqfdcw/article/details/84995904

        小波與小波包、小波包分解與信號重構、小波包能量特征提取   (Matlab 程序詳解)

                                                       -----暨 小波包分解后解決頻率大小分布重新排列問題

       本人當前對小波理解不是很深入,通過翻閱網絡他人博客,進行匯總總結,重新調試Matlab代碼,實現對小波與小波包、小波包分解與信號重構、小波包能量特征提取,供大家參考,后續將繼續更新!

     本人在分析信號的過程中發現,按照網上所述的小波包分解方法理解,獲取每層節點重構后信號頻率並不是按照(n,0)、(n,1)...順序依次由小到大排列的,經過進一步分析研究后發現,需要對節點進行重排序,具體操作見本文分析。


1.小波與小波包區別

        工程應用中經常需要對一些非平穩信號進行,小波分析和小波包分析適合對非平穩信號分析,相比較小波分析,利用小波包分析可以對信號分析更加精細,小波包分析可以將時頻平面划分的更為細致,對信號的高頻部分的分辨率要好於小波分析,可以根據信號的特征,自適應的選擇最佳小波基函數,比便更好的對信號進行分析,所以小波包分析應用更加廣泛。

                             

①小波分解

         小波變換只對信號的低頻部分做進一步分解,而對高頻部分也即信號的細節部分不再繼續分解,所以小波變換能夠很好地表征一大類以低頻信息為主要成分的信號,不能很好地分解和表示包含大量細節信息(細小邊緣或紋理)的信號,如非平穩機械振動信號、遙感圖象、地震信號和生物醫學信號等。

                                                                 

②小波包分解

       小波包變換既可以對低頻部分信號進行分解,也可以對高頻部分進行分解,而且這種分解既無冗余,也無疏漏,所以對包含大量中、高頻信息的信號能夠進行更好的時頻局部化分析。

                                                                      

2.小波包——小波包樹與時頻圖

小波包樹解讀:

                                       

 

  以上即是小波包樹,其中節點的命名規則是從(1,0)開始,叫1號, (1,1)是2號………依此類推,(3,0)是7號,(3,7)是14號。 每個節點都有對應的小波包系數,這個系數決定了頻率的大小,也就是說頻率信息已經有了,但是時域信息在哪里呢? 那就是 order。  這個order就是這些節點的順序,也就是頻率的順序。

Matlab實例:

采樣頻率為1024Hz,采樣時間是1秒,有一個信號s是由頻率100和200Hz的正弦波混合的,我們用小波包來分解。

  1.  
    clear all
  2.  
    clc
  3.  
    fs= 1024; %采樣頻率
  4.  
    f1= 100; %信號的第一個頻率
  5.  
    f2= 300; %信號第二個頻率
  6.  
    t= 0:1/fs:1;
  7.  
    s=sin(2*pi*f1*t)+sin(2*pi*f2*t); %生成混合信號
  8.  
    [tt]=wpdec( s,3,'dmey'); %小波包分解,3代表分解3層,'dmey'使用meyr小波
  9.  
    plot(tt) %畫小波包樹圖
  10.  
    wpviewcf(tt, 1); %畫出時間頻率圖

                                         

主要解釋:

x軸,就是1024個點,對應1秒,每個點就代表1/1024秒。

y軸,顯示的數字對應於小波包樹中的節點,從下面開始,順序是 7號節點,8號,10號,9號,,,,11號節點,這個順序是這么排列的,這是小波包自動排列的。然后,y軸是頻率啊,怎么不是 100Hz和300Hz呢?我們的采樣頻率是1024Hz,根據采樣定理,奈奎斯特采樣頻率是512Hz,我們分解了3層,最后一層就是 2^3=8個頻率段,每個頻率段的頻率區間是 512/8=64Hz,看圖顏色重的地方一個是在8那里,一個在13那里,8是第二段,也就是 65-128Hz之間,13是第五段,也就是257-320Hz之間。這樣就說通了,正好這個原始信號只有兩個頻率段,一個100一個300。如果我們不是分解了3層,而是更多層,那么每個頻率段包含的頻率也就越窄,圖上有顏色的地方也會更細,也就是說更精細了,由於原始信號的頻率在整個1秒鍾內都沒有改變,所以有顏色的地方是一個橫線。(引用:http://www.cnblogs.com/welen/articles/5667217.html )

3.小波包-----小波包分解系數

       在數值分析中,我們學過內積,內積的物理含義:兩個圖形的相似性,若兩個圖形完全正交,則內積為0,若兩個圖形完全一樣,則系數為1(相對值)。小波變換的實質是:原信號與小波基函數的相似性。小波系數就是小波基函數與原信號相似的系數。

      連續小波變換:小波函數與原信號對應點相乘,再相加,得到對應點的小波變換系數,平移小波基函數,再計算小波函數與原信號對應點相乘,再相加,這樣就得到一系列的小波系數。對於離散小波變換(由於很多小波函數不是正交函數,因此需要一個尺度函數)所以,原信號函數可以分解成尺度函數和小波函數的線性組合,在這個函數中,尺度函數產生低頻部分,小波函數產生高頻部分。

4.小波包-----信號分解與重構(方法1)

該方法可以實現對任意節點系數選擇進行組合重構。

例1

有一個信號,變量名為wave,隨便找一個信號load進來就行了。

  1.  
    t=wpdec(wave, 3,'dmey');
  2.  
    t2 = wpjoin(t,[ 3;4;5;6]);
  3.  
    sNod = read(t,'sizes',[3,4,5,6]);
  4.  
    cfs3 = zeros(sNod( 1,:));
  5.  
    cfs4 = zeros(sNod( 2,:));
  6.  
    cfs5 = zeros(sNod( 3,:));
  7.  
    cfs6 = zeros(sNod( 4,:));
  8.  
    t3 = write(t2,'cfs',3,cfs3,'cfs',4,cfs4,'cfs',5,cfs5,'cfs',6,cfs6);
  9.  
    wave2=wprec(t3);

第一行:將wave 用 dmey小波進行3層小波包分解,獲得一個小波包樹 t

第二行:將小波包樹的第二行的四個節點收起來,也就是讓第二行的節點變為樹的最底層節點。因為第一行中小波包樹的節點個數是第一層2個,第二層4個,第三層8個。現在t2就是將第三層的節點再聚合回第二層。

第三行:讀取第二層四個節點系數的size

第四~七行:將所有四個節點的小波包系數變為0

第八行:將四個節點的系數重組到t3小波樹中。

第九行:對t3小波樹進行重構,獲得信號wave2

       可以預見,因為我們把小波樹的節點系數都變為0了,所以信號也就全為0了。所以wave2是一個0向量。讀者可以自行plot一下wave和wave2看看。進一步,如果我們只聚合第二層中的某幾個節點,比如 4和5,即將第三行到第八行中節點 3 和節點 6的語句刪除或修改,那么意思就是將 4  5節點的系數變為0,那么wave2肯定就不是0向量了。

例2

  1.  
    t=wpdec(wave, 3,'dmey');
  2.  
    t2 = wpjoin(t,[ 3;4;5;6]);
  3.  
    cfs3=wpcoef(t, 3);
  4.  
    cfs4=wpcoef(t, 4);
  5.  
    cfs5=wpcoef(t, 5);
  6.  
    cfs6=wpcoef(t, 6);
  7.  
    t3 = write(t2,'cfs',3,cfs3,'cfs',4,cfs4,'cfs',5,cfs5,'cfs',6,cfs6);
  8.  
    wave2=wprec(t3);

解釋:

第一行:將wave 用 dmey小波進行3層小波包分解,獲得一個小波包樹 t

第二行:將小波包樹的第二行的四個節點收起來,也就是讓第二行的節點變為樹的最底層節點。

第三~六行:獲取四個節點的小波包系數 (小波包系數就是一個一維向量)

第七行:將四個節點的系數重組到t3小波樹中

第八行:對t3小波樹進行重構,獲得信號wave2

可以看出,該例子就是對一個小波包展開了,又原封不動的裝回去了,所以說 wave2和wave是一樣的。

注意,wpjoin命令在這里是必要的,因為write函數只能將最底層的節點寫進去。也就是說,如果我們將第三層的小波包系數進行修改的話,就不用wpjoin了,具體可以看例3

例3

  1.  
    t=wpdec(wave, 3,'dmey');
  2.  
    cfs7=wpcoef(t, 7);
  3.  
    cfs8=wpcoef(t, 8);
  4.  
    cfs9=wpcoef(t, 9);
  5.  
    cfs10=wpcoef(t, 10);
  6.  
    cfs11=wpcoef(t, 11);
  7.  
    cfs12=wpcoef(t, 12);
  8.  
    cfs13=wpcoef(t, 13);
  9.  
    cfs14=wpcoef(t, 14);
  10.  
    t3= write(t,'cfs',7,cfs7,'cfs',8,cfs8,'cfs',9,cfs9,'cfs',10,cfs10,'cfs',11,cfs11,'cfs',...
  11.  
    12,cfs12,'cfs',13,cfs13,'cfs',14,cfs14);
  12.  
    y=wprec(t3);

該例子也是對一個小波包展開了,又原封不動的裝回去了,只不過這次是直接對第三層節點進行的。

5.小波包-----信號分解與重構(方法2)

該方法只能對某一節點信號系數分別進行重構,不能實現多個節點系數組合進行重構.

接下來進行舉例說明:

  1.  
    x_input=x_train(:, 1,1); %輸入數據
  2.  
    plot(x_input);title( '輸入信號時域圖像') %繪制輸入信號時域圖像

  1.  
    %% 查看頻譜范圍
  2.  
    x=x_input;
  3.  
    fs=128;
  4.  
    N=length(x); %采樣點個數
  5.  
    signalFFT=abs(fft(x,N));%真實的幅值
  6.  
    Y= 2*signalFFT/N;
  7.  
    f=( 0:N/2)*(fs/N);
  8.  
    figure;plot(f,Y( 1:N/2+1));
  9.  
    ylabel( 'amp'); xlabel('frequency');title('輸入信號的頻譜');grid on

接下來進行4層小波包分解

  1.  
    wpt=wpdec(x_input, 3,'dmey'); %進行3層小波包分解
  2.  
    plot(wpt); %繪制小波包樹

接下來,我們查看第3層8個節點的頻譜分布(我的輸入信號采樣頻率是128,按照采樣定理小波包分解根節點(0,0)處的頻率應該為0-64Hz,按照這個計算(3,0)節點為0-8Hz,后面依次以8Hz為一個段遞增)

首先展示最初的重構方法(頻率排布順序混亂,常見理解錯誤)

  1.  
    for i=0:7
  2.  
    rex3( :,i+1)=wprcoef(wpt,[3 i]); %實現對節點小波節點進行重構
  3.  
    end
  4.  
     
  5.  
    figure; %繪制第 3層各個節點分別重構后信號的頻譜
  6.  
    for i=0:7
  7.  
    subplot( 2,4,i+1);
  8.  
    x_sign=rex3( :,i+1);
  9.  
    N=length(x_sign); %采樣點個數
  10.  
    signalFFT=abs(fft(x_sign,N));%真實的幅值
  11.  
    Y= 2*signalFFT/N;
  12.  
    f=( 0:N/2)*(fs/N);
  13.  
    plot(f,Y( 1:N/2+1));
  14.  
    ylabel( 'amp'); xlabel('frequency');grid on
  15.  
    axis([ 0 50 0 0.03]); title(['小波包第3層',num2str(i),'節點信號頻譜']);
  16.  
    end

繪制完后你會發現頻譜分布並不是按照之前理解的順序依次遞增排列,如下所示

那么問題出在哪里呢?經過仔細深入驗證后發現問題出在小波包節點的頻譜划分“不是嚴格按照上述理解的順序排列的”(可能是一種格雷編碼或者其他),要解決這個問題我們需要對節點順序進行重新編碼排序。參考這里https://www.ilovematlab.cn/thread-122226-1-1.html?tdsourcetag=s_pctim_aiomsg

  1.  
    nodes=[ 7;8;9;10;11;12;13;14]; %第3層的節點號
  2.  
    ord=wpfrqord(nodes);  %小波包系數重排,ord是重排后小波包系數索引構成的矩陣 如3層分解的[1;2;4;3;7;8;6;5]
  3.  
    nodes_ord=nodes( ord); %重排后的小波系數

注意:節點的命名規則是從(1,0)開始,叫1號, (1,1)是2號………依此類推,(3,0)是7號,(3,7)是14號。

那么我們來看看經過上面這段重排序運行后nodes_ord中順序是什么?

接下來我們再繪制一下第三層8個節點重構信號的頻譜如下

  1.  
    for i=1:8
  2.  
    rex3( :,i)=wprcoef(wpt,nodes_ord(i)); %實現對節點小波節點進行重構
  3.  
    end
  4.  
     
  5.  
    figure; %繪制第 3層各個節點分別重構后信號的頻譜
  6.  
    for i=0:7
  7.  
    subplot( 2,4,i+1);
  8.  
    x_sign= rex3( :,i+1);
  9.  
    N=length(x_sign); %采樣點個數
  10.  
    signalFFT=abs(fft(x_sign,N));%真實的幅值
  11.  
    Y= 2*signalFFT/N;
  12.  
    f=( 0:N/2)*(fs/N);
  13.  
    plot(f,Y( 1:N/2+1));
  14.  
    ylabel( 'amp'); xlabel('frequency');grid on
  15.  
    axis([ 0 50 0 0.03]); title(['小波包第3層',num2str(i),'節點信號頻譜']);
  16.  
    end

到這里為止不知道大家有沒有明白我要表達的意思,如果沒有明白可以再反復看理解,或者自己進行分解后觀察每個節點的頻譜后或許就理解了。

6.小波包分解------能量特征提取(方法1)

接下來繪制第3層各個頻段的能量占比

  1.  
    %% wavelet packet coefficients. 求取小波包分解的各個節點的小波包系數
  2.  
    cfs3_0=wpcoef(wpt,nodes_ord(1)); %對重排序后第3層0節點的小波包系數0-8Hz
  3.  
    cfs3_1=wpcoef(wpt,nodes_ord( 2)); %對重排序后第3層0節點的小波包系數8-16Hz
  4.  
    cfs3_2=wpcoef(wpt,nodes_ord( 3)); %對重排序后第3層0節點的小波包系數16-24Hz
  5.  
    cfs3_3=wpcoef(wpt,nodes_ord( 4)); %對重排序后第3層0節點的小波包系數24-32Hz
  6.  
    cfs3_4=wpcoef(wpt,nodes_ord( 5)); %對重排序后第3層0節點的小波包系數32-40Hz
  7.  
    cfs3_5=wpcoef(wpt,nodes_ord( 6)); %對重排序后第3層0節點的小波包系數40-48Hz
  8.  
    cfs3_6=wpcoef(wpt,nodes_ord( 7)); %對重排序后第3層0節點的小波包系數48-56Hz
  9.  
    cfs3_7=wpcoef(wpt,nodes_ord( 8)); %對重排序后第3層0節點的小波包系數56-64Hz
  10.  
     
  11.  
    E_cfs3_ 0=norm(cfs3_0,2)^2; %% 1-范數:就是norm(...,1),即各元素絕對值之和;2-范數:就是norm(...,2),即各元素平方和開根號;
  12.  
    E_cfs3_1=norm(cfs3_1,2)^2;
  13.  
    E_cfs3_2=norm(cfs3_2,2)^2;
  14.  
    E_cfs3_3=norm(cfs3_3,2)^2;
  15.  
    E_cfs3_4=norm(cfs3_4,2)^2;
  16.  
    E_cfs3_5=norm(cfs3_5,2)^2;
  17.  
    E_cfs3_6=norm(cfs3_6,2)^2;
  18.  
    E_cfs3_7=norm(cfs3_7,2)^2;
  19.  
    E_total=E_cfs3_0+E_cfs3_1+E_cfs3_2+E_cfs3_3+E_cfs3_4+E_cfs3_5+E_cfs3_6+E_cfs3_7;
  20.  
     
  21.  
    p_node(0)= 100*E_cfs3_0/E_total; % 求得每個節點的占比
  22.  
    p_node( 2)= 100*E_cfs3_1/E_total; % 求得每個節點的占比
  23.  
    p_node( 3)= 100*E_cfs3_2/E_total; % 求得每個節點的占比
  24.  
    p_node( 4)= 100*E_cfs3_3/E_total; % 求得每個節點的占比
  25.  
    p_node( 5)= 100*E_cfs3_4/E_total; % 求得每個節點的占比
  26.  
    p_node( 6)= 100*E_cfs3_5/E_total; % 求得每個節點的占比
  27.  
    p_node( 7)= 100*E_cfs3_6/E_total; % 求得每個節點的占比
  28.  
    p_node( 8)= 100*E_cfs3_7/E_total; % 求得每個節點的占比
  29.  
     
  30.  
    figure;
  31.  
    x= 1:8;
  32.  
    bar(x,p_node);
  33.  
    title( '各個頻段能量所占的比例');
  34.  
    xlabel( '頻率 Hz');
  35.  
    ylabel( '能量百分比/%');
  36.  
    for j=1:8
  37.  
    text(x(j),p_node(j),num2str(p_node(j), '%0.2f'),...
  38.  
    'HorizontalAlignment','center',...
  39.  
    'VerticalAlignment','bottom')
  40.  
    end

7.小波包分解------能量特征提取(方法2)

直接運行matlab自帶函數,如下

E = wenergy(wpt);   %該函數只能對最后一層(底層)節點進行能量提取

(引用:https://blog.csdn.net/it_beecoder/article/details/78668273

這里對比一下,和方法1得到的圖形基本上是一致的,不同之處在於排列順序變了,方法2中的順序是按照小波包分解函數自動排列順序,方法1經過重排序后為按照頻率段遞增順序依次排列順序的

  1.  
    %% 繪制重構前各個頻段小波包系數
  2.  
    figure( 1);
  3.  
    subplot( 4,1,1);
  4.  
    plot(x_input);
  5.  
    title( '原始信號');
  6.  
    subplot( 4,1,2);
  7.  
    plot(cfs3_0);
  8.  
    title([ '層數 ',num2str(3) ' 節點 0的小波0-8Hz',' 系數'])
  9.  
    subplot( 4,1,3);
  10.  
    plot(cfs3_1);
  11.  
    title([ '層數 ',num2str(3) ' 節點 1的小波8-16Hz',' 系數'])
  12.  
    subplot( 4,1,4);
  13.  
    plot(cfs3_2);
  14.  
    title([ '層數 ',num2str(3) ' 節點 2的小波16-24Hz',' 系數'])

  1.  
    %% 繪制重構后時域各個特征頻段的圖形
  2.  
    figure( 3);
  3.  
    subplot( 3,1,1);
  4.  
    plot(rex3(:, 1));
  5.  
    title( '重構后0-8Hz頻段信號');
  6.  
    subplot( 3,1,2);
  7.  
    plot(rex3(:, 2));
  8.  
    title( '重構后8-16Hz頻段信號')
  9.  
    subplot( 3,1,3);
  10.  
    plot(rex3(:, 3));
  11.  
    title( '重構后16-24Hz頻段信號');

以上過程完整代碼

  1.  
    clear all;
  2.  
     
  3.  
    x_input=x_train(:, 1,1); %輸入數據
  4.  
    plot(x_input);title( '輸入信號時域圖像') %繪制輸入信號時域圖像
  5.  
     
  6.  
    x=x_input; % 查看頻譜范圍
  7.  
    fs= 128;
  8.  
    N= length(x); %采樣點個數
  9.  
    signalFFT= abs(fft(x,N));%真實的幅值
  10.  
    Y= 2*signalFFT/N;
  11.  
    f=( 0:N/2)*(fs/N);
  12.  
    figure;plot(f,Y( 1:N/2+1));
  13.  
    ylabel( 'amp'); xlabel('frequency');title('輸入信號的頻譜');grid on
  14.  
     
  15.  
    wpt=wpdec(x_input, 3,'dmey'); %進行4層小波包分解
  16.  
    plot(wpt); %繪制小波包樹
  17.  
     
  18.  
    %% 實現對節點順序按照頻率遞增進行重排序
  19.  
    % nodes=get(wpt, 'tn'); %小波包分解系數 為什么nodes是[7;8;9;10;11;12;13;14]
  20.  
    % N_cfs= length(nodes); %小波包系數個數
  21.  
    nodes=[ 7;8;9;10;11;12;13;14];
  22.  
    ord=wpfrqord(nodes); %小波包系數重排,ord是重排后小波包系數索引構成的矩陣 如3層分解的[1;2;4;3;7;8;6;5]
  23.  
    nodes_ord=nodes( ord); %重排后的小波系數
  24.  
     
  25.  
    %% 實現對節點小波節點進行重構
  26.  
    for i=1:8
  27.  
    rex3(:,i)=wprcoef(wpt,nodes_ord(i));
  28.  
    end
  29.  
     
  30.  
    %% 繪制第 3層各個節點分別重構后信號的頻譜
  31.  
    figure;
  32.  
    for i=0:7
  33.  
    subplot( 2,4,i+1);
  34.  
    x_sign= rex3(:,i+ 1);
  35.  
    N= length(x_sign); %采樣點個數
  36.  
    signalFFT= abs(fft(x_sign,N));%真實的幅值
  37.  
    Y= 2*signalFFT/N;
  38.  
    f=( 0:N/2)*(fs/N);
  39.  
    plot(f,Y( 1:N/2+1));
  40.  
    ylabel( 'amp'); xlabel('frequency');grid on
  41.  
    axis([ 0 50 0 0.03]); title(['小波包第3層',num2str(i),'節點信號頻譜']);
  42.  
    end
  43.  
     
  44.  
    %% wavelet packet coefficients. 求取小波包分解的各個頻段的小波包系數
  45.  
    cfs3_ 0=wpcoef(wpt,nodes_ord(1)); %對重排序后第3層0節點的小波包系數0-8Hz
  46.  
    cfs3_1=wpcoef(wpt,nodes_ord( 2)); %對重排序后第3層0節點的小波包系數8-16Hz
  47.  
    cfs3_2=wpcoef(wpt,nodes_ord( 3)); %對重排序后第3層0節點的小波包系數16-24Hz
  48.  
    cfs3_3=wpcoef(wpt,nodes_ord( 4)); %對重排序后第3層0節點的小波包系數24-32Hz
  49.  
    cfs3_4=wpcoef(wpt,nodes_ord( 5)); %對重排序后第3層0節點的小波包系數32-40Hz
  50.  
    cfs3_5=wpcoef(wpt,nodes_ord( 6)); %對重排序后第3層0節點的小波包系數40-48Hz
  51.  
    cfs3_6=wpcoef(wpt,nodes_ord( 7)); %對重排序后第3層0節點的小波包系數48-56Hz
  52.  
    cfs3_7=wpcoef(wpt,nodes_ord( 8)); %對重排序后第3層0節點的小波包系數56-64Hz
  53.  
    %% 求取小波包分解的各個頻段的能量
  54.  
    E_cfs3_ 0=norm(cfs3_0,2)^2; %% 1-范數:就是norm(...,1),即各元素絕對值之和;2-范數:就是norm(...,2),即各元素平方和開根號;
  55.  
    E_cfs3_1=norm(cfs3_1, 2)^2;
  56.  
    E_cfs3_2=norm(cfs3_2, 2)^2;
  57.  
    E_cfs3_3=norm(cfs3_3, 2)^2;
  58.  
    E_cfs3_4=norm(cfs3_4, 2)^2;
  59.  
    E_cfs3_5=norm(cfs3_5, 2)^2;
  60.  
    E_cfs3_6=norm(cfs3_6, 2)^2;
  61.  
    E_cfs3_7=norm(cfs3_7, 2)^2;
  62.  
    E_total=E_cfs3_ 0+E_cfs3_1+E_cfs3_2+E_cfs3_3+E_cfs3_4+E_cfs3_5+E_cfs3_6+E_cfs3_7;
  63.  
     
  64.  
    p_node( 0)= 100*E_cfs3_0/E_total; % 求得每個節點的占比
  65.  
    p_node( 2)= 100*E_cfs3_1/E_total; % 求得每個節點的占比
  66.  
    p_node( 3)= 100*E_cfs3_2/E_total; % 求得每個節點的占比
  67.  
    p_node( 4)= 100*E_cfs3_3/E_total; % 求得每個節點的占比
  68.  
    p_node( 5)= 100*E_cfs3_4/E_total; % 求得每個節點的占比
  69.  
    p_node( 6)= 100*E_cfs3_5/E_total; % 求得每個節點的占比
  70.  
    p_node( 7)= 100*E_cfs3_6/E_total; % 求得每個節點的占比
  71.  
    p_node( 8)= 100*E_cfs3_7/E_total; % 求得每個節點的占比
  72.  
     
  73.  
    figure;
  74.  
    x=1:8;
  75.  
    bar( x,p_node);
  76.  
    title( '各個頻段能量所占的比例');
  77.  
    xlabel( '頻率 Hz');
  78.  
    ylabel( '能量百分比/%');
  79.  
    for j=1:8
  80.  
    text( x(j),p_node(j),num2str(p_node(j),'%0.2f'),...
  81.  
    'HorizontalAlignment','center',...
  82.  
    'VerticalAlignment','bottom')
  83.  
    end
  84.  
    % E = wenergy(wpt); %求取各個節點能量
  85.  
     
  86.  
    %% 繪制重構前各個特征頻段小波包系數的圖形
  87.  
    figure( 1);
  88.  
    subplot( 4,1,1);
  89.  
    plot(x_input);
  90.  
    title( '原始信號');
  91.  
    subplot( 4,1,2);
  92.  
    plot(cfs3_ 0);
  93.  
    title([ '層數 ',num2str(3) ' 節點 0的小波0-8Hz',' 系數'])
  94.  
    subplot( 4,1,3);
  95.  
    plot(cfs3_1);
  96.  
    title([ '層數 ',num2str(3) ' 節點 1的小波8-16Hz',' 系數'])
  97.  
    subplot( 4,1,4);
  98.  
    plot(cfs3_2);
  99.  
    title([ '層數 ',num2str(3) ' 節點 2的小波16-24Hz',' 系數'])
  100.  
     
  101.  
    %% 繪制重構后時域各個特征頻段的圖形
  102.  
    figure( 3);
  103.  
    subplot( 3,1,1);
  104.  
    plot(rex3(:, 1));
  105.  
    title( '重構后0-8Hz頻段信號');
  106.  
    subplot( 3,1,2);
  107.  
    plot(rex3(:, 2));
  108.  
    title( '重構后8-16Hz頻段信號')
  109.  
    subplot( 3,1,3);
  110.  
    plot(rex3(:, 3));
  111.  
    title( '重構后16-24Hz頻段信號');
  112.  
     

8.小波----常見基函數

     與標准的傅里葉變換相比,小波分析中使用到的小波函數具有不唯一性,即小波函數 具有多樣性。小波分析在工程應用中,一個十分重要的問題就是最優小波基的選擇問題,因為用不同的小波基分析同一個問題會產生不同的結果。目前我們主要是通過用小波分析方法處理信號的結果與理論結果的誤差來判定小波基的好壞,由此決定小波基。

     常用小波基有Haar小波、Daubechies(dbN)小波、Mexican Hat(mexh)小波、Morlet小波、Meyer小波等。

     1.Haar小波Haar函數是小波分析中最早用到的一個具有緊支撐的正交小波函數,也是最簡單的一個小波函數,它是支撐域在范圍內的單個矩形波。Haar函數的定義如下:Haar小波在時域上是不連續的,所以作為基本小波性能不是特別好。但它也有自己的優點:計算簡單。不但與正交,而且與自己的整數位移正交,因此,在的多分辨率系統中,Haar小波構成一組最簡單的正交歸一的小波族。

  1.  
    [phi,g1,xval] = wavefun( 'haar',20);
  2.  
    subplot( 2,1,1);
  3.  
    plot(xval,g1, 'LineWidth',2);
  4.  
    xlabel( 't');
  5.  
    title( 'haar 時域');
  6.  
    g2=fft(g1);
  7.  
    g3= abs(g2);
  8.  
    subplot( 2,1,2);
  9.  
    plot(g3, 'LineWidth',2);
  10.  
    xlabel( 'f')title('haar 頻域');

                                      

2.Daubechies(dbN)小波Daubechies小波是世界著名的小波分析學者Inrid·Daubechies構造的小波函數,簡寫為dbN,N是小波的階數。小波和尺度函數中的支撐區為的消失矩為。除(Harr小波)外,dbN不具有對稱性(即非線性相位)。除(Harr小波)外,dbN沒有明確的表達式,但轉換函數h的平方模是明確的:令,其中為二項式的系數,則有其中:Daubechies小波具有以下特點:在時域是有限支撐的,即長度有限。在頻域在處有N階零點。和它的整數位移正交歸一,即。小波函數可以由所謂“尺度函數”求出來。尺度函數為低通函數,長度有限,支撐域在的范圍內。

  1.  
    db4的時域和頻域波形:
  2.  
    [phi,g1,xval] = wavefun( 'db4',10);
  3.  
    subplot( 2,1,1);
  4.  
    plot(xval,g1, 'LineWidth',2);
  5.  
    xlabel( 't')title('db4 時域');
  6.  
    g2=fft(g1);
  7.  
    g3= abs(g2);
  8.  
    subplot( 2,1,2);
  9.  
    plot(g3, 'LineWidth',2);
  10.  
    xlabel( 'f')title('db4 頻域');

                                  

  1.  
    Daubechies小波常用來分解和重構信號,作為濾波器使用:
  2.  
    [ Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db4'); %計算該小波的4個濾波器
  3.  
    subplot( 2,2,1);
  4.  
    stem(Lo_D, 'LineWidth',2);
  5.  
    title( '分解低通濾波器');
  6.  
    subplot( 2,2,2);
  7.  
    stem(Hi_D, 'LineWidth',2);
  8.  
    title( '分解高通濾波器');
  9.  
    subplot( 2,2,3);
  10.  
    stem(Lo_R, 'LineWidth',2);
  11.  
    title( '重構低通濾波器');
  12.  
    subplot( 2,2,4);
  13.  
    stem(Hi_R, 'LineWidth',2);
  14.  
    title( '重構高通濾波器');

                              

  3.Mexican Hat(mexh)小波Mexican Hat函數為Gauss函數的二階導數:因為它的形狀像墨西哥帽的截面,所以也稱為墨西哥帽函數。Mexihat小波的時域和頻域波形:

  1.  
    Mexihat小波的時域和頻域波形:
  2.  
    d=- 6; h=6; n=100;
  3.  
    [g1, x]=mexihat(d,h,n);
  4.  
    subplot( 2,1,1);
  5.  
    plot( x,g1,'LineWidth',2);
  6.  
    xlabel( 't');
  7.  
    title( 'Mexihat 時域');
  8.  
    g2=fft(g1);
  9.  
    g3=( abs(g2));
  10.  
    subplot( 2,1,2);
  11.  
    plot(g3, 'LineWidth',2);
  12.  
    xlabel( 'f');
  13.  
    title( 'mexihat 頻域');

                                  

Mexihat小波的特點:在時間域與頻率域都有很好的局部化,並且滿足。不存在尺度函數,所以Mexihat小波函數不具有正交性。

 4.Morlet小波它是高斯包絡下的單頻率副正弦函數:其中C是重構時的歸一化常數。Morlet小波沒有尺度函數,而且是非正交分解。Morlet小波的時域和頻域波形圖:

  1.  
    d=- 6; h=6; n=100;
  2.  
    [g1, x]=morlet(d,h,n);
  3.  
    subplot( 2,1,1);
  4.  
    plot( x,g1,'LineWidth',2);
  5.  
    xlabel( 't');
  6.  
    title( 'morlet 時域');
  7.  
    g2=fft(g1);
  8.  
    g3=( abs(g2));
  9.  
    subplot( 2,1,2);
  10.  
    plot(g3, 'LineWidth',2);
  11.  
    xlabel( 'f');
  12.  
    title( 'mexihat 頻域');

                                 

注:

獲取小波系數的兩個函數理解:

Wpcoef 是求解某個節點的小波包系數,數據長度是1/(2^n)(分解n層的話),其實就是將原始信號化成2^N段,每段的長度是相等的且比原信號短

wprcoef是把某個節點的小波包系數重構,得到的是和原信號一樣長度的信號。

傅里葉變換與小波變換理解參考:

https://zhuanlan.zhihu.com/p/22450818

https://zhuanlan.zhihu.com/p/19763358

https://www.jianshu.com/p/5b5c160c7e3a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM