文章目录

  • 小波分解与小波包分解
  • 小波包-小波包树与时频图
  • 小波包分解系数
  • 信号的能量
  • python 实例
    • 小波包的使用
  • 参考

小波分解与小波包分解

工程应用中经常需要对一些非平稳信号进行,小波分析和小波包分析适合对非平稳信号分析,相比较小波分析,利用小波包分析可以对信号分析更加精细,小波包分析可以将时频平面划分的更为细致,对信号的高频部分的分辨率要好于小波分析,可以根据信号的特征,自适应的选择最佳小波基函数,比便更好的对信号进行分析,所以小波包分析应用更加广泛。
小波包分解(Wavelet Packet Decomposition),又称为最优子带树结构(Optimal Subband Tree Structuring)正是对小波变换的进一步优化。其主要的算法思想是:在小波变换的基础上,在每一级信号分解时,除了对低频子带进行进一步分解,也对高频子带进行进一步分解。最后通过最小化一个代价函数,计算出最优的信号分解路径,并以此分解路径对原始信号进行分解。

①小波分解
小波变换只对信号的低频部分做进一步分解,而对高频部分也即信号的细节部分不再继续分解,所以小波变换能够很好地表征一大类以低频信息为主要成分的信号,不能很好地分解和表示包含大量细节信息(细小边缘或纹理)的信号,如非平稳机械振动信号、遥感图象、地震信号和生物医学信号等。

②小波包分解
小波包变换既可以对低频部分信号进行分解,也可以对高频部分进行分解,而且这种分解既无冗余,也无疏漏,所以对包含大量中、高频信息的信号能够进行更好的时频局部化分析。

小波包-小波包树与时频图

小波包树解读:

以上即是小波包树,其中节点的命名规则是从(1,0)开始,叫1号, (1,1)是2号………依此类推,(3,0)是7号,(3,7)是14号。 每个节点都有对应的小波包系数,这个系数决定了频率的大小,也就是说频率信息已经有了,但是时域信息在哪里呢? 那就是 order。 这个order就是这些节点的顺序,也就是频率的顺序。

小波包分解系数

在数值分析中,我们学过内积,内积的物理含义:两个图形的相似性,若两个图形完全正交,则内积为0,若两个图形完全一样,则系数为1(相对值)。小波变换的实质是:原信号与小波基函数的相似性。小波系数就是小波基函数与原信号相似的系数。

连续小波变换:小波函数与原信号对应点相乘,再相加,得到对应点的小波变换系数,平移小波基函数,再计算小波函数与原信号对应点相乘,再相加,这样就得到一系列的小波系数。对于离散小波变换(由于很多小波函数不是正交函数,因此需要一个尺度函数)所以,原信号函数可以分解成尺度函数和小波函数的线性组合,在这个函数中,尺度函数产生低频部分,小波函数产生高频部分

信号的能量


python 实例

小波包的使用

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

import 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] = signalfor 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:
 绘制小波能量特征柱形图,注意这里的节点顺序不是自然分解的顺序,而是频率由低到高的顺序:
# 创建一个点数为 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()

作图如下:

参考

小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)
小波包变换/能量特征提取/结果图绘制-python代码

信号处理-小波包分解相关推荐

  1. 小波包分解matlab程序

    小波包分解(Wavelet Packet Decomposition)是小波变换的一种变形方法,在信号处理和数据分析中被广泛应用.Matlab是常用的数学软件之一,也提供了方便的小波分析工具箱,可以帮 ...

  2. 图像3尺度全小波包分解matlab,小波分析理论与图像降噪处理

    摘  要: 简要介绍了小波分析基本理论中的小波变换和小波包变换,重点论述了小波分析在图像降噪处理中的应用及其算法流程.在此基础上,利用Matlab R2007进行了图像去噪仿真测试,并对仿真结果进行了 ...

  3. 小波包分解 matlab_多尺度一维小波分解

    code1.m fc 小波包分解的程序 DWT_new.m clc DWT.m clc 如何求EMD各IMF分量的能量? %经验模态分解

  4. Matlab小波包分解后如何求各频带信号的能量值?

    clear; clc; n=3; wpname='db3'; % [b,a]=butter(8,[5/100 99/100]); % load a1_1-1; load k301_1-4; % Dat ...

  5. 小波分解与小波包分解代码_分解的功能参数和代码可维护性

    小波分解与小波包分解代码 Code keeps changing, there's no doubt about that. We always do our best to set some roc ...

  6. python小波包分解_小波包获得某个节点信号的几个细节问题

    小波包分解主要用了这四个函数  wpdec,wprec,wprcoef,wpcoef.1)Wpcoef: 求解某个节点的小波包系数,数据长度是L/(2^n)(n表示分解的层数) 比如:原始信号长度为1 ...

  7. 小波包分解-MATLAB

    clc; clear; % 加载信号 load noisdopp; s = noisdopp; subplot(321);plot(s);title('原始信号'); %% [thr,sorh,dee ...

  8. Matlab怎么计算信号的能量,Matlab小波包分解后如何求各频带信号的能量值? [转]...

    clear; clc; n=3; wpname='db3'; % [b,a]=butter(8,[5/100 99/100]); % load a1_1-1; load k301_1-4; % Dat ...

  9. 小波包分解之梅尔倒谱系数(WPMFCC)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.需导入的库 二.代码主干 前言 本文记录将小波变换替换提取梅尔倒谱系数过程中的FFT部分,主要是代码展示. 一.需 ...

最新文章

  1. 基于python爬虫数据处理_基于Python爬虫的校园数据获取
  2. 微软对学生免费提供Visual Studio等开发软件(包括中国)
  3. 读取properties文件
  4. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( End of statement expected )
  5. 9月14日学习内容整理:初识别面向对象
  6. 算法基础数学知识篇(1)之----- 排列数组
  7. jdbc连接mysql视频_jdbc连接mysql数据库视频
  8. 广西区计算机一级考试操作题,全国高校计算机等级考试(广西考区)一级笔试试题卷.doc...
  9. LeetCode 多线程 1114. 按序打印
  10. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7)系列二:k8s高可用集群搭建总结以及部署API到k8s...
  11. ARM 汇编学习——编写简单的ARM汇编程序
  12. IDL实现遥感影像融合(批量)TASK(三)
  13. Centos挂载iscsi存储
  14. 从入门到精通 - Fayson带你玩转CDH
  15. AFNetworking请求服务器错误
  16. spring-kafka源码解析
  17. word2007工具栏隐藏了怎样能一直显示?
  18. 基于银河麒麟 V10 系统安装和卸载 DM8 数据库
  19. npm ERR! File exists: /XXX/xxx npm ERR! Move it away, and try again.
  20. YIGO标准平台解决模态窗口不能刷新父界面的方法

热门文章

  1. 记录一下在ROS里调用ORK的苦逼历程
  2. 纠正训练和测试分辨率差异
  3. 数据库串烧(一)odbc驱动安装及数据源配置
  4. 2020年中国系统集成行业发展历程及市场发展现状分析[图]
  5. MFC-实现软件程序的重启
  6. 前端设置页面字体尺寸跟随屏幕大小而进行变化
  7. 【git】(task5)Git可视化工具与团队协作
  8. Python文本分析——词云图(wordcloud+jieba)
  9. 基于tcp和sqlite3数据库的电子词典项目
  10. 命令行远程登录邮件服务器