延拓法matlab,自己修改的不带端点延拓的经验模态分解(EMD)matlab程序和例子

下面的是matlab的EMD的不带端点延拓的分解程序代码,

07新出来的包含复数的emd函数(端点视作极值点)

function [imf,ort,nbits] = emd3(varargin)

[x,t,sd,sd2,tol,MODE_COMPLEX,ndirs,display_sifting,sdt,sd2t,r,imf,k,nbit,NbIt,MAXITERATIONS,FIXE,FIXE_H,MAXMODES,INTERP,mask]

= init(varargin{:});

if display_sifting

fig_h = figure;

end

% 主循环 : 至少要求存在3个极值点,如果采用mask信号,不进入主循环

while ~stop_EMD(r,MODE_COMPLEX,ndirs)

&& (k < MAXMODES+1

|| MAXMODES == 0) && ~any(mask)

% 当前模式

m = r;

% 前一次迭代的模式

mp = m;

% 计算均值和停止条件

if FIXE % 如果设定了迭代次数

[stop_sift,moyenne] =

stop_sifting_fixe(t,m,INTERP,MODE_COMPLEX,ndirs);

elseif FIXE_H %

如果设定了迭代次数,且保留停止条件|#zeros-#extrema|<=1

stop_count =

0;

[stop_sift,moyenne] =

stop_sifting_fixe_h(t,m,INTERP,stop_count,FIXE_H,MODE_COMPLEX,ndirs);

else % 采用默认停止条件

[stop_sift,moyenne] =

stop_sifting(m,t,sd,sd2,tol,INTERP,MODE_COMPLEX,ndirs);

end

% 当前模式幅度过小,机器精度就可能引起虚假极值点的出现

if (max(abs(m))) <

(1e-10)*(max(abs(x))) % IMF的最大值小于信号最大值的1e-10

if

~stop_sift % 如果筛过程没有停止

