EEMD分解如何对IMF分量进行显著性检验?

EEMD简介

集合经验模态分解 (EEMD)方法是一种时间上局部的自适应时间序列分析技术, 适合于分析非线性、非平稳的时间序列. EEMD 方法改进了经验模态分解 (EMD)的 模态混叠问题 。EEMD 方法是利用多次测量取平均值的原理,通过在原数据中加入适当大小的白噪音来模拟多次观测的情景, 经多次计算后做集合平均。

EMD简介

EMD 方法是一种适合于处理非平稳数据序列的方法, 它将信号中不同尺度的波动和趋势逐级分解开来, 形成一系列具有不同特征尺度的数据序列, 每一个序列称为一个内在模函数 (intrinsic mode function, IMF) 分量, 最低频率的 IMF 分量代表原始信号的总趋势或均值的时间序列。EMD分解的具体过程网上有大量的讲解,本文就不具体介绍。
EEMD分解如何对IMF分量进行显著性检验?_第1张图片

如何对EEMD分解的分量的显著性进行校验?

EEMD 的核心思想是利用白噪声具有频率均匀分布的统计特性, 当信号加入高斯白噪声后, 将使信号在不同尺度上具有连续性, 改变了信号极值点的特性, 促进抗混分解, 有效地避免了模式混叠现象。EEMD可借助于白噪声的集合扰动进行显著性检验, 从而给出各个 IMF 的信度
分解得到的各 IMF 分量是属于单纯噪音, 还是原始序列中有物理意义的分量, 可以通过显著性检验来判断 . 通过分析各 IMF 分量的能量谱密度周期的分布判断其属性, 从而选取分析所需要的IMF分量。
通过蒙特卡罗法对白噪声进行试验,可以得到可得到白噪声的第 k 个 IMF 分量的能量谱密度均值 E(k)和平均周期 T(k) 的近似关系为:
ln(E(k))+ln(T(k))=0
根据以上的等式可以给出白噪声能量谱分布的置信区间,信号的显著性检验。

显著性检验图像分析

位于置信度曲线以上的 IMF 分量表明其通过显著性检验, 可认为是在所选置信水平范围内包含了具有实际物理意义的信息; 若分解所得IMF 的能量相对于周期分布位于置信度曲线以下,则认为未通过显著性检验, 其所含信息多为白噪声成分。越靠近左边的 IMF 分量, 表示频率越高, 周期越小. 纵轴为 IMF 分量具有的能量谱密度,越靠近上方表示 IMF 分量具有的能量越高, 振幅越
大.
EEMD分解如何对IMF分量进行显著性检验?_第2张图片

部分代码

绘图部分代码

%%
% 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);

参考文献

  1. Wu Z, Huang N E 2009 Adv. Adapt. Data Anal. 1 1
  2. Wu Z H, Huang N E, Long S R 2007 Proc. Natl. Acad. Sci. USA 10414889
  3. Flandrin P, Rillin G, Gonc¸alves P 2004 Proc. Lett. 11 112
  4. Wu Z H, Huang N E 2004 Proc. Roy. Soc. London A 460 1597
  5. Wu Z, Huang N E, Chen X 2009 Adv. Adapt. Data Anal. 1 339
  6. Huang N E, Wu Z, Long S R 2009 Adv. Adapt. Data Anal. 1 177

.

你可能感兴趣的:(信号处理,matlab,数据分析)