超市建网站/黑科技推广软件
在之前的系列文章里,我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT,我们继续补完该系列。
今天要讲到的是小波分解,通常也就是指离散小波变换(Discrete Wavelet Transform, DWT)。在网上有一些介绍该方法的文章,但是总感觉不够通俗或不够透彻,希望读完这篇能让你有所收获。
一、从小波分析到小波分解
小波分析是一种时频域分析方法,该方法兼顾了信号在时域和频域的信息。知乎上有一篇文章对小波分析的理解进行了生动的讲解,建议对小波分析概念不熟的同学先看一下。咚懂咚懂咚:能不能通俗的讲解下傅立叶分析和小波分析之间的关系?这篇文章中最后给出的小波变换的结果是这样的:
图1 连续小波变换
看起来十分厉害,不过同时会发现两个问题:运算量很大;只有数值解,没有解析解。上述这种小波分析方法叫连续小波变换(continuous wavelet transform, CWT)。
为了减少变换运算量,去除不必要的重复的系数,实际中使用的通常是离散小波变换(discrete wavelet transform, DWT)。
这里的“离散”指的是什么呢?
让我们先回到小波基波(也叫母小波)的表达式:
其中s是尺度参数,表征频率;t是位移参数,表征时间。这部分在答友的连接里也提到了。再看上一张图,xy坐标分别是SCALE和TRANSLATION,也就是s和t,他们在连续小波变换中是连续的。
所以,在离散小波变换中,“离散”的就是参数s和t。此时小波表达式写为:
j和k都是整数,通常取s0=2,τ0=1。
可以看出,随着j取值的递增,我们可以得到一串不同的小波(子小波,也叫女儿小波...)。这些子小波的尺度参数以2的j次方的形式增长。当使用这一系列的子小波,对一个连续函数进行离散分析时,我们所获得的是一组小波分析的系数,这个分析过程称为小波系列分解。
上边说道,尺度参数表征的是频率,在子小波中尺度参数以2的倍数增长(即小波的“长度”被“拉长”了2倍),那么子小波对应能检测到的频率值也会以1/2的倍数缩小。母小波所对应的频谱位于频率谱的高端,具有最大的频率谱范围- 而其他的子小波的频率谱则依次向频谱图的低频端移动,同时它们所覆盖的频率谱范围也相应地递减。在理想的情况下,所有的滤波器应该首尾相接互相覆盖。
图2 不同尺度的子小波在小波频率谱上的覆盖
是的,每个子小波就相当于一个滤波器,离散小波变换的过程就是逐级滤波的过程。
具体流程是怎样的呢?
用一句话描述就是:一组离散信号通过一系列的低通和高通滤波器,分别可以得到近似信号(用字母A表示)和细节信号(用字母D表示)。
用一张图描述就是:
图3 LP为低通滤波器,HP为高通滤波器,B为带宽,2B为2倍带宽
用一个例子来描述就是:
这段合成信号是由多个成分叠加而成的:一个10 Hz的低频正弦波和一个振幅为0.5的50 Hz高频正弦波,这两者代表信号的周期性成分。同时,信号中还包括了一个线性趋势项,表示信号的非周期性变化。除此之外,信号还叠加了标准差为0.5的高斯白噪声,为信号添加了随机性。这里使用了 dB4(第4级Daubechies小波)作为去除噪音操作的母小波。
原始信号
一阶小波分解的结果为:
一阶小波分解的近似信号(低通结果)
一阶小波分解的细节信号(高通结果)
二阶小波分解的结果为(即对A1信号做分解):
二阶小波分解的近似信号(低通结果)
二阶小波分解的细节信号(高通结果)
三阶小波分解的结果为(即对A2信号做分解):
三阶小波分解的近似信号(低通结果)
三阶小波分解的细节信号(高通结果)
四阶小波分解的结果为(即对A3信号做分解):
四阶小波分解的近似信号(低通结果)
四阶小波分解的近似信号(低通结果)
至此我们已经能够得到较好的低通滤波结果了。可以看到原始信号被逐级的,无遗漏地进行了高、低通滤波,且越接近低频分段越细,几乎想要哪个频段的特征都能得到,因而这个方法有个霸气的名字,叫filter banks。
小波分解的多尺度可以类比为我们使用不同的“放大镜”去观察一个物体。想象一下你手里有一张非常复杂的画,画面上有大的物体,如山脉、树木,但也有非常细小的细节,如叶子上的纹理或昆虫的触角。
粗尺度(低分辨率):当你使用低倍的放大镜(或者站得很远)去看这幅画时,你可以看到大的物体,如山脉和树木,但可能看不到细小的纹理或昆虫。 在小波分解中,这就像我们查看信号的低频部分,捕获其主要的、宽泛的特征。
细尺度(高分辨率):现在,如果你换一个高倍的放大镜(或者走近一些)去看同一幅画,你可能会失去对整体的感知,但可以清晰地看到叶子上的纹理或昆虫的触角等细节。 在小波分解中,这就像我们查看信号的高频部分,捕获其细节和快速的变化。
小波分解的美妙之处在于,它同时提供了多个尺度的视角,让我们既可以看到信号的整体特征,又可以看到其细节。这就像我们可以同时拥有多个不同倍率的放大镜,让我们在需要的时候选择合适的一个来观察画面。
二、小波分解更深一步的理解
我们先看一下下边这张图:
小波分解中的c与l
乍一看这张图与图3比较相像,不过仔细看下边的两个方框,即左侧分别标识了c和l的位置。
(一)关于小波分解系数
c的那一行是指的就是小波分解的向量。需要注意这个向量并不是上边几张图里的近似信号和细节信号,这里边存储的是小波分解的系数。小波系数是没有量纲单位的结果,需要经过重构这些系数得到实际有量纲的信号。
在我们之前讲过的小波阈值去噪方法就是针对这些小波系数,c这行的每个独立的方框(比如cA3)都可以重构到时域成为对应的滤波后的信号,也可以几个方框共同重构,这就是小波分解分量的筛选重构过程,这个过程是有实际工程应用意义的,比如可以实现滤波。
(二)小波分解和“其他类EMD分解方法”的区别
这里指的“其他类EMD方法”包括了EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN等。
小波分解与EMD分解最大的不同是源于分解机理的。
小波分解的分解结构是有包含关系的,每一层级的近似信号都要再分解为下一级的近似信号和细节信号,(这也直接导致在信号重构时不是那么随意),下图是一个典型信号的分解结果,我用红色箭头标出了其包含关系。
主要低频信号出现在每一个近似信号里
EMD通过连续地提取信号的局部极值,然后求解其上下包络,进而得到IMFs。这些IMFs是并列的关系,可以直接对选定的分量进行相加来实现重构,这种操作就比较直观了。
每个IMF分量都是由原始信号直接分解而来
那么这种分解机理的区别,会带来分解效果和应用上的什么不同呢?
我认为有以下几点:
- 上边讲到小波分解方法是多尺度的,高频分量在多个层级上被逐步细化剥离开来,让我们可以用更精准的手术刀切割出特征信号段,这是EMD所不具备的特点。
- EMD可能会受到模态混叠的影响,导致不同模式的信号成分被混在一起;小波分解方法不同层级覆盖的频率范围不同,模态混叠现象会大大减少。
- EMD的分解阶数是自适应的,换句话说无法人为干预;小波分解的分解层数是可以指定的,这方面灵活性更强。
三、小波分解DWT的MATLAB代码实现
小波分解的代码在网上可以找到一些,但是用起来不太趁手。
按照“类EMD”系列的代码的统一风格,笔者进行了封装,封装后的函数有三个,分别用于实现绘制小波分解图、小波分解各分量及频谱对应图,以及重构信号并绘制信号重构图。
(一)生成仿真信号
%% 1.生成仿真信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
% 创建一个合成信号:包含不同频率的正弦波、趋势和噪声
signal = cos(2*pi*10*t) + 0.5*sin(2*pi*50*t) + t + 0.5*randn(size(t));
figure('color','white')
plot(t,signal,'k');xlabel('时间');ylabel('幅值') %绘制原始信号
待分解的原始信号
(二)小波分解图
%% 2.绘制DWT分解图
waveletType = 'db4'; %小波名称,可选范围参考这里:https://ww2.mathworks.cn/help/wavelet/ref/wfilters.html?searchHighlight=wname&s_tid=srchtitle_wname_2#d123e130597
decompositionLevel = 4; %小波分解水平,正整数
[a,d] = pDWT(signal, decompositionLevel, waveletType); % 调用函数进行分解和画图
只需要设置小波名称和小波分解水平,然后调用pDWT函数即可(函数获取方法见文末)
此时可以画出如下图:
(三)小波分解及频谱图
%% 3.绘制DWT分解图及频谱图
waveletType = 'db4'; %小波名称,可选范围参考这里:https://ww2.mathworks.cn/help/wavelet/ref/wfilters.html?searchHighlight=wname&s_tid=srchtitle_wname_2#d123e130597
decompositionLevel = 4; %小波分解水平,正整数
[a,d] = pDWTandFFT(signal, decompositionLevel, waveletType); % 调用函数进行分解和画图(及频谱图)
只需要设置小波名称和小波分解水平,然后调用pDWTandFFT函数即可(函数获取方法见文末)
此时可以画出如下图:
(四)小波分解重构及画图
%% 4.重构信号并绘制DWT重构图
waveletType = 'db4'; %小波名称,可选范围参考这里:https://ww2.mathworks.cn/help/wavelet/ref/wfilters.html?searchHighlight=wname&s_tid=srchtitle_wname_2#d123e130597
decompositionLevel = 4; %小波分解水平,正整数
approxLevels = 4;%所选的近似分量
detailLevels = [3 4];%所选的细节分量
combined_signal = rDWT(signal, waveletType, decompositionLevel, approxLevels, detailLevels);
为了应用小波分解结果(比如滤波),很多时候要对分解结果重构。
重构的操作相对复杂一些,一来这部分代码一不小心可能就会写错;二来重构选择分量的时候也容易出错。
对于第一个问题,我写了一个重构的封装函数(就是上边这段演示的,封装函数为rDWT),只需要选择想要重构的近似分量和细节分量就行。
对于第二个问题,大家只需要注意两个问题:1.重构选择近似分量的时候,近似分量approxLevels只能选择一个层级,比如可以让approxLevels=3或者=4,但是不能=[3,4],否则低频分量就被重构了两次,重构后的数据会超出原始数据大小;2.选择了高层级的近似分量后,就不能在选择低于他的层级的细节分量,比如如果设置了approxLevels=3,就不能再选择让detailLevels =4。
调用上述分解重构及画图函数,需要设置小波名称和小波分解水平,然后调用pDWTandFFT函数即可(函数获取方法见文末)
此时可以画出如下图:
上边提到了三个封装函数,分别是:
- pDWT(小波分解并画图的程序)
- pDWTandFFT(绘制DWT分解图及频谱图)
- rDWT(重构信号并绘制DWT重构图)
上边的测试代码和封装函数,包括工具箱都可以在公众号khscience(看海的城堡)中回复"DWT"获取,EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN、VMD以及HHT相关的程序也有,编程不易,感谢支持~关于EMD、EEMD、CEEMD、VMD和HHT的相关介绍可以看这里:
Mr.看海:这篇文章能让你明白经验模态分解(EMD)——EMD在MATLAB中的实现方法
Mr.看海:希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第四篇)——VMD
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第五篇)——ICEEMDAN
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第六篇)——LMD
Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第七篇)——EWT
相关文章:

