信号处理 - 小波 - 努力的孔子

yanshw 2021-08-05 原文


信号处理 – 小波


小波,就是很小的波,它的积分总是接近于 0;

小波 又分为 小波分解小波包分解

小波分解 只对 低频部分 进行分解,对高频部分不再分解,所以能够过滤掉 高频部分;

低频部分 代表了 趋势,也叫 近似信号;高频部分 代表了 噪声,也叫 细节信号;

 

小波包分解 则既对 低频部分 进行分解,也对 高频部分 进行分解;

 

对小波的理解

小波变换 就是把 一个波形 分解成 N个 低频部分 和 M个 高频部分 的 和; 

同一个小波基函数可以通过 平移和缩放 生成不同的小波基;

小波变换就是 把 原始信号 与 小波基函数 以及 尺度函数 进行内积运算,所以一个 小波基 和一个 尺度函数 就确定了一个小波变换;

 

类比理解:小波基 就相当于 一个 标准正交基;原始信号 与 小波基 作内积 相当于 向量在 标准正交基上做投影;

  

Python 小波用法 

CWT:连续的小波变换

DWT:离散的小波变换

 

安装

pip install PyWavelets

 

查看所有小波族

import pywt

print(pywt.families())      # 查看所有小波基
# [\'haar\', \'db\', \'sym\', \'coif\', \'bior\', \'rbio\', \'dmey\', \'gaus\', \'mexh\', \'morl\', \'cgau\', \'shan\', \'fbsp\', \'cmor\']
print(pywt.families(short=False))
# [\'Haar\', \'Daubechies\', \'Symlets\', \'Coiflets\', \'Biorthogonal\', \'Reverse biorthogonal\', \'Discrete Meyer (FIR Approximation)\', \'Gaussian\', \'Mexican hat wavelet\', \'Morlet wavelet\', \'Complex Gaussian wavelets\', \'Shannon wavelets\', \'Frequency B-Spline wavelets\', \'Complex Morlet wavelets\']

 

离散 1D 小波变换 

1D 多阶小波变换 wavedec

