学习笔记记录
原文链接-https://zhuanlan.zhihu.com/p/121803211
EEMD、VMD等类似于EMD分解方法的信号分解方法。“类EMD”方法.
我们总是希望把一个信号写成一系列的子信号的组合,然后加上一个性质不同的信号,所谓的残差信号或者剩余信号。
一、EEMD?
为什么要提出EEMD?
解决EMD方法中的模态混叠现象。说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中出现,另一种是同一个特征尺度的信号被分散到不同的IMF分量中。
EEMD是怎样解决这个问题的呢:
EEMD主要的改进思路是:利用白噪声均值为0的特性,通过在分解的过程中多次引入均匀分布的白噪声,将信号本身的噪声通过多次人为添加的噪声掩盖过去,从而得到更加精准的上下包络线。同时对分解结果进行平均处理,平均处理次数越多,噪声给分解带来的影响就越小。
处理步骤如下四部:
1. 设定原始信号的处理次数m
2. 给这m个原始信号分别添加随机白噪声,组成一系列新的信号
3. 对这一系列的新信号分别进行EMD分解,得到一系列的IMF分量
4. 对相应模态的IMF分量分别求均值,得到EEMD分解结果
注意:相较于EMD的(几乎)无参数傻瓜式自适应分解,EEMD就有一些参数需要调试了:分别是用于平均处理的次数M、添加的白噪声的幅值。其中白噪声的幅值通常用“白噪声幅值的标准差与原始信号幅值标准差之比”来表征。
二、EEMD的编程实现
利用EMD代码工具箱。
1.EMD和EEMD的对比
生成模拟信号的代码如下(示例):间断性高频脉冲
%% 1.生成仿真信号
fs = 400; %采样频率
t = 0:1/fs:0.75; %时间轴
x = sin(2*pi*4*t); %低频正弦信号
y = 0.5*sin(2*pi*120*t); %高频正弦信号
for i = 1:length(t) %将高频信号处理成间断性
if mod(t(i),0.25)>0.11&&mod(t(i),0.25)<0.12
else
y(i) = 0;
end
end
sig = x+y; %信号叠加
figure('color','white')
plot(t,sig,'k') %绘制原始信号
EMD分解结果和EEMD分解结果:
EEMD分解的IMF1、IMF2和IMF3是含有高频的正弦间歇性信号,IMF2和IMF3可以看做IMF1很小的能量损失,分析高频信号时,可以将IMF1、2、3叠加起来作为重构的高频信号,会得到更好的分析效果。IMF4也很好地提取了信号中的低频分量。
相比之下,EMD的分解结果存在着严重的模态混叠,失去使用的意义了。
上图中进行EEMD分解的程序如下:
Nstd = 0.2; %Nstd为附加噪声标准差与Y标准差之比
NE = 100; %NE为对信号的平均次数
imf = pEEMD(sig,t,Nstd,NE);
% function imf = pEEMD(data,FsOrT,Nstd,NE)
% 画信号EEMD分解图
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% 输出:
% imf为经eemd分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMD(data,fs,0.2,100);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMD(data,t,0.2,100);
2.工具解释
上述程序中的pEEMD是笔者经过再次封装的eemd程序,在中央大学提供的eemd函数中,返回的imf中带着原始信号,且行列方向与其他工具箱的分解函数也不一致,为了与其他信号分解方法的结果保持统一,在封装程序里对其进行了处理。此时imf即为eemd分解后的各分量信号。同时EEMD分解的图也可以画出来。
上边的测试代码,包括工具箱都可以在公众号(括号的城堡)中获取,EMD以及HHT相关的程序也有
总结
主要是:EEMD对于改善静态混叠具有较好的效果。