寒月清风
发表于 2015-4-9 14:58
楼主也带下新人啊
随风而逝dream
发表于 2015-4-16 21:43
这个方法挺好的啊
teamo
发表于 2015-11-13 09:00
大神啊
teamo
发表于 2015-11-13 16:46
用实际信号带进去试了一下,感觉信号的末端分解的很不好,楼主有改进方法吗
teamo
发表于 2015-11-16 13:28
yghit08 发表于 2012-6-16 15:44
回复 12 # 雨夜1011 的帖子
我还没有去处理实际信号。在LMD中不需要做上下包络(那是EMD做的)。LMD做的是 ...
移动平均法直接用smooth可以吗?matlab自带的平滑函数
meil32
发表于 2015-11-17 09:09
teamo 发表于 2015-11-16 13:28
移动平均法直接用smooth可以吗?matlab自带的平滑函数
smooth就是缺省项也就是'moving'就是一种移动平均法
teamo
发表于 2015-11-18 16:45
我用移动平均法做了一下,LZ指点一下,不会传压缩文件,就直接贴出来给你看下
%%%%%%%局部均值分解(LMD)
%%%%%%%将信号分解成AM和FM部分
function =lmd_test(x)
%%%%%Am_d幅值部分
%%%%%Fm_d调频部分
%%%%%x原始信号
%%%%%n分解信号的阶数,也可以不设置,默认就是分解到最后一层,此时暂时不设置
n=length(x);
temp_x=x;
%%%%%搜索局部最值
=extr(x);
=boundary_conditions(inmin,inmax,1:n,x,x,100);%%%%端点延拓
%%%%%做局部均值和包络
=CombinMaxMin(tmin,tmax,zmin,zmax);
=LocalMeanEn(localMaxMin,indexTemp);
%%%%%本来应该用移动平均法做局部均值函数,这里还是利用cubic样条函数做的
% interp1.method='cubic';%%%%不同的样条函数在这里换
% LocalMaxEn=interp1(tmax,zmax,1:n,'cubic');%%%%%上包络
% LocalMinEn=interp1(tmin,zmin,1:n,'cubic'); %%%%%下包络
%把点用直线连起来
m=interp1(index,local_mean,1:n);
a=interp1(index,local_en,1:n);
% 平滑曲线
LocalMeanFun=smooth(m);
LocalEnFun=smooth(a);
LocalMeanFun=LocalMeanFun';
LocalEnFun=LocalEnFun';
% LocalMeanFun=(LocalMaxEn+LocalMinEn)/2;
% LocalEnFun=(abs(LocalMaxEn-LocalMinEn))/2;
% LocalMeanFun=interp1(index,local_mean,1:n,interpl.method);
% LocalEnFun=interp1(index,local_en,1:n,interpl.method);
Am_d=LocalEnFun;
hhhtt_tt=x-LocalMeanFun;
ssstt_tt=hhhtt_tt./LocalEnFun;
%%%%%判断ssstt_tt是不是纯调频信号
flag=1;
Delta_delta=1e-8;
temp_ss=find(ssstt_tt>1+Delta_delta | ssstt_tt<-1-Delta_delta);
=size(temp_ss);
flag=ColumnSize;
%%%CounterSize=1;
while flag %%%& CounterSize<100
x=ssstt_tt;
%%%%%搜索局部最值
=extr(x);
=boundary_conditions(inmin,inmax,1:n,x,x,4);%%%%端点延拓
%%%%%做局部均值和包络
% LocalMaxEn=interp1(tmax,zmax,1:n,'cubic');%%%%%上包络
% LocalMinEn=interp1(tmin,zmin,1:n,'cubic'); %%%%%下包络
=CombinMaxMin(tmin,tmax,zmin,zmax);
=LocalMeanEn(localMaxMin,indexTemp);
%把点用直线连起来
m=interp1(index,local_mean,1:n);
a=interp1(index,local_en,1:n);
%平滑曲线
LocalMeanFun=smooth(m);
LocalEnFun=smooth(a);
LocalMeanFun=LocalMeanFun';
LocalEnFun=LocalEnFun';
% LocalMeanFun=(LocalMaxEn+LocalMinEn)/2;
% LocalEnFun=(abs(LocalMaxEn-LocalMinEn))/2;
% =CombinMaxMin(tmin,tmax,zmin,zmax);
% =LocalMeanEn(localMaxMin,indexTemp);
%%%%%本来应该用移动平均法做局部均值函数,这里还是利用cubic样条函数做的
% LocalMeanFun=interp1(index,local_mean,1:n,interpl.method);
% LocalEnFun=interp1(index,local_en,1:n,interpl.method);
Am_d=Am_d.*LocalEnFun;
hhhtt_tt=x-LocalMeanFun;
ssstt_tt=hhhtt_tt./LocalEnFun;
temp_ss=find(ssstt_tt>1+Delta_delta | ssstt_tt<-1-Delta_delta);
=size(temp_ss);
flag=ColumnSize;
%%%CounterSize=CounterSize+1;
end
Fm_d=ssstt_tt;
kkkttt
发表于 2015-11-19 09:06
teamo 发表于 2015-11-18 16:45
我用移动平均法做了一下,LZ指点一下,不会传压缩文件,就直接贴出来给你看下
是代码存在问题还是希望大家评价一下结果好不好?
如果是后者,建议上传相关的结果图片,有时候别人并不一定方便运行你的程序
kkkttt
发表于 2015-11-19 09:11
teamo 发表于 2015-11-18 16:45
我用移动平均法做了一下,LZ指点一下,不会传压缩文件,就直接贴出来给你看下
图片和附件上传的方法见图片
teamo
发表于 2015-11-19 09:15
kkkttt 发表于 2015-11-19 09:06
是代码存在问题还是希望大家评价一下结果好不好?
如果是后者,建议上传相关的结果图片,有时候别人并不 ...
图片不太会传,这个帖子看到我这楼应该都知道怎么做了,就把楼主贴的代码里面lmd_test.m文件替换成我这个就可以运行了,出来的结果跟楼主的差不多
teamo
发表于 2015-11-19 09:16
teamo 发表于 2015-11-19 09:15
图片不太会传,这个帖子看到我这楼应该都知道怎么做了,就把楼主贴的代码里面lmd_test.m文件替换成我这个 ...
因为我觉得既然LMD里指明要用滑动平均来做,就不能用三次样条函数做,这样就不是真正的lmd了
teamo
发表于 2015-11-19 09:17
teamo 发表于 2015-11-19 09:16
因为我觉得既然LMD里指明要用滑动平均来做,就不能用三次样条函数做,这样就不是真正的lmd了
还有就是,我用楼主给的信号做,结果还可以,但是换成真实信号,效果就很差
christy
发表于 2015-11-20 12:06
teamo 发表于 2015-11-19 09:16
因为我觉得既然LMD里指明要用滑动平均来做,就不能用三次样条函数做,这样就不是真正的lmd了
个人理解三次样条函数也应该属于滑动平均的一种方式,只是这种方式精度比较差而已
下面的附件可以参考一下
teamo
发表于 2015-11-24 10:07
christy 发表于 2015-11-20 12:06
个人理解三次样条函数也应该属于滑动平均的一种方式,只是这种方式精度比较差而已
下面的附件可以参考一 ...
我看看
teamo
发表于 2015-11-24 10:08
christy 发表于 2015-11-20 12:06
个人理解三次样条函数也应该属于滑动平均的一种方式,只是这种方式精度比较差而已
下面的附件可以参考一 ...
我看看