类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)
在之前的系列文章里,我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT,我们继续补完该系列。 今天要讲到的是小波分解,通常也就是指离散小波变换(Discrete Wavelet Transform, DWT)。在网上有一些介绍该方法…...

python随手小练10(南农作业题)
题目1: 编写程序,输出1~1000之间所有能被4整除,但是不能被5整除的数 具体操作: for i in range(1,1000): #循环遍历1~999,因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示: 题目2&…...

How to install mongodb-7.0 as systemd service with podman
How to install mongodb-7.0 as systemd service with podman 1、安装1.1、创建卷1.2、配置文件1.3、创建容器1.4、服务管理1.5、容器管理 2、客户端管理 1、安装 1.1、创建卷 配置卷 podman volume create --label typemongo-7.0 --label envdev mongo-7.0-conf数据卷 pod…...

一文彻底理解python浅拷贝和深拷贝
目录 一、必备知识二、基本概念三、列表,元组,集合,字符串,字典浅拷贝3.1 列表3.2 元组3.3 集合3.4 字符串3.5 字典3.6 特别注意浅拷贝总结 四、列表,元组,集合,字符串,字典深拷贝 一…...

什么是软件的生命周期?全方位解释软件的生命周期
软件的生命周期 软件生命周期是指从软件产品的设想开始到软件不再使用而结束的时间。 如果把软件看成是有生命的事 物,那么软件的生命周期可以分成6个阶段,即需求分析、计划、设计、编码、测试、运行维护 需求分析阶段: 分析需求的可行性&…...

