当前位置:   article > 正文

小波包变换/能量特征提取/结果图绘制-python代码_小波包计算后绘图

小波包计算后绘图

1. 小波外部包下载

要下载两个包:

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

下载方法:

  1. pip install PyWavelets
  2. pip install Matplotlib

相关链接:

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

小波包的相关用法实例

2. 小波包的使用

2.1 导入相关的包

下面的导入的包中主要是pywt和matplotlib

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import os
  4. from sklearn import preprocessing
  5. import pywt
  6. import pywt.data
  7. import pandas as pd

2.2  小波包各节点按照频率由低到高

  1. wp = pywt.WaveletPacket(data=tr, wavelet='db1',mode='symmetric',maxlevel=3)
  2. #根据频段频率(freq)进行排序
  3. print([node.path for node in wp.get_level(1, 'freq')])
  4. print([node.path for node in wp.get_level(2, 'freq')])
  5. print([node.path for node in wp.get_level(3, 'freq')])

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

  1. ['a', 'd']
  2. ['aa', 'ad', 'dd', 'da']
  3. ['aaa', 'aad', 'add', 'ada', 'dda', 'ddd', 'dad', 'daa']

 2.3 打印小波家族

  1. pywt.families()
  2. #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 

      所以可以使用下面的方法提取每一层的每个节点的小波系数,当然这个方法不太方便,需要一个一个的写,后面有更好的方法:

  1. a = wp['a'].data #第1个节点
  2. d = wp['d'].data #第2个节点
  3. #第二层
  4. aa = wp['aa'].data
  5. ad = wp['ad'].data
  6. dd = wp['dd'].data
  7. da = wp['da'].data
  8. #第三层
  9. aaa = wp['aaa'].data
  10. aad = wp['aad'].data
  11. ada = wp['add'].data
  12. add = wp['ada'].data
  13. daa = wp['dda'].data
  14. dad = wp['ddd'].data
  15. dda = wp['dad'].data
  16. ddd = wp['daa'].data

   (3) 作小波树图,下面代码中没有优化,后面做了优化:

  1. plt.figure(figsize=(15, 10))
  2. plt.subplot(4,1,1)
  3. plt.plot(tr)
  4. #第一层
  5. plt.subplot(4,2,3)
  6. plt.plot(a)
  7. plt.subplot(4,2,4)
  8. plt.plot(d)
  9. #第二层
  10. plt.subplot(4,4,9)
  11. plt.plot(aa)
  12. plt.subplot(4,4,10)
  13. plt.plot(ad)
  14. plt.subplot(4,4,11)
  15. plt.plot(dd)
  16. plt.subplot(4,4,12)
  17. plt.plot(da)
  18. #第三层
  19. plt.subplot(4,8,25)
  20. plt.plot(aaa)
  21. plt.subplot(4,8,26)
  22. plt.plot(aad)
  23. plt.subplot(4,8,27)
  24. plt.plot(add)
  25. plt.subplot(4,8,28)
  26. plt.plot(ada)
  27. plt.subplot(4,8,29)
  28. plt.plot(dda)
  29. plt.subplot(4,8,30)
  30. plt.plot(ddd)
  31. plt.subplot(4,8,31)
  32. plt.plot(dad)
  33. plt.subplot(4,8,32)
  34. plt.plot(daa)

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

 

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

  1. def wpd_plt(signal,n):
  2. #wpd分解
  3. wp = pywt.WaveletPacket(data=signal, wavelet='db1',mode='symmetric',maxlevel=n)
  4. #计算每一个节点的系数,存在map中,key为'aa'等,value为列表
  5. map = {}
  6. map[1] = signal
  7. for row in range(1,n+1):
  8. lev = []
  9. for i in [node.path for node in wp.get_level(row, 'freq')]:
  10. map[i] = wp[i].data
  11. #作图
  12. plt.figure(figsize=(15, 10))
  13. plt.subplot(n+1,1,1) #绘制第一个图
  14. plt.plot(map[1])
  15. for i in range(2,n+2):
  16. level_num = pow(2,i-1) #从第二行图开始,计算上一行图的2的幂次方
  17. #获取每一层分解的node:比如第三层['aaa', 'aad', 'add', 'ada', 'dda', 'ddd', 'dad', 'daa']
  18. re = [node.path for node in wp.get_level(i-1, 'freq')]
  19. for j in range(1,level_num+1):
  20. plt.subplot(n+1,level_num,level_num*(i-1)+j)
  21. plt.plot(map[re[j-1]]) #列表从0开始

   2.5 小波包能量特征提取

  1. n = 3
  2. re = [] #第n层所有节点的分解系数
  3. for i in [node.path for node in wp.get_level(n, 'freq')]:
  4. re.append(wp[i].data)
  5. #第n层能量特征
  6. energy = []
  7. for i in re:
  8. energy.append(pow(np.linalg.norm(i,ord=None),2))
  9. #for i in energy:
  10. # print(i)

     绘制小波能量特征柱形图,注意这里的节点顺序不是自然分解的顺序,而是频率由低到高的顺序:

  1. # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
  2. plt.figure(figsize=(10, 7), dpi=80)
  3. # 再创建一个规格为 1 x 1 的子图
  4. # plt.subplot(1, 1, 1)
  5. # 柱子总数
  6. N = 8
  7. values = energy
  8. # 包含每个柱子下标的序列
  9. index = np.arange(N)
  10. # 柱子的宽度
  11. width = 0.45
  12. # 绘制柱状图, 每根柱子的颜色为紫罗兰色
  13. p2 = plt.bar(index, values, width, label="num", color="#87CEFA")
  14. # 设置横轴标签
  15. plt.xlabel('clusters')
  16. # 设置纵轴标签
  17. plt.ylabel('number of reviews')
  18. # 添加标题
  19. plt.title('Cluster Distribution')
  20. # 添加纵横轴的刻度
  21. plt.xticks(index, ('7', '8', '9', '10', '11', '12', '13', '14'))
  22. # plt.yticks(np.arange(0, 10000, 10))
  23. # 添加图例
  24. plt.legend(loc="upper right")
  25. plt.show()

   作图如下:

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/310328
推荐阅读
相关标签
  

闽ICP备14008679号