集合经验模态分解 (EEMD)方法是一种时间上局部的自适应时间序列分析技术, 适合于分析非线性、非平稳的时间序列. EEMD 方法改进了经验模态分解 (EMD)的 模态混叠问题 。EEMD 方法是利用多次测量取平均值的原理,通过在原数据中加入适当大小的白噪音来模拟多次观测的情景, 经多次计算后做集合平均。
EMD 方法是一种适合于处理非平稳数据序列的方法, 它将信号中不同尺度的波动和趋势逐级分解开来, 形成一系列具有不同特征尺度的数据序列, 每一个序列称为一个内在模函数 (intrinsic mode function, IMF) 分量, 最低频率的 IMF 分量代表原始信号的总趋势或均值的时间序列。EMD分解的具体过程网上有大量的讲解,本文就不具体介绍。
EEMD 的核心思想是利用白噪声具有频率均匀分布的统计特性, 当信号加入高斯白噪声后, 将使信号在不同尺度上具有连续性, 改变了信号极值点的特性, 促进抗混分解, 有效地避免了模式混叠现象。EEMD可借助于白噪声的集合扰动进行显著性检验, 从而给出各个 IMF 的信度。
分解得到的各 IMF 分量是属于单纯噪音, 还是原始序列中有物理意义的分量, 可以通过显著性检验来判断 . 通过分析各 IMF 分量的能量谱密度周期的分布判断其属性, 从而选取分析所需要的IMF分量。
通过蒙特卡罗法对白噪声进行试验,可以得到可得到白噪声的第 k 个 IMF 分量的能量谱密度均值 E(k)和平均周期 T(k) 的近似关系为:
ln(E(k))+ln(T(k))=0
根据以上的等式可以给出白噪声能量谱分布的置信区间,信号的显著性检验。
位于置信度曲线以上的 IMF 分量表明其通过显著性检验, 可认为是在所选置信水平范围内包含了具有实际物理意义的信息; 若分解所得IMF 的能量相对于周期分布位于置信度曲线以下,则认为未通过显著性检验, 其所含信息多为白噪声成分。越靠近左边的 IMF 分量, 表示频率越高, 周期越小. 纵轴为 IMF 分量具有的能量谱密度,越靠近上方表示 IMF 分量具有的能量越高, 振幅越
大.
绘图部分代码
%%
% exclude original data and residual
imfs=imfs(1:end-1,:)';
[sigline95,~]=significance(imfs,0.05);
[sigline99,~]=significance(imfs,0.01);
[sigline80,~]=significance(imfs,0.2);
[sigline50,logep]=significance(imfs,0.5);
figure;
plot(sigline99(:,1),sigline99(:,2),'k-'); % 99 percenta line
hold on
plot(sigline95(:,1),sigline95(:,2),'k--'); % 95 percenta line
hold on
plot(sigline80(:,1),sigline80(:,2),'k:'); % 80 percenta line
hold on
plot(sigline50(:,1),sigline50(:,2),'k-.'); % 50 percenta line
plot(logep(:,1),logep(:,2),'k.');
legend('99%','95%','80%','50%','IMF');
xlabel('LOG2 ( Mean Period )');
ylabel('LOG2 ( Mean Normalized Energy )');
title('Significance test of IMFs of white noise');
for i=1:size(logep,1)
text_ = ['IMF',num2str(i)];
text(logep(i,1)+0.1,logep(i,2),text_,'color','k');
end
显著性检验部分代码
function [sigline, logep] = significance(imfs, percenta)
nDof = length(imfs(:,1));
pdMax = fix(log(nDof))+1;
pdIntv = linspace(1,pdMax,100);
yBar = -pdIntv;
for i=1:100,
yUpper(i)=0;
yLower(i)= -3-pdIntv(i)*pdIntv(i);
end
for i=1:100,
sigline(i,1)=pdIntv(i);
yPos=linspace(yUpper(i),yLower(i),5000);
dyPos=yPos(1)-yPos(2);
yPDF=dist_value(yPos,yBar(i),nDof);
sum = 0.0;
for jj=1:5000,
sum = sum + yPDF(jj);
end
jj1=0;
jj2=1;
psum1=0.0;
psum2=yPDF(1);
pratio1=psum1/sum;
pratio2=psum2/sum;
while pratio2 < percenta,
jj1=jj1+1;
jj2=jj2+1;
psum1=psum1+yPDF(jj1);
psum2=psum2+yPDF(jj2);
pratio1=psum1/sum;
pratio2=psum2/sum;
yref=yPos(jj1);
end
sigline(i,2) = yref + dyPos*(pratio2-percenta)/(pratio2-pratio1);
sigline(i,2) = sigline(i,2) + 0.066*pdIntv(i) + 0.12;
end
sigline=1.4427*sigline;
columns=length(imfs(1,:));
for i=1:columns,
logep(i,2)=0;
logep(i,1)=0;
for j=1:nDof,
logep(i,2)=logep(i,2)+imfs(j,i)*imfs(j,i);
end
logep(i,2)=logep(i,2)/nDof;
end
sfactor=logep(1,2);
for i=1:columns,
logep(i,2)=0.5636*logep(i,2)/sfactor; % 0.6441
end
for i=1:3,
[spmax, spmin, flag]= extrema(imfs(:,i));
temp=length(spmax(:,1))-1;
logep(i,1)=nDof/temp;
end
for i=4:columns,
omega=ifndq(imfs(:,i),1);
sumomega=0;
for j=1:nDof,
sumomega=sumomega+omega(j);
end
logep(i,1)=nDof*2*pi/sumomega;
end
logep=1.4427*log(logep);
.