warning('emd:warning','forced stop of EMD : too small

amplitude')

else

disp('forced stop of EMD : too small amplitude')

end

break

end

% 筛循环

while ~stop_sift

&&

nbit

if(~MODE_COMPLEX &&

nbit>MAXITERATIONS/5

&&

mod(nbit,floor(MAXITERATIONS/10))==0

&& ~FIXE

&& nbit > 100)

disp(['mode ',int2str(k),', iteration ',int2str(nbit)])

if exist('s','var')%查找是否存在变量s(var是指查找变量)

disp(['stop parameter mean value : ',num2str(s)])

end

[im,iM] = extr(m);

disp([int2str(sum(m(im) > 0)),' minima

> 0; ',int2str(sum(m(iM) < 0)),'

maxima < 0.'])

end

%

筛过程

m = m -

moyenne;

%

计算均值和停止条件

if

FIXE

[stop_sift,moyenne] =

stop_sifting_fixe(t,m,INTERP,MODE_COMPLEX,ndirs);

elseif

FIXE_H

[stop_sift,moyenne,stop_count] =

stop_sifting_fixe_h(t,m,INTERP,stop_count,FIXE_H,MODE_COMPLEX,ndirs);

else

[stop_sift,moyenne,s] =

stop_sifting(m,t,sd,sd2,tol,INTERP,MODE_COMPLEX,ndirs);

end

%

演示过程

if

display_sifting &&

~MODE_COMPLEX

NBSYM = 2;

[indmin,indmax] = extr(mp);

[tmin,tmax,mmin,mmax] =

boundary_conditions(indmin,indmax,t,mp,mp,NBSYM);

envminp = interp1(tmin,mmin,t,INTERP);

envmaxp = interp1(tmax,mmax,t,INTERP);

envmoyp = (envminp+envmaxp)/2;

if FIXE || FIXE_H

display_emd_fixe(t,m,mp,r,envminp,envmaxp,envmoyp,nbit,k,display_sifting)

else

sxp = 2*(abs(envmoyp))./(abs(envmaxp-envminp));

sp = mean(sxp);

display_emd(t,m,mp,r,envminp,envmaxp,envmoyp,s,sp,sxp,sdt,sd2t,nbit,k,display_sifting,stop_sift)

end

end

mp =

m;

nbit =

nbit+1; % 单轮迭代计数

NbIt =

NbIt+1; % 总体迭代计数

if

(nbit==(MAXITERATIONS-1) && ~FIXE

&& nbit > 100)

if exist('s','var')

warning('emd:warning',['forced stop of sifting : too many

iterations... mode ',int2str(k),'. stop parameter mean value :

',num2str(s)])

else

warning('emd:warning',['forced stop of sifting : too many

iterations... mode ',int2str(k),'.'])

end

end

end % 筛循环

imf(k,:) = m;

if display_sifting

disp(['mode

',int2str(k),' stored'])

end

nbits(k) = nbit; %

记录每个IMF的迭代次数

k = k+1; %

IMF计数

r = r - m; %

从原信号中减去提取的IMF

nbit = 0; %

单轮迭代次数清0

end % 主循环

% 计入残余信号

if any(r) && ~any(mask)

imf(k,:) = r;

end

% 计数正交指数

ort = io(x,imf);

% 关闭图形

if display_sifting

close

end

end

%---------------------------------------------------------------------------------------------------

% 测试是否存在足够的极值点(3个)进行分解,极值点个数小于3个则返回1,这是整体停止条件

function stop = stop_EMD(r,MODE_COMPLEX,ndirs)

if MODE_COMPLEX % 复信号情况

for k = 1:ndirs

phi =

(k-1)*pi/ndirs;

[indmin,indmax] = extr(real(exp(i*phi)*r));

ner(k) =

length(indmin) + length(indmax);

end

stop = any(ner < 3);

else % 实信号情况

[indmin,indmax] = extr(r);

ner = length(indmin) + length(indmax);

stop = ner < 3;

end

end

%---------------------------------------------------------------------------------------------------

% 计数包络均值和模式幅度估计值,返回包络均值

function [envmoy,nem,nzm,amp] =

mean_and_amplitude(m,t,INTERP,MODE_COMPLEX,ndirs)

NBSYM = 2; % 边界延拓点数

if MODE_COMPLEX % 复信号情况

switch MODE_COMPLEX

case 1

for k = 1:ndirs

phi = (k-1)*pi/ndirs;

y = real(exp(-i*phi)*m);

[indmin,indmax,indzer] = extr(y);

nem(k) = length(indmin)+length(indmax);

nzm(k) = length(indzer);

[tmin,tmax,zmin,zmax] =

boundary_conditions1(indmin,indmax,t,m);

envmin(k,:) = interp1(tmin,zmin,t,INTERP);

envmax(k,:) = interp1(tmax,zmax,t,INTERP);

end

envmoy = mean((envmin+envmax)/2,1);

if nargout > 3

amp = mean(abs(envmax-envmin),1)/2;

end

case 2

for k = 1:ndirs

phi = (k-1)*pi/ndirs;

y = real(exp(-i*phi)*m);

[indmin,indmax,indzer] = extr(y);

nem(k) = length(indmin)+length(indmax);

nzm(k) = length(indzer);

[tmin,tmax,zmin,zmax] =

boundary_conditions1(indmin,indmax,t,m);

envmin(k,:) = exp(i*phi)*interp1(tmin,zmin,t,INTERP);

envmax(k,:) = exp(i*phi)*interp1(tmax,zmax,t,INTERP);

end

envmoy = mean((envmin+envmax),1);

if nargout > 3

amp = mean(abs(envmax-envmin),1)/2;

end

end

else % 实信号情况

[indmin,indmax,indzer] =

extr(m); % 计数最小值、最大值和过零点位置

nem = length(indmin)+length(indmax);

nzm = length(indzer);

[tmin,tmax,mmin,mmax] =

boundary_conditions1(indmin,indmax,t,m); %

边界延拓

envmin = interp1(tmin,mmin,t,INTERP);

envmax = interp1(tmax,mmax,t,INTERP);

envmoy = (envmin+envmax)/2;

if nargout > 3

amp =

mean(abs(envmax-envmin),1)/2; %

计算包络幅度

end

end

end

%-------------------------------------------------------------------------------

% 默认停止条件,这是单轮迭代停止条件

function [stop,envmoy,s] =

stop_sifting(m,t,sd,sd2,tol,INTERP,MODE_COMPLEX,ndirs)

try

[envmoy,nem,nzm,amp] =

mean_and_amplitude(m,t,INTERP,MODE_COMPLEX,ndirs);

sx = abs(envmoy)./amp;

s = mean(sx);

stop = ~((mean(sx > sd)

> tol | any(sx > sd2))

& (all(nem > 2))); % 停止准则(增加了极值点个数大于2)

if ~MODE_COMPLEX

stop = stop

&&

~(abs(nzm-nem)>1); %

对于实信号,要求极值点和过零点的个数相差1

end

catch

stop = 1;

envmoy = zeros(1,length(m));

s = NaN;

end

end

%-------------------------------------------------------------------------------

% 针对FIX选项的停止条件

function [stop,moyenne]=

stop_sifting_fixe(t,m,INTERP,MODE_COMPLEX,ndirs)

try

moyenne =

mean_and_amplitude(m,t,INTERP,MODE_COMPLEX,ndirs); %

正常情况下不会导致停止

stop = 0;

catch

moyenne = zeros(1,length(m));

stop = 1;

end

end

%-------------------------------------------------------------------------------

% 针对FIX_H选项的停止条件

function [stop,moyenne,stop_count]=

stop_sifting_fixe_h(t,m,INTERP,stop_count,FIXE_H,MODE_COMPLEX,ndirs)

try

[moyenne,nem,nzm] =

mean_and_amplitude(m,t,INTERP,MODE_COMPLEX,ndirs);

if (all(abs(nzm-nem)>1))

stop =

0;

stop_count =

0;

else %

极值点与过零点个数相差1后,还要达到指定次数才停止

stop_count =

stop_count+1;

stop =

(stop_count == FIXE_H);

end

catch

moyenne = zeros(1,length(m));

stop = 1;

end

end

%-------------------------------------------------------------------------------

% 演示分解过程(默认准则)

function

display_emd(t,m,mp,r,envmin,envmax,envmoy,s,sb,sx,sdt,sd2t,nbit,k,display_sifting,stop_sift)

subplot(4,1,1)

plot(t,mp);hold on;

plot(t,envmax,'--k');plot(t,envmin,'--k');plot(t,envmoy,'r');

title(['IMF ',int2str(k),'; iteration ',int2str(nbit),' before sifting']);

set(gca,'XTick',[])

hold off

subplot(4,1,2)

plot(t,sx)

hold on

plot(t,sdt,'--r')

plot(t,sd2t,':k')

title('stop parameter')

set(gca,'XTick',[])

hold off

subplot(4,1,3)

plot(t,m)

title(['IMF ',int2str(k),'; iteration ',int2str(nbit),' after sifting']);

set(gca,'XTick',[])

subplot(4,1,4);

plot(t,r-m)

title('residue');

disp(['stop parameter mean value : ',num2str(sb),' before sifting

and ',num2str(s),' after'])

if stop_sift

disp('last iteration for this mode')

end

if display_sifting == 2

pause(0.01)

else

pause

end

end

%---------------------------------------------------------------------------------------------------

% 演示分解过程(FIX和FIX_H停止准则)

function

display_emd_fixe(t,m,mp,r,envmin,envmax,envmoy,nbit,k,display_sifting)

subplot(3,1,1)

plot(t,mp);hold on;

plot(t,envmax,'--k');plot(t,envmin,'--k');plot(t,envmoy,'r');

title(['IMF ',int2str(k),'; iteration ',int2str(nbit),' before sifting']);

set(gca,'XTick',[])

hold off

subplot(3,1,2)

plot(t,m)

title(['IMF ',int2str(k),'; iteration ',int2str(nbit),' after sifting']);

set(gca,'XTick',[])

subplot(3,1,3);

plot(t,r-m)

title('residue');

if display_sifting == 2

pause(0.01)

else

pause

end

end

%---------------------------------------------------------------------------------------

% 处理边界条件(镜像法)

function [tmin,tmax,zmin,zmax] =

boundary_conditions(indmin,indmax,t,x,z,nbsym)

% 实数情况下,x = z

lx = length(x);

% 判断极值点个数

if (length(indmin) + length(indmax) < 3)

error('not enough extrema')

end

% 插值的边界条件

if indmax(1) < indmin(1) %

第一个极值点是极大值

if x(1) >

x(indmin(1)) % 以第一个极大值为对称中心

lmax =

fliplr(indmax(2:min(end,nbsym+1)));

lmin =

fliplr(indmin(1:min(end,nbsym)));

lsym =

indmax(1);

else %

如果第一个采样值小于第一个极小值,则将认为该值是一个极小值,以该点为对称中心

lmax =

fliplr(indmax(1:min(end,nbsym)));

lmin =

[fliplr(indmin(1:min(end,nbsym-1))),1];

lsym =

1;

end

else

if x(1) <

x(indmax(1)) % 以第一个极小值为对称中心

lmax =

fliplr(indmax(1:min(end,nbsym)));

lmin =

fliplr(indmin(2:min(end,nbsym+1)));

lsym =

indmin(1);

else %

如果第一个采样值大于第一个极大值,则将认为该值是一个极大值,以该点为对称中心

lmax =

[fliplr(indmax(1:min(end,nbsym-1))),1];

lmin =

fliplr(indmin(1:min(end,nbsym)));

lsym =

1;

end

end

% 序列末尾情况与序列开头类似

if indmax(end) < indmin(end)

if x(end) < x(indmax(end))

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

rmin =

fliplr(indmin(max(end-nbsym,1):end-1));

rsym =

indmin(end);

else

rmax =

[lx,fliplr(indmax(max(end-nbsym+2,1):end))];

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

rsym =

lx;

end

else

if x(end) > x(indmin(end))

rmax =

fliplr(indmax(max(end-nbsym,1):end-1));

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

rsym =

indmax(end);

else

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

rmin =

[lx,fliplr(indmin(max(end-nbsym+2,1):end))];

rsym =

lx;

end

end

% 将序列根据对称中心,镜像到两边

tlmin = 2*t(lsym)-t(lmin);

tlmax = 2*t(lsym)-t(lmax);

trmin = 2*t(rsym)-t(rmin);

trmax = 2*t(rsym)-t(rmax);

% 如果对称的部分没有足够的极值点

if tlmin(1) > t(1) || tlmax(1) >

t(1) % 对折后的序列没有超出原序列的范围

if lsym == indmax(1)

lmax =

fliplr(indmax(1:min(end,nbsym)));

else

lmin =

fliplr(indmin(1:min(end,nbsym)));

end

if lsym == 1 %

这种情况不应该出现,程序直接中止

error('bug')

end

lsym = 1; % 直接关于第一采样点取镜像

tlmin = 2*t(lsym)-t(lmin);

tlmax = 2*t(lsym)-t(lmax);

end % 序列末尾情况与序列开头类似

if trmin(end) < t(lx) || trmax(end) <

t(lx)

if rsym == indmax(end)

rmax =

fliplr(indmax(max(end-nbsym+1,1):end));

else

rmin =

fliplr(indmin(max(end-nbsym+1,1):end));

end

if rsym == lx

error('bug')

end

rsym = lx;

trmin = 2*t(rsym)-t(rmin);

trmax = 2*t(rsym)-t(rmax);

end

%

延拓点上的取值 zlmax = z(lmax);

zlmin = z(lmin);

zrmax = z(rmax);

zrmin = z(rmin);

% 完成延拓

tmin = [tlmin t(indmin) trmin];

tmax = [tlmax t(indmax) trmax];

zmin = [zlmin z(indmin) zrmin];

zmax = [zlmax z(indmax) zrmax];

end

function [tmin,tmax,xmin,xmax] =

boundary_conditions1(indmin,indmax,t,x)

%处理边界条件(端点视作极值点)

%函数说明:此函数吧信号x的端点视作极值点来处理的(端点视作极值点)

lx = length(x);

% 判断极值点个数,当极值点总数小于3报错

if (length(indmin) + length(indmax)

< 3)

error('not enough

extrema')

end

if indmax(1) < indmin(1)% 当第一个极值点是极大值时

if

indmax(end) <

indmin(end)%当第一个极值点是极大值,最后一个点是极小值时(极小值补上左端点,极大值补上右端点)

tmin = [t(1) t(indmin)];%极小值的时间值

tmax = [t(indmax) t(lx)];%极大值的时间值

xmin = [x(1) x(indmin)];%极小值的赋值

xmax = [x(indmax) x(lx)];%极大值的赋值

else%当第一个极值点是极大值,最后一个点是极大值

tmin = [t(1) t(indmin) t(lx)];%极小值的时间值

tmax = t(indmax);%极大值的时间值

xmin = [x(1) x(indmin) x(lx)];%极小值的赋值

xmax = x(indmax);%极大值的赋值

end

else%当第一个极值点是极小值

if

indmax(end) <

indmin(end)%当第一个极值点是极小值,最后一个点是极小值时

tmin = t(indmin);%极小值的时间值

tmax = [t(1) t(indmax) t(lx)];%极大值的时间值

xmin = x(indmin);%极小值的赋值

xmax = [x(1) x(indmax) x(lx)];%极大值的赋值

else%当第一个极值点是极小值,最后一个点是极大值

tmin = [t(indmin) t(lx)];%极小值的时间值

tmax = [t(1) t(indmax)];%极大值的时间值

xmin = [x(indmin) x(lx)];%极小值的赋值

xmax = [x(1) x(indmax) ];%极大值的赋值

end

end

end

%---------------------------------------------------------------------------------------------------

% 极值点和过零点位置提取

function [indmin, indmax, indzer] = extr(x,t)

if(nargin==1)

t = 1:length(x);

end

m = length(x);

if nargout > 2

x1 = x(1:m-1);

x2 = x(2:m);

indzer =

find(x1.*x2<0); % 寻找信号符号发生变化的位置

if any(x == 0) %

考虑信号采样点恰好为0的位置

iz = find(

x==0 ); % 信号采样点恰好为0的位置

indz =

[];

if

any(diff(iz)==1) % 出现连0的情况

zer = x == 0; % x=0处为1,其它地方为0

dz = diff([0 zer 0]); % 寻找0与非0的过渡点

debz = find(dz == 1); % 0值起点

finz = find(dz == -1)-1; % 0值终点

indz = round((debz+finz)/2); % 选择中间点作为过零点

else

indz = iz; % 若没有连0的情况,该点本身就是过零点

end

indzer =

sort([indzer indz]); % 全体过零点排序

end

end

% 提取极值点

d = diff(x);

n = length(d);

d1 = d(1:n-1);

d2 = d(2:n);

indmin = find(d1.*d2<0 &

d1<0)+1; % 最小值

indmax = find(d1.*d2<0 &

d1>0)+1; % 最大值

% 当连续多个采样值相同时,把最中间的一个值作为极值点,处理方式与连0类似

if any(d==0)

imax = [];

imin = [];

bad = (d==0);

dd = diff([0 bad 0]);

debs = find(dd == 1);

fins = find(dd == -1);

if debs(1) == 1 %

连续值出现在序列开头

if

length(debs) > 1

debs = debs(2:end);

fins = fins(2:end);

else

debs = [];

fins = [];

end

end

if length(debs) > 0

if fins(end)

== m % 连续值出现在序列末尾

if length(debs) > 1

debs = debs(1:(end-1));

fins = fins(1:(end-1));

else

debs = [];

fins = [];

end

end

end

lc = length(debs);

if lc > 0

for k =

1:lc

if d(debs(k)-1) > 0 % 取中间值

if d(fins(k)) < 0

imax = [imax round((fins(k)+debs(k))/2)];

end

else

if d(fins(k)) > 0

imin = [imin round((fins(k)+debs(k))/2)];

end

end

end

end

if length(imax) > 0

indmax =

sort([indmax imax]);

end

if length(imin) > 0

indmin =

sort([indmin imin]);

end

end

end

%---------------------------------------------------------------------------------------------------

function ort = io(x,imf)

% ort = IO(x,imf) 计算正交指数

%

% 输入 : - x :

分析信号

% - imf : IMF信号

n = size(imf,1);

s = 0;

% 根据公式计算

for i = 1:n

for j = 1:n

if i ~=

j

s = s + abs(sum(imf(i,:).*conj(imf(j,:)))/sum(x.^2));

end

end

end

ort = 0.5*s;

end

%---------------------------------------------------------------------------------------------------

% 函数参数解析

function

[x,t,sd,sd2,tol,MODE_COMPLEX,ndirs,display_sifting,sdt,sd2t,r,imf,k,nbit,NbIt,MAXITERATIONS,FIXE,FIXE_H,MAXMODES,INTERP,mask]

= init(varargin)

x = varargin{1};

if nargin == 2

if isstruct(varargin{2})

inopts =

varargin{2};

else

error('when

using 2 arguments the first one is the analyzed signal X and the

second one is a struct object describing the options')

end

elseif nargin > 2

try

inopts =

struct(varargin{2:end});

catch

error('bad

argument syntax')

end

end

% 默认停止条件

defstop = [0.05,0.5,0.05];

opt_fields =

{'t','stop','display','maxiterations','fix','maxmodes','interp','fix_h','mask','ndirs','complex_version'};

%

时间序列,停止参数,是否演示,最大迭代次数,每一轮迭代次数,IMF个数,插值方法,每一轮迭代次数(带条件),mask信号,方向数,是否采用复数模式

defopts.stop = defstop;

defopts.display = 0;

defopts.t = 1:max(size(x));

defopts.maxiterations = 2000;

defopts.fix = 0;

defopts.maxmodes = 0;

defopts.interp = 'spline';

defopts.fix_h = 0;

defopts.mask = 0;

defopts.ndirs = 4;

defopts.complex_version = 2;

opts = defopts;

if(nargin==1)

inopts = defopts;

elseif nargin == 0

error('not enough arguments')

end

names = fieldnames(inopts);

for nom = names'

if ~any(strcmpi(char(nom), opt_fields))

error(['bad

option field name: ',char(nom)])

end

if ~isempty(eval_r(['inopts.',char(nom)]))

eval_r(['opts.',lower(char(nom)),' = inopts.',char(nom),';'])

end

end

t = opts.t;

stop = opts.stop;

display_sifting = opts.display;

MAXITERATIONS = opts.maxiterations;

FIXE = opts.fix;

MAXMODES = opts.maxmodes;

INTERP = opts.interp;

FIXE_H = opts.fix_h;

mask = opts.mask;

ndirs = opts.ndirs;

complex_version = opts.complex_version;

if ~isvector(x)

error('X must have only one row or one

column')

end

if size(x,1) > 1

x = x.';

end

if ~isvector(t)

error('option field T must have only one row or

one column')

end

if ~isreal(t)

error('time instants T must be a real

vector')

end

if size(t,1) > 1

t = t';

end

if (length(t)~=length(x))

error('X and option field T must have the same

length')

end

if ~isvector(stop) || length(stop) > 3

error('option field STOP must have only one row

or one column of max three elements')

end

if ~all(isfinite(x))

error('data elements must be finite')

end

if size(stop,1) > 1

stop = stop';

end

L = length(stop);

if L < 3

stop(3) = defstop(3);

end

if L < 2

stop(2) = defstop(2);

end

if ~ischar(INTERP) ||

~any(strcmpi(INTERP,{'linear','cubic','spline'}))

error('INTERP field must be ''linear'',

''cubic'', ''pchip'' or ''spline''')

end

% 使用mask信号时的特殊处理

if any(mask)

if ~isvector(mask) || length(mask) ~=

length(x)

error('masking signal must have the same dimension as the analyzed

signal X')

end

if size(mask,1) > 1

mask =

mask.';

end

opts.mask = 0;

imf1 = emd(x+mask, opts);

imf2 = emd(x-mask, opts);

if size(imf1,1) ~= size(imf2,1)

warning('emd:warning',['the two sets of IMFs have different sizes:

',int2str(size(imf1,1)),' and ',int2str(size(imf2,1)),'

IMFs.'])

end

S1 = size(imf1,1);

S2 = size(imf2,1);

if S1 ~= S2 %

如果两个信号分解得到的IMF个数不一致,调整顺序

if S1

< S2

tmp = imf1;

imf1 = imf2;

imf2 = tmp;

end

imf2(max(S1,S2),1) = 0; % 将短的那个补零,达到长度一致

end

imf = (imf1+imf2)/2;

end

sd = stop(1);

sd2 = stop(2);

tol = stop(3);

lx = length(x);

sdt = sd*ones(1,lx);

sd2t = sd2*ones(1,lx);

if FIXE

MAXITERATIONS = FIXE;

if FIXE_H

error('cannot use both ''FIX'' and ''FIX_H'' modes')

end

end

MODE_COMPLEX = ~isreal(x)*complex_version;

if MODE_COMPLEX && complex_version

~= 1 && complex_version ~= 2

error('COMPLEX_VERSION parameter must equal 1 or

2')

end

% 极值点和过零点的个数

ner = lx;

nzr = lx;

r = x;

if ~any(mask) % 如果使用了mask信号,此时imf就已经计算得到了

imf = [];

end

k = 1;

% 提取每个模式时迭代的次数

nbit = 0;

% 总体迭代次数

NbIt = 0;

end

%---------------------------------------------------------------------------------------------------

%matlab例子

x=@(t) sin(t).*cos(t)+2*sin(t);

x=@(t)

(1+0.5*cos(9*pi*t)).*cos(200*pi*t+2*cos(10*pi*t))+sin(pi*t).*sin(30*pi*t);

t=0:0.01:9.99;

y=x(t);

subplot(4,1,1);plot(t,y);

imf=emd4(y);

subplot(4,1,2);plot(t,imf(1,:));

subplot(4,1,3);plot(t,imf(2,:));

subplot(4,1,4);plot(t,imf(3,:));

a4c26d1e5885305701be709a3d33442f.png

从分解结果中可以看出最后2个IMF明显出现了边缘效应

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 同伦延拓是一种常用于图像处理和计算机视觉领域的数学方,用于在一幅图像中找到一个“缺失”或“损坏”的区域,并通过对邻近区域进行插值来填补这个缺失区域。 在MATLAB中,我们可以使用同伦延拓来实现这个目标。具体步骤如下: 1. 导入图像:首先,我们需要将需要进行同伦延拓的图像导入到MATLAB中,可以使用imread函数来读取图像。 2. 确定需要填补的区域:根据实际情况,确定需要进行填补的区域,可以通过人工标记或者自动检测来确定。 3. 将缺失区域转化为一个蒙版:使用MATLAB的图像处理工具,可以将需要填补的区域转化为一个蒙版,方便后续操作。 4. 同伦延拓处理:使用MATLAB的插值函数(如interp2)对邻近区域进行插值计算,然后将计算结果填充到缺失区域。 5. 修复后的图像显示和保存:最后,使用imshow函数将修复后的图像显示出来,并可以使用imwrite函数将修复后的图像保存到本地。 需要注意的是,同伦延拓只能进行局部插值,不能保证填补结果的准确性和真实性,因此在实际应用中需要根据具体情况进行评估和调整。此外,MATLAB提供了丰富的图像处理工具和函数,可以根据具体需求进行进一步的图像处理和优化。 ### 回答2: 同伦延拓是一种用于解决拓扑空间上的连续映射问题的方,它在Matlab中也有相应的实现。 在拓扑学中,同伦是指一个空间逐渐变形为另一个空间的过程。同伦延拓是指对于一个给定的连续映射,通过同伦的方式将其延拓到更大的拓扑空间中。在Matlab中,我们可以利用一些函数和工具箱来实现同伦延拓。 首先,需要利用Matlab的拓扑学工具箱,比如Simplicial Complex Toolbox或者TopoToolbox等来初始化拓扑空间。 接下来,根据具体的问题,我们需要选择合适的同伦延拓路径。同伦延拓路径可以通过一系列参数化的函数来表示,比如线性逐步延拓、指数逐步延拓等。我们需要根据实际情况选择合适的延拓路径来进行计算。 然后,通过编写相应的Matlab代码,根据同伦延拓路径进行计算。可以利用Matlab的数值计算和数值优化工具箱来进行计算。 最后,根据计算结果,可以得到同伦延拓后的连续映射。我们可以进一步分析和应用这个延拓后的映射结果,比如求解方程组、优化问题、模拟仿真等。 总之,同伦延拓是一种在Matlab中解决拓扑学问题的有效方。通过合理选择延拓路径和编写相应的代码,我们可以实现对连续映射的同伦延拓。这种方在许多实际问题中都有广泛的应用。 ### 回答3: 同伦延拓(Homotopy continuation method)是一种解决非线性方程组的数值方。在Matlab中,可以使用该方来求解非线性方程组。 同伦延拓的基本思想是将一个复杂的非线性方程组逐步转化为一个简单的线性方程组。通过在参数空间中构造一个连续的路径,并随着参数的变化逐步改变方程组的形式,从而将非线性方程组转化为线性方程组。然后利用常规的线性方程组求解方,如LU分解或迭代,来求解得到方程组的解。 实施同伦延拓的一般步骤如下: 1. 给定一个初始的近似解; 2. 构造一个同伦函数,将原始的非线性方程组与一个线性方程组连接起来; 3. 将同伦函数随着参数的变化逐步过渡到线性方程组; 4. 使用线性方程组求解方求解得到一个解; 5. 通过逐步变换参数的值,从初始解延拓到更复杂的情况; 6. 重复上述步骤,直到求得整个参数范围内的解。 在Matlab中,可以使用符号计算工具箱来构造同伦函数和进行参数的变换。然后使用数值计算方来求解线性方程组,如使用solve函数求解方程组或使用迭代,如Jacobi迭代或Gauss-Seidel迭代。 同伦延拓在求解非线性方程组时具有一定的优势,它可以克服常规的迭代容易陷入局部最优解的问题,并且可以得到全局最优解。然而,同伦延拓的实现需要一定的数值计算基础和对非线性方程组的理解,同时对于复杂的非线性方程组,可能需要较长的计算时间和较高的计算资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值