局部均值分解(local mean decomposition , LMD)方法同经验模态分解方法(EMD)一样,也是一种自适应信号处理方法。LMD通过改变信号分解过程能有效改进EMD方法存在的包络拟合不准确、边界处发散等问题.
代码如下:
clear all; clc; % 这里是仿真信号,可改成自己的信号 fs=2000; N=2048; n=0:N-1; t=n/fs; x=(1+0.5*t).*sin(2*pi.*20*t)+2*cos(2*pi.*3*t); %绘制仿真信号和其频谱图 figure(1) subplot(211) plot(t,x) subplot(212) y2=x; L=length(y2); NFFT = 2^nextpow2(L); Y = fft(y2,NFFT)/L; f = fs/2*linspace(0,1,NFFT/2); plot(f,2*abs(Y(1:NFFT/2))) % 局域均值分析 x=x'; c = x'; N = length(x); A = ones(1,N); PF = []; aii = 2*A; while(1) si = c; a = 1; while(1) h = si; maxVec = []; minVec = []; % 寻找极大值点和极小值点 for i = 2: N - 1 if h (i - 1) < h (i) & h (i) > h (i + 1) maxVec = [maxVec i]; end if h (i - 1) > h (i) & h (i) < h (i + 1) minVec = [minVec i]; end end % 检查是否有残余 if (length (maxVec) + length (minVec)) < 2 break; end % 原始信号中的两边两个点的判断 lenmax=length(maxVec); lenmin=length(minVec); %先是左边这个点 if h(1)>0 if(maxVec(1)<minVec(1)) yleft_max=h(maxVec(1)); yleft_min=-h(1); else yleft_max=h(1); yleft_min=h(minVec(1)); end else if (maxVec(1)<minVec(1)) yleft_max=h(maxVec(1)); yleft_min=h(1); else yleft_max=-h(1); yleft_min=h(minVec(1)); end end %然后判断右边这个点 if h(N)>0 if(maxVec(lenmax)<minVec(lenmin)) yright_max=h(N); yright_min=h(minVec(lenmin)); else yright_max=h(maxVec(lenmax)); yright_min=-h(N); end else if(maxVec(lenmax)<minVec(lenmin)) yright_max=-h(N); yright_min=h(minVec(lenmin)); else yright_max=h(maxVec(lenmax)); yright_min=h(N); end end %使用三次样条插值方法,对极大值向量和极小值向量进行插值 %spline interpolate maxEnv=spline([1 maxVec N],[yleft_max h(maxVec) yright_max],1:N); minEnv=spline([1 minVec N],[yleft_min h(minVec) yright_min],1:N); mm = (maxEnv + minEnv)/2;%得到局部均值函数 aa = abs(maxEnv - minEnv)/2;%得到包络函数 mmm = mm; aaa = aa; preh = h; h = h-mmm;%从原始信号中分离处局部均值函数 si = h./aaa;%对分离出的信号进行解调 a = a.*aaa; aii = aaa; B = length(aii); C = ones(1,B); bb = norm(aii-C);%返回aii-C的最大奇异值,aii就是那个包络函数 if(bb < 1000)%如果bb<1000,就得到了纯调频函数 break; end end %分解1个Pf分量在这结束 pf = a.*si;%包络函数和纯调频函数相乘,得到PF分量 PF = [PF; pf]; bbb = length (maxVec) + length (minVec); % 简单的一个结束分解的条件 if (length (maxVec) + length (minVec)) < 20 break; end c = c-pf; end m=x'-PF(1,:)-PF(2,:);%如果分解出2个,从原始信号中减去,得到残余分量 figure(2); subplot(4,1,1),plot(n,x),ylabel('X(t)'); subplot(4,1,2),plot(n,PF(1,:)),ylabel('PF_1(t)'); subplot(4,1,3),plot(n,PF(2,:)),ylabel('PF_2(t)'); subplot(4,1,4),plot(n,m),ylabel('u(t)'); xlabel('Time / S');最后分解出来的图: