“类EMD”算法分解后要怎样使用(2)——高频、低频、趋势项分量判别与重构,及MATLAB代码实现

之前我们有了十几篇文章讲述了EMD算法的基础理论、IMF的含义、EMD的MATLAB实现方法,EEMDCEEMDCEEMDANVMDICEEMDANLMDEWT、SWT的理论及代码实现,还讲到了HHT算法理论及其代码实现

上一篇介绍了IMF分量的方差贡献率、平均周期、相关系数,今天这篇讲一下也很常用和好用的IMF处理方法。

一、关于IMF的重构

有很多同学问IMF的重构要怎么做,信号重构确实是EMD方法后处理的重要方法。重构通常面临着两个问题:

(1)重构这个操作要怎样实现?

(2)选哪些分量重构?

首先回答第(1)个问题,其实所谓的“重构”简单理解就是“加和”。比如如果想让第1、3、5个IMF分量重构,就将对应的分量相加即可。

具体到代码实现中,如果是用的本专栏中“类EMD”分解的系列代码,笔者在分解算法中都做了统一:分解得到的IMF分量都是沿着行向量排布的,即IMF的维度为(m,n),其中m代表的是IMF分量数(包括res),n代表的是数据长度。

此时IMF1、3、5重构就可以写成:

IMFnew = imf(1,:)+imf(3,:)+imf(5,:);

对于第(2)个问题,就相对复杂一些了。对于需要选取分量的筛选标准,首先建议同学们参考研究领域相关论文的通常做法,因为EMD方法的应用范围广泛,不同的用途采用的方法会有区别。

不过下面要介绍的是一个相对通用的重构方法。

二、高频、低频、趋势项分量判别与重构

趋势项就是res分量,这个不需要再额外花费精力判别。

我们要关注的主要是怎样区分高频和低频分量。

这里用的判别标准是这样的[1]

将IMF1记为指标1,IMF1+IMF2为指标2,以此类推,前i个IMF的和加成为指标i,计算指标1至指标7的均值,并对该均值是否显著区别于0进行t检验。(有些论文中直接使用各IMF分量作为对应指标,本文采用各IMF分量作为对应指标的计算方法

为什么以是否显著区别于0作为高低频的分界呢?之前我们在讲EMD分解时说过,IMF分量要满足上、下包络线相对于时间轴局部对称。对于高频的IMF分量,上下包络线基本就是由众多的信号峰值点连接起来得到的,所以包络线的对称就意味着IMF分量数据基本对称,数据均值趋近于0;对于低频的IMF分量,信号周期大,包络线由少量峰值插值获取,包络趋势与原信号趋势走向偏差大,所以包络线对称时往往信号分量并不对称,甚至偏离很远,此时的IMF分量自然很难保证均值为0.

某信号分解得到的高频分量

某信号分解得到的低频分量

观察上边两张高频分量和低频分量图,应该更容易理解高频分量均值趋近于0,低频分量更不易趋近于0。

举例说明,还是以上篇文章中的2012-2020年原油期货价格历史数据为例,首先进行EEMD分解:

安装上述思路进行t检验,发现在指标5处显著不为0,那么IMF1-4代表高频分量,IMF5-10代表低频分量。

此时我们再将高频分量、低频分量分别重构,就能得到数据的高频特征和低频特征。

我们把高频特征、低频特征、趋势项和原始信号画到同一张图上:

这个结果还是很漂亮的。

四、MATLAB代码实现

按照惯例,将上述功能封装成方便调用的函数文件,我将其命名为imfHLdif函数,函数说明如下:

function [HighCom,LowCom,TrCom,HighIdx,LowIdx]=imfHLdif(data,imf,figflag)
%% 根据重构算法将分解得出的IMF进行高低频的区分
% 参考《基于EEMD模型的中国碳市场价格形成机制研究》
% 该方法将IMF1记为指标1,IMF1+IMF2为指标2,以此类推,
% 前i个IMF的和加成为指标i,并对该均值是否显著区别于0进行t检验。
% 输入:
% data:分解前的原始数据
% imf:经过模态分解方法得到的分量,每一行为一个分量
% figflag:设置是否画图的参数,'on'为画图,'off'为不画图
% 输出:
% HighCom:重构后的高频分量
% LowCom:重构后的低频分量
% TrCom:趋势项
% HighIdx:高频分量对索引
% LowIdx:低频分量对索引

调用时只需要一行代码:

[HighCom,LowCom,TrCom,HighIdx,LowIdx]=imfHLdif(data,imf,'on');

高、低频分量的判别与重构,趋势项的导出,重构图像绘制(上边那张图)就都可以实现了。

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

IMF方差贡献率、平均周期、相关系数的计算,高频、低频、趋势项分量判别与重构程序(公开版) | 工具箱文档

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

参考

  1. ^齐绍洲,赵鑫,谭秀杰.基于EEMD模型的中国碳市场价格形成机制研究[J].武汉大学学报:哲学社会科学版,2015(4):56-65.

猜你喜欢

转载自blog.csdn.net/fengzhuqiaoqiu/article/details/123647200
今日推荐