%%%%%%%局部均值分解(LMD)
%%%%%%%将信号分解成AM和FM部分
function [Am_d Fm_d]=lmd_test(x)
%%%%%Am_d幅值部分
%%%%%Fm_d调频部分
%%%%%x原始信号
%%%%%n分解信号的阶数,也可以不设置,默认就是分解到最后一层,此时暂时不设置
n = length(x);
temp_x = x;
%%%%%搜索局部最值
[inmin inmax inzero] = extr(x); %%% 得到最大最小值和零点值
[tmin,tmax,zmin,zmax] = boundary_conditions(inmin,inmax,1:n,x,x,2);%%%%端点延拓
%%%%%做局部均值和包络
% [localMaxMin indexTemp]=CombinMaxMin(tmin,tmax,zmin,zmax);
% [local_mean local_en index]=LocalMeanEn(localMaxMin,indexTemp);
%%%%%本来应该用移动平均法做局部均值函数,这里还是利用cubic三次样条函数做的
% interp1.method='cubic';%%%%不同的样条函数在这里换
LocalMaxEn = interp1(tmax,zmax,1:n,'spline'); %%%%%上包络
LocalMinEn = interp1(tmin,zmin,1:n,'spline'); %%%%%下包络
LocalMeanFun = (LocalMaxEn+LocalMinEn)/2; %%%相邻两个极值点的平均值mi,并得到局部均值函数
LocalEnFun = (abs(LocalMaxEn-LocalMinEn))/2; %%%计算包络估计值ai,得到包络估计函数
% LocalMeanFun=interp1(index,local_mean,1:n,interpl.method);
% LocalEnFun=interp1(index,local_en,1:n,interpl.method);
Am_d = LocalEnFun; %%%第一个包络估计值,用于后面计算瞬时幅值函数,也相当于对ai进行初值赋值;
hhhtt_tt = x-LocalMeanFun; %%%%从原始信号中分离出局部均值函数
ssstt_tt = hhhtt_tt./LocalEnFun; %%%对hhhhtt_tt函数进行解调
%%%%%判断ssstt_tt是不是纯调频信号
flag = 1;
Delta_delta = 1e-6; %%%人为设定误差Δ
temp_ss = find(ssstt_tt>1+Delta_delta | ssstt_tt<-1-Delta_delta); %%%找出解调信号ssstt_tt中大于1+Δ或者小于1-Δ的元素的位置,判断是否满足迭代终止条件:aij >︱1+Δ︱;
%temp_ss = find(ssstt_tt>=1-Delta_delta & ssstt_tt<=1+Delta_delta); %%%判断是否满足迭代终止条件:1-Δ≤aij≤1+Δ;
[LineSize ColumnSize] = size(temp_ss); %%%%输出temp_ss的行数和列数,并分别存在LineSize和ColumnSize中;
flag = ColumnSize;
%%%CounterSize=1;
while flag %%%& CounterSize<100
x = ssstt_tt;
%%%%%搜索局部最值
[inmin inmax inzero] = extr(x);
[tmin,tmax,zmin,zmax] = boundary_conditions(inmin,inmax,1:n,x,x,2);%%%%端点延拓
%%%%%做局部均值和包络
LocalMaxEn = interp1(tmax,zmax,1:n,'spline'); %%%%%上包络
LocalMinEn = interp1(tmin,zmin,1:n,'spline'); %%%%%下包络
LocalMeanFun = (LocalMaxEn+LocalMinEn)/2;
LocalEnFun = (abs(LocalMaxEn-LocalMinEn))/2;
% [localMaxMin indexTemp]=CombinMaxMin(tmin,tmax,zmin,zmax);
% [local_mean local_en index]=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);
[LineSize ColumnSize] = size(temp_ss);
flag = ColumnSize;
%%%CounterSize=CounterSize+1;
end
Fm_d = ssstt_tt;
评论0