类EMD的“信号分解方法”及MATLAB实现(第九篇)——小波包变换(WPT)/小波包分解(WPD)

65 篇文章 90 订阅
5 篇文章 8 订阅

在上一篇我们讲到了离散小波变换DWT,在建立了小波分解的基本概念后,我们现在转向小波包分解——一种更精细的小波分析方法。小波包分解在多分辨率分析的基础上,提供了一种全面的频率分析工具,这在许多复杂信号处理场合中被证明是极为宝贵的。

一、从小波分解到小波包分解

小波包分解(Wavelet Packet Decomposition,WPD)有时候也叫做小波包变换(Wavelet Packet Transform,WPT),是由Coifman等人在小波变换理论的基础上提出的。

小波包分解是在离散小波变换的基础上进一步发展的。在DWT中,信号被分解为一系列高频和低频组分,但仅仅迭代分解低频部分。相比之下,WPD在每一级分解中同时对高频和低频组分进行迭代分解。这意味着它能够更详细地分析信号的频率内容。小波包具有小波变换的优势,能够获得时域特征信息和频域特征信息,这一优势使小波包变换能够对不稳定的信号进行有效的分解。同时,对于高频信号部分以及低频信号部分,小波包变换都有很好的信号处理效果,并保证时频分辨率相同。此外,小波包变换具有良好的连续性,能够提供关于原始信号更加丰富的特征信息。[1]

他们的结构区别一目了然[2]

小波分解树状图

小波包分解树状图

与传统的小波分解相比,小波包分解的关键优势在于其对信号的全频带分解能力。传统的DWT忽略了在高频带中的分解,这在某些应用中可能会丢失重要的信号细节。WPD的这种全频带分析能力特别适用于那些信号特征不仅仅局限于低频范围的应用,由于其细粒度的分析特性,小波包分解在各种应用中显示出其独特的优势。它不仅在信号去噪和数据压缩方面提供了改进的性能,而且在生物医学信号处理、语音识别和地震数据分析中,小波包分解也显示出其无可比拟的能力。例如,在处理EEG信号时,小波包分解能够帮助识别更加细微的神经活动模式,这对于疾病诊断和大脑功能研究至关重要。

二、小波包分解的MATLAB代码实现

理论部分没有太多要说的了。直接进入实战环节。

小波包分解的代码在网上也可以找到一些,但是用起来不太趁手也不太直观。

你在网上找到的图分解结果应该大多是一条条并列摆放的。

但是你想要的分解图应该是按照其物理意义树状排列的。

就像这样:

直观好用的小波包分解结果

是的,笔者按照“类EMD”系列的代码的统一风格,进行了小波包分解画图函数的封装。

实现上述一张图的绘制,只需要三行代码就行:

%% 2.绘制WPT分解图
wname = 'db4';    %小波名称
decompositionLevel = 3; %小波分解水平,正整数
reconstructed_signal = pWPT(signal,decompositionLevel,wname);

当然了,signal作为你要分解的数据对象,需要提前导入。

另外,笔者还封装了分解结果的频谱图函数,画图也只需要三行(代码获取见文末):

%% 3.绘制WPT分解图及频谱图
wname = 'db4';    %小波名称
decompositionLevel = 2; %小波分解水平,正整数
reconstructed_signal2 = pWPTandFFT(signal, decompositionLevel, wname,Fs); % 调用函数进行分解和画图

小波包分解及其频谱图

频谱图没有再采用树状结构,否者画出来的图有些繁复了。目前这样原始信号采用树状、频谱图采用两列对照的形式刚刚好。

总结

通过将小波包分解的原理与传统的小波分解方法相对比,我们可以明显看到其在精细度和适用性方面的优势。WPD提供的全面频率分析工具不仅增强了我们对信号的理解,而且在实际应用中扩大了小波理论的边界。随着分解级别的加深,WPD赋予了分析师在时间-频率域内进行更加细致探查的能力,这是在传统的小波分解中所无法实现的。

我将这篇也归到“类EMD”分解方法的分类中了,主要是取其“分解信号以便分析”的相似目的,但是从底层方法和结果形式上,两者都是有较大区别的,故在此特地说明。

获取代码

上边的测试代码和封装函数,包括工具箱都可以在下边链接获取:

小波包分解画图代码 - 工具箱文档 | 工具箱文档

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

Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)

参考

  1. ^彭旭龙. 基于小波包和贝叶斯优化支持向量机的滚动轴承故障诊断研究[D].华东交通大学,2023.DOI:10.27147/d.cnki.ghdju.2022.000608.
  2. ^基于小波包分析和 BP 神经网络的滚动轴承故障诊断研究
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
emd(Empirical Mode Decomposition,经验模态分解)是一种信号分解方法,旨在将非线性和非平稳信号分解为一系列局部振荡函数,即固有模态函数(Intrinsic Mode Functions,IMFs)。这些IMFs具有不同的频率和幅度特征,可以近似表示原始信号emd信号分解步骤如下: 1. 将原始信号进行辅助函数处理,使其满足emd的两个前提条件:信号的均值为零且极值点数目不少于交叉点数目。 2. 根据原始信号的极值点,找出上包络线和下包络线,通过平均两条包络线得到信号的局部平均函数。 3. 通过原始信号减去局部平均函数得到细节函数,并检验细节函数是否满足emd的两个前提条件。 4. 若细节函数满足条件,则它即为第一次提取得到的IMF,将其从原始信号中减去,得到新的原始信号。 5. 重复以上步骤,直到剩余的信号无法再提取出IMF,此时得到的IMF为最后一个。 在matlab中,可以使用emd函数来实现emd信号分解方法。使用该函数时,需要将原始信号作为输入参数,并设置合适的停止条件来停止分解过程。emd函数会返回分解得到的IMFs和剩余的信号。 以下是使用matlab实现emd信号分解的示例代码: ```matlab % 原始信号 signal = [2, 5, 4, 3, 6, 8, 7, 7, 10, 8]; % 设置emd函数的停止条件 stop_criteria = 0.01; % 使用emd函数进行信号分解 [imfs, residual] = emd(signal, 'stoppingcriterion', stop_criteria); % 输出分解得到的IMFs和剩余信号 disp("IMFs:"); disp(imfs); disp("Residual:"); disp(residual); ``` 以上代码中,我们定义了一个原始信号和停止条件,然后使用emd函数对原始信号进行分解,并将得到的IMFs和剩余信号输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.看海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值