网络安全—小白自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...

List 3.5 详解原码、反码、补码
前言 欢迎来到我的博客,我是雨空集(全网同名),无论你是无意中发现我,还是有意搜索而来,我都感到荣幸。这里是一个分享知识、交流想法的平台,我希望我的博客能给你带来帮助和启发。如果你喜欢我…...

数据清洗与规范化详解
数据处理流程,也称数据处理管道,是将原始数据转化为有意义的信息和知识的一系列操作步骤。它包括数据采集、清洗、转换、分析和可视化等环节,旨在提供有用的见解和决策支持。在数据可视化中数据处理是可视化展示前非常重要的一步,…...

Ansible playbook的block
环境 控制节点:Ubuntu 22.04Ansible 2.10.8管理节点:CentOS 8 block 顾名思义,通过block可以把task按逻辑划分到不同的“块”里面,实现“块操作”。此外,block还提供了错误处理功能。 task分组 下面的例子&#x…...

Jupyter Notebook还有魔术命令?太好使了
在Jupyter Notebooks中,Magic commands(以下简称魔术命令)是一组便捷的功能,旨在解决数据分析中的一些常见问题,可以使用%lsmagic 命令查看所有可用的魔术命令 插播,更多文字总结指南实用工具科技前沿动态…...

DailyRecord-231029
iOS&前端: 数组 iOS/Xcode异常:对象数组NSMutableArray添加元素-addObject,但count方法仍然返回0? - 周文 - 博客园(需要初始化) [__NSArrayI addObject:]: unrecognized selector sent to instance (检查addObj…...

雨云虚拟主机使用教程WordPress博客网站搭建教程
雨云虚拟主机(RVH)使用教程与宝塔面板搭建WordPress博客网站的教程,本文会讲解用宝塔面板一键部署以及手动安装两种方式来搭建WordPress博客,选其中一种方式即可。 WordPress WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MyS…...

【SPSS】基于RFM+Kmeans聚类的客户分群分析(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
回溯法(1)--装载问题和0-1背包
一、回溯法 回溯法采用DFS+剪枝的方式,通过剪枝删掉不满足条件的树,提高本身作为穷举搜索的效率。 回溯法一般有子集树和排列树两种方式,下面的装载问题和01背包问题属于子集树的范畴。 解空间类型: 子集树࿱…...

[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)
🌈键盘敲烂,年薪30万🌈 目录 HTTP概述 📕概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 📕特点: 📕插播…...

Java面向对象(进阶)-- 拼电商客户管理系统(康师傅)
文章目录 一、目标二、需求说明(1)主菜单(2)添加客户(3)修改客户(4)删除客户(5)客户列表 三、软件设计结构四、类的设计(1)Customer类…...

Qt配置OpenCV教程,亲测已试过
详细版可参考:Qt配置OpenCV教程,亲测已试过(详细版)_qt opencv_-_Matrix_-的博客-CSDN博客 软件准备:QtOpenCVCMake (QtOpenCV安装不说了,CMake的安装,我用的是:可参考博客&#x…...

【实用网站分享】
1、PyDebloatX https://pydebloatx.com/pydebloatx 是一种用于 Windows 操作系统的 Python 脚本,用于卸载 Windows 10 系统中的预装应用和系统组件,以便提高系统性能和释放磁盘空间。它是 Debloat Windows 10 脚本的一个分支,但具有更友好和…...

问题 U: 折线分割平面(类比+规律)
规律类比: 1.一个折线的角,只会对应一个部分 2.若反向延长,角对应的部分被分为3部分 (即一条折现线改为两条直线) 3.所以n条折线分成的平面数,等于2n条直线减去2n 代码实现:...

npm 彻底卸载
问题: 执行 npm -v 指令出现如下报错: ERROR: npm v10.2.1 is known not to run on Node.js v12.10.0. This version of npm supports the following node versions: ^18.17.0 || >20.5.0. 分析: 由于编译环境问题,需要更新…...

云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)
0x00 云原生技术-docker docker容器和虚拟机的对比:前者是将运行环境打包,封装一个环境。后者是将整个系统打包,封装一个系统。在操作使用上来说各有利弊。 0x01 docker容器的三种逃逸类型 特权模式启动(不安全的启动方式&…...

【Python爬虫三天从0到1】Day1:爬虫核心
目录 1.HTTP协议与WEB开发 (1)简介 (2)请求协议和响应协议 2. requests&反爬破解 (1)UA反爬 (2)referer反爬 (3)cookie反爬 3.请求参数 &#x…...

2023-10 最新jsonwebtoken-jjwt 0.12.3 基本使用
导入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency>包括了下面三个依赖, 所以导入上面一个就OK了 <dependency><groupId>io.jsonwe…...

云起无垠典型案例入选《2023软件供应链安全洞察》报告
近日,历时6个月,由ISC编制的《2023软件供应链安全洞察》报告(以下简称《报告》)正式对外发布。《报告》围绕软件供应链安全现状、技术内核、治理指南、落地实践展开,以期为行业从业者提供有价值的信息和洞见࿰…...

怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)
怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel) 本代码偏向处理高校教务处的工作 休学或请假模板如下: 休学证明(此联存教务办)编号:休202323 计算机系23级计算机科学与技术…...

C语言 定义一个函数,并调用,该函数中打印显示直角三角形
#include<stdio.h> void chengfabiao() {for (int i 1; i < 5; i){for (int j 1; j < i; j){printf("*");} printf("\n");} } int main(int argc,const char *argv[]) {chengfabiao();return 0; }...

Doceker-compose——容器群集编排管理工具
目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1)使用 YAML 时需要注意下面事项 2)ymal文件格式 3)json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…...

Redis 与 MySQL 一致性 实现方案
正常情况下的流程是:请求来了,先检查 Redis 有没有数据,有返回;没有便查询 MySQL 然后 放入 Redis。 此时,如果 MySQL 的数据发生了变化,所以需要同步到 Redis 中。 解决方法:MySQL 中的数据更新…...

运维 | 使用 Docker 安装 Jenkins | Jenkins
运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins,仅作为记录与参考,希望对大家有所帮助。 准备工作 系统:CentOS 7.9配置:4c8g 快速安装 下面以 Docker 方式安装 Jenkin…...

linux-磁盘应用
目录 一、磁盘内容简述 1、一些基本概念 2、分区简述 3、常见文件系统 4、linux硬盘文件 二、对linux系统进行分区 1、用fdisk进行分区 2、用parted进行分区 一、磁盘内容简述 1、一些基本概念 - 扇区大小:512Btyes,0.5KB - 磁盘最小存储单位&…...