def wavedec(data, wavelet, mode=\'symmetric\', level=None, axis=-1):
    """
    Multilevel 1D Discrete Wavelet Transform of data.
    wavelet : Wavelet object or name string    小波基
        Wavelet to use
    mode : str, optional    默认是对称的
        Signal extension mode, see :ref:`Modes <ref-modes>`.
    level : int, optional
        Decomposition level (must be >= 0). If level is None (default) then it
        will be calculated using the ``dwt_max_level`` function.
    axis: int, optional
        Axis over which to compute the DWT. If not given, the last axis is used.

    Returns
    -------
    [cA_n, cD_n, cD_n-1, ..., cD2, cD1] : list

level 指定了 分解 阶数 

返回的是 各层的小波系数     【也就是 特征值,一个 信号 分解为 多个 波形,每个 波形 对应一个 小波系数,计算 这个小波系数 的范数,就是这个 波形 对应的 能量】

 

示例

import numpy as np
from pywt import wavedec
import matplotlib.pylab as plt

np.random.seed(10)
data = np.random.random((100, ))
coeffs = wavedec(data, \'db1\', level=2)     # 一维离散信号的小波变换
cA2, cD2, cD1 = coeffs      # 一个低频,多个高频,高频数 取决于 level

plt.subplot(411); plt.title(\'original\'); plt.plot(data)
plt.subplot(412); plt.title(\'ca2\'); plt.plot(cA2)
plt.subplot(413); plt.title(\'cd2\'); plt.plot(cD2)
plt.subplot(414); plt.title(\'cd1\'); plt.plot(cD1)
plt.show()

 

1D 1 阶小波分解    

level = 2 相当于 进行了 2 次 1阶小波分解

def dwt(data, wavelet, mode=\'symmetric\', axis=-1)

可以看到 没有 level 参数,level 恒为 1

 

与 wavedec 进行比对,指定 wavedec level=2,结果相同

np.random.seed(10)
data = np.random.random((10, ))
coeffs = wavedec(data, \'db1\', level=2)     # 一维离散信号的小波变换
cA2, cD2, cD1 = coeffs      # 一个低频,多个高频,高频数 取决于 level
print(cA2)      # [1.08726236 0.84094862 0.25745065]
print(cD2)      # [-0.29518976 -0.11764496  0.        ]
print(cD1)      # [ 0.53073221 -0.08142734  0.19354246 -0.39772483  0.05711374]

### 一次 小波分解, level=1
a = data
ca = []  # 近似分量
cd = []  # 细节分量
for i in range(2):
    (a, d) = pywt.dwt(a, \'db1\')  # 进行2阶离散小波变换
    ca.append(a)
    cd.append(d)

print(ca)   # [array([0.5600799 , 0.97754127, 0.51145292, 0.67782802, 0.1820451 ]), array([1.08726236, 0.84094862, 0.25745065])]    ### 取最后一个 近似信号
print(cd)   # [array([ 0.53073221, -0.08142734,  0.19354246, -0.39772483,  0.05711374]), array([-0.29518976, -0.11764496,  0.        ])]

wavedec 相当于 dwt 的封装 

 

离散 2D 小波变换 

用法 基本 等同于 1D

 

2D 1阶小波变换 dwt2

def dwt2(data, wavelet, mode=\'symmetric\', axes=(-2, -1)):
    returns (cA, (cH, cV, cD)) : tuple
       

要注意返回值,分别为低频分量,水平高频、垂直高频、对角线高频。高频的值包含在一个tuple中

 

示例

import pywt
import pywt.data

# Load image
original = pywt.data.camera()

# Wavelet transform of image, and plot approximation and details
titles = [\'Approximation\', \'Horizontal detail\', \'Vertical detail\', \'Diagonal detail\']
coeffs2 = pywt.dwt2(original, \'bior1.3\')        # 2D 离散信号 小波分解
LL, (LH, HL, HH) = coeffs2
fig = plt.figure(figsize=(12, 3))
for i, a in enumerate([LL, LH, HL, HH]):
    ax = fig.add_subplot(1, 4, i + 1)
    ax.imshow(a, interpolation="nearest", cmap=plt.cm.gray)
    ax.set_title(titles[i], fontsize=10)
    ax.set_xticks([])
    ax.set_yticks([])

fig.tight_layout()
plt.show()

 

2D 多阶小波变换 wavedec2

print(pywt.waverec2(coeffs, wavelet=\'db1\',  level=3))

官网有 level 参数,我的版本没有,应该是版本问题,暂未解决

 

信号重构

小波 经常用于 降噪,降完噪后 需要把 信号进行重构,生成无噪声的信号,1D、2D 用法类似

def waverec(coeffs, wavelet, mode=\'symmetric\', axis=-1)

 

示例

import numpy as np
import pywt
import matplotlib.pylab as plt

plt.rcParams[\'font.sans-serif\']=[\'SimHei\']
plt.rcParams[\'axes.unicode_minus\']=False

data = np.hstack([np.ones((1, 10)), np.ones((1, 50)) * 2])[0]
ca, cd2, cd1 = pywt.wavedec(data, \'db1\', level=2)
plt.subplot(211)
plt.title(\'original\')
plt.plot(data)

out = pywt.waverec([ca, cd2, cd1], \'db1\')
plt.subplot(212)
plt.title(\'重构信号\')
plt.plot(out)
plt.show()

 

小波 VS 傅里叶变换

小波变换还是比较复杂的,确切地说 如果想 彻底弄懂,基本不可能,我这里 只重点记录下 学习心得

1. 傅里叶变换 的 基 只能是 正弦波,如果 原始波形 比较陡峭,需要无穷多的 正弦波 才能逼近 这种陡峭,计算量很大;小波基 则 比较 灵活,甚至可以自定义小波基;

2. 正弦波 会以 同样的 幅度 在无穷大空间内做 无限震动,能量巨大;而 小波 是一个 很短的波,它的能力比较集中,而且集中在 某一点附近; 如下图

  

之所以叫 小波,就是 跟 傅里叶的正弦波 比较起来 很小 

3. 小波 擅长 瞬时突变 信号的检测,傅里叶变换无能为力 

 

小波 应用于 特征提取

 

代码

#进行小波变换,提取样本特征
wp = pywt.WaveletPacket(SingleSampleDataWavelet, wavelet=\'db3\', mode=\'symmetric\', maxlevel=3) #小波包三层分解
#print([node.path for node in wp.get_level(3, \'natural\')])   #第3层有8个
#获取第level层的节点系数
aaa = wp[\'aaa\'].data #第1个节点
aad = wp[\'aad\'].data #第2个节点
ada = wp[\'ada\'].data #第3个节点
add = wp[\'add\'].data #第4个节点
daa = wp[\'daa\'].data #第5个节点
dad = wp[\'dad\'].data #第6个节点
dda = wp[\'dda\'].data #第7个节点
ddd = wp[\'ddd\'].data #第8个节点
#求取节点的范数
ret1 = np.linalg.norm(aaa,ord=None) #第一个节点系数求得的范数/ 矩阵元素平方和开方
ret2 = np.linalg.norm(aad,ord=None)
ret3 = np.linalg.norm(ada,ord=None)
ret4 = np.linalg.norm(add,ord=None)
ret5 = np.linalg.norm(daa,ord=None)
ret6 = np.linalg.norm(dad,ord=None)
ret7 = np.linalg.norm(dda,ord=None)
ret8 = np.linalg.norm(ddd,ord=None)
#8个节点组合成特征向量
SingleSampleFeature = [ret1, ret2, ret3, ret4, ret5, ret6, ret7, ret8]

关键是 细节信号 的能量 计算,其实就是 系数(类似于特征值大小) 的 归一化

 

 

 

参考资料:

https://www.cnblogs.com/shuimuqingyang/p/10919918.html  小波变换库——Pywalvets 学习笔记

https://pywavelets.readthedocs.io/en/latest/ref/index.html    PyWavelets 官网

https://github.com/PyWavelets/pywt    PyWavelets git上的demo

https://blog.csdn.net/alwaystry/article/details/52756051  用法挺全的

https://zhuanlan.zhihu.com/p/44215123  小波变换完美通俗讲解系列之 (一)    【原理就看这篇吧】

 

https://blog.csdn.net/zds13257177985/article/details/102896041?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase  小波包变换/能量特征提取/结果图绘制-python代码

发表于
2020-07-07 14:12 
努力的孔子 
阅读(1316
评论(0
编辑 
收藏 
举报

 

版权声明:本文为yanshw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yanshw/p/13253595.html

信号处理 - 小波 - 努力的孔子的更多相关文章

  1. A股、B股区别 – 请登录

    A股、B股区别 A股也称为人民币普通股票、流通股、社会公众股、普通股。是指那些在中国大陆注册、在中国大陆上市的 […]...

  2. 【折腾系列】使用Onenote & Evernote & VSC+Markdown构建个人笔记系统

    笔记本太多,查起来很麻烦;笔记太多,每条都记下来又慢又累;强迫症,不分门别类不舒服,纸质笔记不好调整;电子笔记 […]...

  3. M – God of War

    M – God of War At 184~280 A.D ,there were many ki […]...

  4. Flask(5)- 动态路由 『无为则无心』Python函数 — 25、Python中的函数 利用C语言将混乱数字排序(即冒泡排序法)(含思路) http连接复用进化论 Git常用命令超级详细(全网最详细) Android系统“资源调度框架” 进来偷学一招,数据归档二三事儿 安卓手机改造服务器——基本环境配置(CentOS7 arm32) [Kick Start] 2021 Round B 对抗样本综述(一) 海量数据Excel报表利器——EasyExcel(一 利用反射机制导出Excel) 《面试补习

    前言 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相 […]...

  5. 你想不到的压缩方法:将javascript文件压缩成PNG图像存储 – 爱莲学堂

    你想不到的压缩方法:将javascript文件压缩成PNG图像存储 你有没有想过:为了压缩js文件,把js文件 […]...

  6. Execl如何在一个格子里打多行字,如何换行 – 自由一份子

    答:“ALT+回车”!...

  7. Xshell和Xftp – 下载安装

    简介 Xshell 实际工作运用:连接Linux Xftp 实际工作运用:传输文件到Linux系统 下载安装 […]...

  8. ApiTesting全链路接口自动化测试框架 – 实战应用

    为了遵守相关法律法规,合法合规运营,网站进行全面整改,整改工作于2021年3月18日12:00开始,预计于3月 […]...

随机推荐

  1. Artistdirect.com为Zune播放器提供的热门歌曲MP3 – 电脑人生

    Artistdirect.com为Zune播放器提供的热门歌曲MP3 2007-01-21 22:37  电脑 […]...

  2. qq客服代码

    http://shang.qq.com/v3/widget.html <a target="_blank […]...

  3. ASP.NET Core WebAPI控制器返回类型的最佳选项

    前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应。这三种类型 […]...

  4. 2019年12月9日开发手记

    现阶段的任务 1、先把andriod_python调通  2、网络传输摄像头数据 到 ubuntu上保存, 3 […]...

  5. 2019 前端面试题总结 及 答案

    一)vue router 跳转方式 1.this.$router.push()  跳转到不同的url,但这个方 […]...

  6. Eclipse基础--java环境变量设置[转]

      http://blog.csdn.net/javamxj/archive/2004/10/11/13193 […]...

  7. java 方法的重载、重写与重构

    首先我们要知道重载、重写、重构的区别   重载:指的是在同一个类中,方法名相同,但是参数数量、参数类型或者返回 […]...

  8. JDBC(1)简单介绍/数据库的连接

      初识JDBC: JDBC是java连接数据库的一个工具,没有这个工具,java将无法和数据库进行连接。   […]...

展开目录

目录导航