精华内容
下载资源
问答
  • 小波包能量特征提取
    2020-12-08 18:29:44

    1. 小波外部包下载

    要下载两个包:

    PyWavelets和Matplotlib(要运行PyWavelets的所有测试,您还需要安装 Matplotlib软件包。)

    下载方法:pip install PyWavelets

    pip install Matplotlib

    相关链接:

    PyWavelets官网:里面有很多的API文档,有小波(小波家族,内置小波等),离散小波变换,逆小波变换等等

    小波包的相关用法实例

    2. 小波包的使用

    2.1 导入相关的包

    下面的导入的包中主要是pywt和matplotlibimport numpy as np

    import matplotlib.pyplot as plt

    import os

    from sklearn import preprocessing

    import pywt

    import pywt.data

    import pandas as pd

    2.2  小波包各节点按照频率由低到高wp = pywt.WaveletPacket(data=tr, wavelet='db1',mode='symmetric',maxlevel=3)

    #根据频段频率(freq)进行排序

    print([node.path for node in wp.get_level(1, 'freq')])

    print([node.path for node in wp.get_level(2, 'freq')])

    print([node.path for node in wp.get_level(3, 'freq')])

    代码中tr表示输入的一维数据,执行结果如下['a', 'd']

    ['aa', 'ad', 'dd', 'da']

    ['aaa', 'aad', 'add', 'ada', 'dda', 'ddd', 'dad', 'daa']

    2.3 打印小波家族pywt.families()

    #pywt.families(short=False)

    执行结果如下:['haar', 'db', 'sym', 'coif', 'bior', 'rbio', 'dmey', 'gaus', 'mexh', 'morl', 'cgau', 'shan', 'fbsp', 'cmor']

    2.4 小波包的分解

    (1)小波包分解中关键方法:wp = pywt.WaveletPacket(data=tr, wavelet='db1',mode='symmetric',maxlevel=3)

    该方法输入原始信号tr, 小波函数'db1',模式'symmetric',以及最大的分解层数为3。返回wp是小波包树,根据小波包树我们可以提取分解系数。

    (2)提取分解系数:

    下面aaa是小波包变换第三层第一个的分解系数aaa = wp['aaa'].data

    所以可以使用下面的方法提取每一层的每个节点的小波系数,当然这个方法不太方便,需要一个一个的写,后面有更好的方法:a = wp['a'].data #第1个节点

    d = wp['d'].data #第2个节点

    #第二层

    aa = wp['aa'].data

    ad = wp['ad'].data

    dd = wp['dd'].data

    da = wp['da'].data

    #第三层

    aaa = wp['aaa'].data

    aad = wp['aad'].data

    ada = wp['add'].data

    add = wp['ada'].data

    daa = wp['dda'].data

    dad = wp['ddd'].data

    dda = wp['dad'].data

    ddd = wp['daa'].data

    (3) 作小波树图,下面代码中没有优化,后面做了优化:plt.figure(figsize=(15, 10))

    plt.subplot(4,1,1)

    plt.plot(tr)

    #第一层

    plt.subplot(4,2,3)

    plt.plot(a)

    plt.subplot(4,2,4)

    plt.plot(d)

    #第二层

    plt.subplot(4,4,9)

    plt.plot(aa)

    plt.subplot(4,4,10)

    plt.plot(ad)

    plt.subplot(4,4,11)

    plt.plot(dd)

    plt.subplot(4,4,12)

    plt.plot(da)

    #第三层

    plt.subplot(4,8,25)

    plt.plot(aaa)

    plt.subplot(4,8,26)

    plt.plot(aad)

    plt.subplot(4,8,27)

    plt.plot(add)

    plt.subplot(4,8,28)

    plt.plot(ada)

    plt.subplot(4,8,29)

    plt.plot(dda)

    plt.subplot(4,8,30)

    plt.plot(ddd)

    plt.subplot(4,8,31)

    plt.plot(dad)

    plt.subplot(4,8,32)

    plt.plot(daa)

    下图中使用的是心电信号,需要注意的是有些图形的刻度值太长嵌入了图中,结果图:

    (4) 代码优化,使用的wpd_plt(signal,n)将上面的代码优化和封装了,signal代表输入信号,n代表分解层数:def wpd_plt(signal,n):

    #wpd分解

    wp = pywt.WaveletPacket(data=signal, wavelet='db1',mode='symmetric',maxlevel=n)

    #计算每一个节点的系数,存在map中,key为'aa'等,value为列表

    map = {}

    map[1] = signal

    for row in range(1,n+1):

    lev = []

    for i in [node.path for node in wp.get_level(row, 'freq')]:

    map[i] = wp[i].data

    #作图

    plt.figure(figsize=(15, 10))

    plt.subplot(n+1,1,1) #绘制第一个图

    plt.plot(map[1])

    for i in range(2,n+2):

    level_num = pow(2,i-1) #从第二行图开始,计算上一行图的2的幂次方

    #获取每一层分解的node:比如第三层['aaa', 'aad', 'add', 'ada', 'dda', 'ddd', 'dad', 'daa']

    re = [node.path for node in wp.get_level(i-1, 'freq')]

    for j in range(1,level_num+1):

    plt.subplot(n+1,level_num,level_num*(i-1)+j)

    plt.plot(map[re[j-1]]) #列表从0开始

    2.5 小波包能量特征提取n = 3

    re = [] #第n层所有节点的分解系数

    for i in [node.path for node in wp.get_level(n, 'freq')]:

    re.append(wp[i].data)

    #第n层能量特征

    energy = []

    for i in re:

    energy.append(pow(np.linalg.norm(i,ord=None),2))

    #for i in energy:

    # print(i)

    绘制小波能量特征柱形图,注意这里的节点顺序不是自然分解的顺序,而是频率由低到高的顺序:# 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸

    plt.figure(figsize=(10, 7), dpi=80)

    # 再创建一个规格为 1 x 1 的子图

    # plt.subplot(1, 1, 1)

    # 柱子总数

    N = 8

    values = energy

    # 包含每个柱子下标的序列

    index = np.arange(N)

    # 柱子的宽度

    width = 0.45

    # 绘制柱状图, 每根柱子的颜色为紫罗兰色

    p2 = plt.bar(index, values, width, label="num", color="#87CEFA")

    # 设置横轴标签

    plt.xlabel('clusters')

    # 设置纵轴标签

    plt.ylabel('number of reviews')

    # 添加标题

    plt.title('Cluster Distribution')

    # 添加纵横轴的刻度

    plt.xticks(index, ('7', '8', '9', '10', '11', '12', '13', '14'))

    # plt.yticks(np.arange(0, 10000, 10))

    # 添加图例

    plt.legend(loc="upper right")

    plt.show()

    作图如下:

    ------------------------------------------------------------未完待续------------------------------------------------------------------------

    更多相关内容
  • 小波包能量特征提取

    千次阅读 2020-06-20 22:20:58
    最近在弄小波包能量特征提取,可以说弄了很长时间。 废话不多说,抓紧时间上重点! 小波变换 小波变换是处理低频的信息,但是对于高频却不能处理。不能处理非线性、非平稳的信号(例如滚动轴承)。 波包变化 因为...

    最近在弄小波包能量特征提取,可以说弄了很长时间。
    废话不多说,抓紧时间上重点!

    小波变换

    小波变换是处理低频的信息,但是对于高频却不能处理。不能处理非线性、非平稳的信号(例如滚动轴承)。

    小波包变化

    因为有不足,才会发展;知识也是这样,所以小波包问世。小波包变化弥补了小波变换的不足之处,即可对低频也可对高频信号处理;
    在这里插入图片描述

    小波包能量特征提取

    我提取的是8维db3小波包能量特征,以上即是小波包树,其中节点的命名规则是从(1,0)开始,叫1号, (1,1)是2号………依此类推,(3,0)是7号,(3,7)是14号。 每个节点都有对应的小波包系数,这个系数决定了频率的大小。
    在这里插入图片描述

    代码

    function E =wavelet_energy_spectrum( wpt,n )
    %% 计算每一层每一个节点的能量
    % wpt-wavelet packet tree
    % n-第n层能量
    %
    % Author hubery_zhang
    % Date 20170714

    %%
    % 求第n层第i个节点的系数
    E(1:2^n )=0;
    for i=1:2^n
    E(i) = norm(wpcoef(wpt,[n,i-1]),2); %求第i个节点的范数平方,其实也就是平方和
    end
    %求每个节点的概率
    E_total=sum(E);
    for i=1:2^n
    p_node(i)= 100*E(i)/E_total;
    end
    % E = wenergy(wpt); only get the last layer
    figure;
    x=1:2^n;
    bar(x,p_node);
    title([‘第’,num2str(n),‘层’]);
    axis([0 2^n 0 100]);
    xlabel(‘结点’);
    ylabel(‘能量百分比/%’);
    for j=1:2^n
    text(x(j),p_node(i),num2str(p_node(j),’%0.2f’),…
    ‘HorizontalAlignment’,‘center’,…
    ‘VerticalAlignment’,‘bottom’)
    end

    end

    展开全文
  • 用matlab实现小波包能量分析,可以提取特征信号
  • 对于声发射信号的VMD 分解,,,,,,,,,,,,,,,,,,,,,,,,,,
  • 波与波包、波包分解与信号重构、小波包能量特征提取 (Matlab 程序详解) -----暨 波包分解后解决频率大小分布重新排列问题 本人当前对波理解不是很深入,通过翻阅网络他人博客,进行汇总总结,重新...

            小波与小波包、小波包分解与信号重构、小波包能量特征提取   (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的正弦波混合的,我们用小波包来分解。

    clear all  
    clc
    fs=1024;  %采样频率
    f1=100;   %信号的第一个频率
    f2=300;   %信号第二个频率
    t=0:1/fs:1;
    s=sin(2*pi*f1*t)+sin(2*pi*f2*t);  %生成混合信号
    [tt]=wpdec(s,3,'dmey');  %小波包分解,3代表分解3层,'dmey'使用meyr小波
    plot(tt)               %画小波包树图
    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进来就行了。

    t=wpdec(wave,3,'dmey');
    t2 = wpjoin(t,[3;4;5;6]);
    sNod = read(t,'sizes',[3,4,5,6]);
    cfs3  = zeros(sNod(1,:));
    cfs4  = zeros(sNod(2,:));
    cfs5  = zeros(sNod(3,:));
    cfs6  = zeros(sNod(4,:));
    t3 = write(t2,'cfs',3,cfs3,'cfs',4,cfs4,'cfs',5,cfs5,'cfs',6,cfs6);
    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

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

    解释:

    第一行:将wave 用 dmey小波进行3层小波包分解,获得一个小波包树 t

    第二行:将小波包树的第二行的四个节点收起来,也就是让第二行的节点变为树的最底层节点。

    第三~六行:获取四个节点的小波包系数 (小波包系数就是一个一维向量)

    第七行:将四个节点的系数重组到t3小波树中

    第八行:对t3小波树进行重构,获得信号wave2

    可以看出,该例子就是对一个小波包展开了,又原封不动的装回去了,所以说 wave2和wave是一样的。

    注意,wpjoin命令在这里是必要的,因为write函数只能将最底层的节点写进去。也就是说,如果我们将第三层的小波包系数进行修改的话,就不用wpjoin了,具体可以看例3

    3

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

    该例子也是对一个小波包展开了,又原封不动的装回去了,只不过这次是直接对第三层节点进行的。

    5.小波包-----信号分解与重构(方法2)

    该方法只能对某一节点信号系数分别进行重构,不能实现多个节点系数组合进行重构.

    接下来进行举例说明:

    x_input=x_train(:,1,1);                  %输入数据
    plot(x_input);title('输入信号时域图像')   %绘制输入信号时域图像

    %%   查看频谱范围
    x=x_input;       
    fs=128;
    N=length(x); %采样点个数
    signalFFT=abs(fft(x,N));%真实的幅值
    Y=2*signalFFT/N;
    f=(0:N/2)*(fs/N);
    figure;plot(f,Y(1:N/2+1));
    ylabel('amp'); xlabel('frequency');title('输入信号的频谱');grid on

    接下来进行4层小波包分解

    wpt=wpdec(x_input,3,'dmey');        %进行3层小波包分解
    plot(wpt);                          %绘制小波包树

    接下来,我们查看第3层8个节点的频谱分布(我的输入信号采样频率是128,按照采样定理小波包分解根节点(0,0)处的频率应该为0-64Hz,按照这个计算(3,0)节点为0-8Hz,后面依次以8Hz为一个段递增)

    首先展示最初的重构方法(频率排布顺序混乱,常见理解错误)

    for i=0:7
    rex3(:,i+1)=wprcoef(wpt,[3 i]);  %实现对节点小波节点进行重构        
    end
    
    figure;                          %绘制第3层各个节点分别重构后信号的频谱
    for i=0:7
    subplot(2,4,i+1);
    x_sign=rex3(:,i+1); 
    N=length(x_sign); %采样点个数
    signalFFT=abs(fft(x_sign,N));%真实的幅值
    Y=2*signalFFT/N;
    f=(0:N/2)*(fs/N);
    plot(f,Y(1:N/2+1));
    ylabel('amp'); xlabel('frequency');grid on
    axis([0 50 0 0.03]); title(['小波包第3层',num2str(i),'节点信号频谱']);
    end

    绘制完后你会发现频谱分布并不是按照之前理解的顺序依次递增排列,如下所示

    那么问题出在哪里呢?经过仔细深入验证后发现问题出在小波包节点的频谱划分“不是严格按照上述理解的顺序排列的”(可能是一种格雷编码或者其他),要解决这个问题我们需要对节点顺序进行重新编码排序。参考这里https://www.ilovematlab.cn/thread-122226-1-1.html?tdsourcetag=s_pctim_aiomsg

    nodes=[7;8;9;10;11;12;13;14];   %第3层的节点号
    ord=wpfrqord(nodes);  %小波包系数重排,ord是重排后小波包系数索引构成的矩阵 如3层分解的[1;2;4;3;7;8;6;5]
    nodes_ord=nodes(ord); %重排后的小波系数

    注意:节点的命名规则是从(1,0)开始,叫1号, (1,1)是2号………依此类推,(3,0)是7号,(3,7)是14号

    那么我们来看看经过上面这段重排序运行后nodes_ord中顺序是什么?

    接下来我们再绘制一下第三层8个节点重构信号的频谱如下

    for i=1:8
    rex3(:,i)=wprcoef(wpt,nodes_ord(i));  %实现对节点小波节点进行重构        
    end
    
    figure;                         %绘制第3层各个节点分别重构后信号的频谱
    for i=0:7
    subplot(2,4,i+1);
    x_sign= rex3(:,i+1); 
    N=length(x_sign); %采样点个数
    signalFFT=abs(fft(x_sign,N));%真实的幅值
    Y=2*signalFFT/N;
    f=(0:N/2)*(fs/N);
    plot(f,Y(1:N/2+1));
    ylabel('amp'); xlabel('frequency');grid on
    axis([0 50 0 0.03]); title(['小波包第3层',num2str(i),'节点信号频谱']);
    end
    

    到这里为止不知道大家有没有明白我要表达的意思,如果没有明白可以再反复看理解,或者自己进行分解后观察每个节点的频谱后或许就理解了。

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

    接下来绘制第3层各个频段的能量占比

    %% wavelet packet coefficients. 求取小波包分解的各个节点的小波包系数
    cfs3_0=wpcoef(wpt,nodes_ord(1));  %对重排序后第3层0节点的小波包系数0-8Hz
    cfs3_1=wpcoef(wpt,nodes_ord(2));  %对重排序后第3层0节点的小波包系数8-16Hz
    cfs3_2=wpcoef(wpt,nodes_ord(3));  %对重排序后第3层0节点的小波包系数16-24Hz
    cfs3_3=wpcoef(wpt,nodes_ord(4));  %对重排序后第3层0节点的小波包系数24-32Hz
    cfs3_4=wpcoef(wpt,nodes_ord(5));  %对重排序后第3层0节点的小波包系数32-40Hz
    cfs3_5=wpcoef(wpt,nodes_ord(6));  %对重排序后第3层0节点的小波包系数40-48Hz
    cfs3_6=wpcoef(wpt,nodes_ord(7));  %对重排序后第3层0节点的小波包系数48-56Hz
    cfs3_7=wpcoef(wpt,nodes_ord(8));  %对重排序后第3层0节点的小波包系数56-64Hz
    
    E_cfs3_0=norm(cfs3_0,2)^2;  %% 1-范数:就是norm(...,1),即各元素绝对值之和;2-范数:就是norm(...,2),即各元素平方和开根号;
    E_cfs3_1=norm(cfs3_1,2)^2;
    E_cfs3_2=norm(cfs3_2,2)^2;
    E_cfs3_3=norm(cfs3_3,2)^2;
    E_cfs3_4=norm(cfs3_4,2)^2;
    E_cfs3_5=norm(cfs3_5,2)^2;
    E_cfs3_6=norm(cfs3_6,2)^2;
    E_cfs3_7=norm(cfs3_7,2)^2;
    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;
    
    p_node(0)= 100*E_cfs3_0/E_total;           % 求得每个节点的占比
    p_node(2)= 100*E_cfs3_1/E_total;           % 求得每个节点的占比
    p_node(3)= 100*E_cfs3_2/E_total;           % 求得每个节点的占比
    p_node(4)= 100*E_cfs3_3/E_total;           % 求得每个节点的占比
    p_node(5)= 100*E_cfs3_4/E_total;           % 求得每个节点的占比
    p_node(6)= 100*E_cfs3_5/E_total;           % 求得每个节点的占比
    p_node(7)= 100*E_cfs3_6/E_total;           % 求得每个节点的占比
    p_node(8)= 100*E_cfs3_7/E_total;           % 求得每个节点的占比
    
    figure;
    x=1:8;
    bar(x,p_node);
    title('各个频段能量所占的比例');
    xlabel('频率 Hz');
    ylabel('能量百分比/%');
    for j=1:8
    text(x(j),p_node(j),num2str(p_node(j),'%0.2f'),...
        'HorizontalAlignment','center',...
        'VerticalAlignment','bottom')
    end

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

    直接运行matlab自带函数,如下

    E = wenergy(wpt);   %该函数只能对最后一层(底层)节点进行能量提取

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

    这里对比一下,和方法1得到的图形基本上是一致的,不同之处在于排列顺序变了,方法2中的顺序是按照小波包分解函数自动排列顺序,方法1经过重排序后为按照频率段递增顺序依次排列顺序的

    %% 绘制重构前各个频段小波包系数
    figure(1);
    subplot(4,1,1);
    plot(x_input);
    title('原始信号');
    subplot(4,1,2);
    plot(cfs3_0);
    title(['层数 ',num2str(3) '  节点 0的小波0-8Hz',' 系数'])
    subplot(4,1,3);
    plot(cfs3_1);
    title(['层数 ',num2str(3) '  节点 1的小波8-16Hz',' 系数'])
    subplot(4,1,4);
    plot(cfs3_2);
    title(['层数 ',num2str(3) '  节点 2的小波16-24Hz',' 系数'])

    %% 绘制重构后时域各个特征频段的图形
    figure(3);
    subplot(3,1,1);
    plot(rex3(:,1));
    title('重构后0-8Hz频段信号');
    subplot(3,1,2);
    plot(rex3(:,2));
    title('重构后8-16Hz频段信号')
    subplot(3,1,3);
    plot(rex3(:,3));
    title('重构后16-24Hz频段信号');
    

    以上过程完整代码

    clear all;
    
    x_input=x_train(:,1,1);           %输入数据
    plot(x_input);title('输入信号时域图像')  %绘制输入信号时域图像
    
    x=x_input;        %   查看频谱范围
    fs=128;
    N=length(x); %采样点个数
    signalFFT=abs(fft(x,N));%真实的幅值
    Y=2*signalFFT/N;
    f=(0:N/2)*(fs/N);
    figure;plot(f,Y(1:N/2+1));
    ylabel('amp'); xlabel('frequency');title('输入信号的频谱');grid on
    
    wpt=wpdec(x_input,3,'dmey');      %进行4层小波包分解
    plot(wpt);                        %绘制小波包树
    
    %% 实现对节点顺序按照频率递增进行重排序
    % nodes=get(wpt,'tn');  %小波包分解系数 为什么nodes是[7;8;9;10;11;12;13;14]
    % N_cfs=length(nodes);  %小波包系数个数
    nodes=[7;8;9;10;11;12;13;14];
    ord=wpfrqord(nodes);  %小波包系数重排,ord是重排后小波包系数索引构成的矩阵 如3层分解的[1;2;4;3;7;8;6;5]
    nodes_ord=nodes(ord); %重排后的小波系数
    
    %% 实现对节点小波节点进行重构 
    for i=1:8
    rex3(:,i)=wprcoef(wpt,nodes_ord(i));         
    end
    
    %% 绘制第3层各个节点分别重构后信号的频谱
    figure;                         
    for i=0:7
    subplot(2,4,i+1);
    x_sign= rex3(:,i+1); 
    N=length(x_sign); %采样点个数
    signalFFT=abs(fft(x_sign,N));%真实的幅值
    Y=2*signalFFT/N;
    f=(0:N/2)*(fs/N);
    plot(f,Y(1:N/2+1));
    ylabel('amp'); xlabel('frequency');grid on
    axis([0 50 0 0.03]); title(['小波包第3层',num2str(i),'节点信号频谱']);
    end
    
    %% wavelet packet coefficients. 求取小波包分解的各个频段的小波包系数
    cfs3_0=wpcoef(wpt,nodes_ord(1));  %对重排序后第3层0节点的小波包系数0-8Hz
    cfs3_1=wpcoef(wpt,nodes_ord(2));  %对重排序后第3层0节点的小波包系数8-16Hz
    cfs3_2=wpcoef(wpt,nodes_ord(3));  %对重排序后第3层0节点的小波包系数16-24Hz
    cfs3_3=wpcoef(wpt,nodes_ord(4));  %对重排序后第3层0节点的小波包系数24-32Hz
    cfs3_4=wpcoef(wpt,nodes_ord(5));  %对重排序后第3层0节点的小波包系数32-40Hz
    cfs3_5=wpcoef(wpt,nodes_ord(6));  %对重排序后第3层0节点的小波包系数40-48Hz
    cfs3_6=wpcoef(wpt,nodes_ord(7));  %对重排序后第3层0节点的小波包系数48-56Hz
    cfs3_7=wpcoef(wpt,nodes_ord(8));  %对重排序后第3层0节点的小波包系数56-64Hz
    %% 求取小波包分解的各个频段的能量
    E_cfs3_0=norm(cfs3_0,2)^2;  %% 1-范数:就是norm(...,1),即各元素绝对值之和;2-范数:就是norm(...,2),即各元素平方和开根号;
    E_cfs3_1=norm(cfs3_1,2)^2;
    E_cfs3_2=norm(cfs3_2,2)^2;
    E_cfs3_3=norm(cfs3_3,2)^2;
    E_cfs3_4=norm(cfs3_4,2)^2;
    E_cfs3_5=norm(cfs3_5,2)^2;
    E_cfs3_6=norm(cfs3_6,2)^2;
    E_cfs3_7=norm(cfs3_7,2)^2;
    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;
    
    p_node(0)= 100*E_cfs3_0/E_total;           % 求得每个节点的占比
    p_node(2)= 100*E_cfs3_1/E_total;           % 求得每个节点的占比
    p_node(3)= 100*E_cfs3_2/E_total;           % 求得每个节点的占比
    p_node(4)= 100*E_cfs3_3/E_total;           % 求得每个节点的占比
    p_node(5)= 100*E_cfs3_4/E_total;           % 求得每个节点的占比
    p_node(6)= 100*E_cfs3_5/E_total;           % 求得每个节点的占比
    p_node(7)= 100*E_cfs3_6/E_total;           % 求得每个节点的占比
    p_node(8)= 100*E_cfs3_7/E_total;           % 求得每个节点的占比
    
    figure;
    x=1:8;
    bar(x,p_node);
    title('各个频段能量所占的比例');
    xlabel('频率 Hz');
    ylabel('能量百分比/%');
    for j=1:8
    text(x(j),p_node(j),num2str(p_node(j),'%0.2f'),...
        'HorizontalAlignment','center',...
        'VerticalAlignment','bottom')
    end
    % E = wenergy(wpt);       %求取各个节点能量
    
    %% 绘制重构前各个特征频段小波包系数的图形
    figure(1);
    subplot(4,1,1);
    plot(x_input);
    title('原始信号');
    subplot(4,1,2);
    plot(cfs3_0);
    title(['层数 ',num2str(3) '  节点 0的小波0-8Hz',' 系数'])
    subplot(4,1,3);
    plot(cfs3_1);
    title(['层数 ',num2str(3) '  节点 1的小波8-16Hz',' 系数'])
    subplot(4,1,4);
    plot(cfs3_2);
    title(['层数 ',num2str(3) '  节点 2的小波16-24Hz',' 系数'])
    
    %% 绘制重构后时域各个特征频段的图形
    figure(3);
    subplot(3,1,1);
    plot(rex3(:,1));
    title('重构后0-8Hz频段信号');
    subplot(3,1,2);
    plot(rex3(:,2));
    title('重构后8-16Hz频段信号')
    subplot(3,1,3);
    plot(rex3(:,3));
    title('重构后16-24Hz频段信号');
    
    

    8.小波----常见基函数

         与标准的傅里叶变换相比,小波分析中使用到的小波函数具有不唯一性,即小波函数 具有多样性。小波分析在工程应用中,一个十分重要的问题就是最优小波基的选择问题,因为用不同的小波基分析同一个问题会产生不同的结果。目前我们主要是通过用小波分析方法处理信号的结果与理论结果的误差来判定小波基的好坏,由此决定小波基。

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

         1.Haar小波Haar函数是小波分析中最早用到的一个具有紧支撑的正交小波函数,也是最简单的一个小波函数,它是支撑域在范围内的单个矩形波。Haar函数的定义如下:Haar小波在时域上是不连续的,所以作为基本小波性能不是特别好。但它也有自己的优点:计算简单。不但与正交,而且与自己的整数位移正交,因此,在的多分辨率系统中,Haar小波构成一组最简单的正交归一的小波族。

      [phi,g1,xval] = wavefun('haar',20);
         subplot(2,1,1);
         plot(xval,g1,'LineWidth',2);
         xlabel('t'); 
        title('haar 时域');
        g2=fft(g1);
        g3=abs(g2); 
        subplot(2,1,2);
        plot(g3,'LineWidth',2);
    xlabel('f')title('haar 频域');
    

                                          

    2.Daubechies(dbN)小波Daubechies小波是世界著名的小波分析学者Inrid·Daubechies构造的小波函数,简写为dbN,N是小波的阶数。小波和尺度函数中的支撑区为的消失矩为。除(Harr小波)外,dbN不具有对称性(即非线性相位)。除(Harr小波)外,dbN没有明确的表达式,但转换函数h的平方模是明确的:令,其中为二项式的系数,则有其中:Daubechies小波具有以下特点:在时域是有限支撑的,即长度有限。在频域在处有N阶零点。和它的整数位移正交归一,即。小波函数可以由所谓“尺度函数”求出来。尺度函数为低通函数,长度有限,支撑域在的范围内。

     db4的时域和频域波形:
           [phi,g1,xval] = wavefun('db4',10);
           subplot(2,1,1);
           plot(xval,g1,'LineWidth',2);
           xlabel('t')title('db4 时域');
           g2=fft(g1);
           g3=abs(g2);
           subplot(2,1,2);
           plot(g3,'LineWidth',2);
          xlabel('f')title('db4 频域');
    

                                      

     Daubechies小波常用来分解和重构信号,作为滤波器使用:
             [Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db4'); %计算该小波的4个滤波器
             subplot(2,2,1); 
             stem(Lo_D,'LineWidth',2);
             title('分解低通滤波器');
             subplot(2,2,2); 
             stem(Hi_D,'LineWidth',2);
             title('分解高通滤波器');
             subplot(2,2,3); 
             stem(Lo_R,'LineWidth',2);
             title('重构低通滤波器');
             subplot(2,2,4); 
             stem(Hi_R,'LineWidth',2);
             title('重构高通滤波器');
    

                                  

      3.Mexican Hat(mexh)小波Mexican Hat函数为Gauss函数的二阶导数:因为它的形状像墨西哥帽的截面,所以也称为墨西哥帽函数。Mexihat小波的时域和频域波形:

      Mexihat小波的时域和频域波形:
              d=-6; h=6; n=100;   
              [g1,x]=mexihat(d,h,n);
               subplot(2,1,1);
              plot(x,g1,'LineWidth',2);
              xlabel('t');
             title('Mexihat 时域');
             g2=fft(g1);
             g3=(abs(g2));
             subplot(2,1,2);
             plot(g3,'LineWidth',2);
             xlabel('f');
             title('mexihat 频域');
    

                                      

    Mexihat小波的特点:在时间域与频率域都有很好的局部化,并且满足。不存在尺度函数,所以Mexihat小波函数不具有正交性。

     4.Morlet小波它是高斯包络下的单频率副正弦函数:其中C是重构时的归一化常数。Morlet小波没有尺度函数,而且是非正交分解。Morlet小波的时域和频域波形图:

      d=-6; h=6; n=100;
        [g1,x]=morlet(d,h,n);
        subplot(2,1,1);
        plot(x,g1,'LineWidth',2);
         xlabel('t');
        title('morlet 时域');  
         g2=fft(g1);
        g3=(abs(g2));
        subplot(2,1,2);
       plot(g3,'LineWidth',2);
        xlabel('f');
       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

     

     

    展开全文
  • 代码:波包分解与重构、小波包能量特征提取

    万次阅读 多人点赞 2017-10-19 20:07:03
    基于小波包能量特征的滚动轴承故障监测方法 》。 4、Matlab代码 给出两部分代码,写成两个函数。一个是波包分解与重构,另一个是能量谱函数。 下载地址: https://download.csdn.net/download/ckzhb/10030651 ...

    1、小波变换的理解

    傅里叶变换——短时傅里叶变换——小波变换。

    参考文献:以下两篇参考资料讲述得十分清楚,有助于理解小波变换。

    但具体的数学角度阐述,请参考其他资料。

    (1)知乎专栏:形象易懂讲解算法I——小波变换

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

    (2)知乎专栏:傅里叶分析之掐死教程。

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


    2、小波包分解

    小波包是为了克服小波分解在高频段的频率分辨率较差,而在低频段的时间分辨率较差的问题的基础上而提出的。

    它是一种更精细的信号分析的方法,提高了信号的时域分辨率。

    下面是两者的对比图:


    3、能量谱

          基于小波包分解提取多尺度空间能量特征的原理是把不同分解尺度上的信号能量求解出来,将这些能量值按尺度顺序排列成特征向量供识别使用。

    20180510补充更新:具体计算公式如下所示,本文中未使用重构后的系数进行能量值计算,直接使用小波包分解后的系数,参考文献《基于小波包能量特征的滚动轴承故障监测方法 》。


    4、Matlab代码

    给出两部分代码,写成两个函数。一个是小波包分解与重构,另一个是能量谱函数。

    下载地址:https://download.csdn.net/download/ckzhb/10030651

    代码名称:wavelet_packetdecomposition_reconstruct

    function wpt= wavelet_packetdecomposition_reconstruct( x,n,wpname )
    %% 对信号进行小波包分解,得到节点的小波包系数。然后对每个节点系数进行重构。 
    % Decompose x at depth n with wpname wavelet packets.using Shannon entropy.
    %   
    %  x-input signal,列向量。
    %  n-the number of decomposition layers
    %  wpname-a particular wavelet.type:string.
    %
    %Author hubery_zhang
    %Date 20170714
    
    %%
    wpt=wpdec(x,n,wpname);
    % Plot wavelet packet tree (binary tree)
    plot(wpt)
    %% wavelet packet coefficients.default:use the front 4.
    cfs0=wpcoef(wpt,[n 0]);
    cfs1=wpcoef(wpt,[n 1]);
    cfs2=wpcoef(wpt,[n 2]);
    cfs3=wpcoef(wpt,[n 3]);
    figure;
    subplot(5,1,1);
    plot(x);
    title('原始信号');
    subplot(5,1,2);
    plot(cfs0);
    title(['结点 ',num2str(n) '  1',' 系数'])
    subplot(5,1,3);
    plot(cfs1);
    title(['结点 ',num2str(n) '  2',' 系数'])
    subplot(5,1,4);
    plot(cfs2);
    title(['结点 ',num2str(n) '  3',' 系数'])
    subplot(5,1,5);
    plot(cfs3);
    title(['结点 ',num2str(n) '  4',' 系数'])
    %% reconstruct wavelet packet coefficients.
    rex0=wprcoef(wpt,[n 0]);
    rex1=wprcoef(wpt,[n 1]);
    rex2=wprcoef(wpt,[n 2]);
    rex3=wprcoef(wpt,[n 3]);
    figure;
    subplot(5,1,1);
    plot(x);
    title('原始信号');
    subplot(5,1,2);
    plot(rex0);
    title(['重构结点 ',num2str(n) '  1',' 系数'])
    subplot(5,1,3);
    plot(rex1);
    title(['重构结点 ',num2str(n) '  2',' 系数'])
    subplot(5,1,4);
    plot(rex2);
    title(['重构结点 ',num2str(n) '  3',' 系数'])
    subplot(5,1,5);
    plot(rex3);
    title(['重构结点 ',num2str(n) '  4',' 系数'])
    end
    
    

    代码名称:wavelet_energy_spectrum

    function E = wavelet_energy_spectrum( wpt,n )
    %% 计算每一层每一个节点的能量
    %  wpt-wavelet packet tree
    %  n-第n层能量
    % 
    % Author hubery_zhang
    % Date  20170714
    
    %%
    % 求第n层第i个节点的系数
    E(1:2^n )=0;
    for i=1:2^n 
    E(i) = norm(wpcoef(wpt,[n,i-1]),2)^2; %20180604更新 原代码:E(i) = norm(wpcoef(wpt,[n,i-1]),2)
    end
    %求每个节点的概率
    E_total=sum(E); 
    for i=1:2^n
    p_node(i)= 100*E(i)/E_total;
    end
    % E = wenergy(wpt); only get the last layer
    figure;
    x=1:2^n;
    bar(x,p_node);
    title(['第',num2str(n),'层']);
    axis([0 2^n 0 100]);
    xlabel('结点');
    ylabel('能量百分比/%');
    for j=1:2^n
    text(x(j),p_node(i),num2str(p_node(j),'%0.2f'),...
        'HorizontalAlignment','center',...
        'VerticalAlignment','bottom')
    end
    
    end



    展开全文
  • 小波与小波包、小波包分解与信号重构、小波包能量特征提取小波与小波包区别小波分解小波包分解小波包——小波包树与时频图小波包树解读:Matlab实例时间频率图主要解释小波包-----小波包分解系数小波包-----信号分解...
  • 小波包提取能量特征的3种方法

    千次阅读 2021-04-18 10:48:12
    基于小波包分解的振动信号特征提取的频带能量分析方法; e=wenergy(wpt); E=zeros(1,length(e)); for i=1:2^lev E(i)=sum(abs(wprcoef(wpt,[lev,i-1])).^2); %这种方法本身具有消噪的作用,若前面在进行消噪处理,...
  • 对某信号进行3层小波包分解并重构,提取方差,获得信号特征
  • 内容概要:该资源为博主自己编写,内含波包分解与重构,波包分解与重构后的频谱分析,波包升降采样,小波包能量熵,小波包能量小波包能量占比三种特征提取方法,内含封装好的特征提取函数,内含详细代码注释...
  • #利用波分析进行特征分析 #参数初始化 inputfile= 'C:/Users/Administrator/Desktop/demo/data/leleccum.mat' #提取自Matlab的信号文件 from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它 ...
  • 基于小波包能量特征的滚动轴承故障监测方法 》。 4、Matlab代码 给出两部分代码,写成两个函数。一个是波包分解与重构,另一个是能量谱函数。 下载地址: https://download.csdn.net/download/ckzhb/10030651 ...
  • 引入了能量值方法,对小波包分解信号进行分层分段能量计算,组成能量特征矩阵,求得矩阵特征值;定义基于特征值的振动信号特征参数,并探讨了特征参数与轴承运行状态间的联系。最后在特征提取基础上,提出了故障早期...
  • 通过对降噪后的声压信号进行六层小波包分解并运用频带能量分析法提取第6层64个频带的归一化能量,并进行能量百分比分布及统计指标分析.研究结果表明:3种工况下的声压信号各频带的能量以及在0~1 250 Hz、0~2 500 Hz内...
  • 小波包分解并能提取特征频段能量的完整的matlab程序
  • 自己的小波包程序(含消噪、能量特征提取、信号重构等),希望对大家有帮助
  • 小波包能量熵及系数重构可视化matlab程序,数据是excel形式的,直接需改excel文件即可。本程序带详细每一步的注释,初学者一看就懂,很容易换成自己的数据或是修改相关参数。 理论描述:波包分解(wavelet packet ...
  • 小波包变换/能量特征提取/结果图绘制-python代码

    万次阅读 多人点赞 2019-11-04 14:35:49
    1. 波外部包下载 要下载两个包: PyWavelets和Matplotlib(要运行PyWavelets的所有测试,您还需要安装Matplotlib软件包。) 下载方法: pip install PyWavelets pip install Matplotlib 相关链接: ...
  • 可以通过程序提取导波波包能量,求解互相关系数
  • 对于信号进行三层分解,并对于第三层信号进行熵值判断,熵值越大代表故障信号越突出
  • 针对广泛存在的油气管道周边安全问题,研究了管道周围地面活动目标产生的震动信号的特性,提出了一种基于小波包能量谱和信号高阶谱分析相结合的特征提取方法来区分不同的活动目标.根据目标产生的地面震动信号是非...
  • 小波包能量提取的程序。。。。。。。。。。。。。
  • 针对水管泄漏定位的方法――直接相关法受到噪声和声传播方式的影响,定位精度低,提出了一种基于小波包分解与能量特征提取相结合的水管泄漏定位。该方法首先用声学传感器采集数据,然后通过小波包分解将其分为不同的...
  • 针对现有煤岩硬度性状识别方法不能满足采煤机滚筒实现自动调高技术的...MG180/420-BWD薄煤层采煤机在兖矿集团南屯煤矿测试结果表明,小波包时频域能量特征向量对截割煤岩硬度敏感,该特征向量间接判定截割工况效果良好。
  • matlab函数两个:一个是能量谱。 一个是小波包分解与重构;可以自己更改成一个程序,可以达到能量特征提取的目的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 462
精华内容 184
关键字:

小波包能量特征提取