总体平均经验模态分解(EEMD)虽然在一定程度上抑制了模态混淆现象,但是其计算量较大,添加的白噪声不能被完全中和。湖南大学的程军圣等人提出了改进的EEMD(MEEMD)。实验结果证明,MEEMD不仅能够抑制EMD分解过程中的模态混淆问题,而且缩小了工作量、减少了重构误差。
相关文献:[1]郑近德, 程军圣, 杨宇. 改进的EEMD算法及其应用研究[J]. 振动与冲击, 2013(21):21-26.
MATLAB
function modes=meemd(x,Nstd,Ne,MAXmodes,m,tao,theta0)
%----------------------------------------------------------------------
% INPUTs
% x: signal to decompose
% Nstd: noise standard deviation
% Ne: number of realizations
% MaxIter: maximum number of sifting iterations allowed.
% OUTPUTs
% modes: contain the obtained modes in a matrix with the rows being the modes
% -------------------------------------------------------------------------
%% 数量运算标准化
desvio_x=std(x);
x=x/desvio_x;
modes=zeros(size(x));
aux=zeros(MAXmodes+1,size(x,2)); %+1表示最后1行是余项
acum=zeros(size(x));
%%% 生成噪声信号
for i=1:Ne
white_noise{i}=randn(size(x));
end
while nnz(diff(sign(diff(x-acum))))>2
%%% 生成IMF,平均计算
for i=1:Ne
[temp1, ~, ~]=emd(x-acum+Nstd*white_noise{i},'MaxNumIMF',MAXmodes);
[temp2, ~, ~]=emd(x-acum-Nstd*white_noise{i},'MaxNumIMF',MAXmodes);
te=min(size(temp1,1),size(temp2,1));
a = zeros(MAXmodes+1,size(temp1,2));
temp1=[temp1(1:te,:);a(te+1:MAXmodes+1,:)];
temp2=[temp2(1:te,:);a(te+1:MAXmodes+1,:)];
if te<=MAXmodes+1
aux=aux+(temp1+temp2)./(2*Ne);
end
end
%%%计算全部的IMF的排列熵
for i = 1:size(aux,1)
auxPE=pec(aux(i,:),m,tao);
if auxPE>=theta0
acum=acum+aux(i,:);
end
end
%%% 剩余信号进行EMD分解
modes=emd(x-acum,'MaxNumIMF',MAXmodes);
break
end
%%% 恢复原来的运算量级
modes=modes*desvio_x;
end
程序的输入为自行编辑的合成信号,读者可读入自己的数据。
计算结果:
在MEEMD中关于EMD分解,很多程序将MaxNumIMF写为后面的MAXMODE;导致程序运行不同。这点应引起注意。
[temp1, ~, ~]=emd(x-acum+Nstd*white_noise{i},'MaxNumIMF',MAXmodes);
[temp2, ~, ~]=emd(x-acum-Nstd*white_noise{i},'MaxNumIMF',MAXmodes);
参考文献:
[1]郑近德, 程军圣, 杨宇. 改进的EEMD算法及其应用研究[J]. 振动与冲击, 2013(21):21-26.