基于Matlab实现稳健的经验模式分解 (REMD) |
您所在的位置:网站首页 › lyon是什么意思 › 基于Matlab实现稳健的经验模式分解 (REMD) |
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号处理 图像处理 路径规划 元胞自动机 无人机 ⛄ 内容介绍基于Matlab实现稳健的经验模式分解 (REMD) ⛄ 完整代码clc; clear; close all; fs = 10000; % sampling frequency N = 30000; % data amount t = (1:N)/fs; % time vector x = (2+cos(2*pi*0.5*t)).*cos(2*pi*5*t+15*t.^2)+... cos(2*pi*2*t); [imf,ort,fvs,iterNum] = emd_sssc(x,fs,'display',1); function [imf,ort,fvs,iterNum] = emd_sssc(x,fs,varargin) % % ERPHM Code Log % 2017-06-20 Created by Zhiliang Liu, Dandan Peng and Yaqiang Jin. % 2019-01-19 Modified by Zhiliang Liu and Dandan Peng. % % This funcion performs the empirical mode decomposition(EMD) with a soft sifting stopping criterion (SSSC) on the input signal, and % return intrinsic mode function (IMF). If you have any questions, please contact us via [email protected] % % SYNTAX: % imf = emd_sssc(x); % [imf,ort,fvs,iterNum] = emd_sssc(x,fs); % [imf,ort,fvs,iterNum] = emd_sssc(x,fs,options); % [imf,ort,fvs,iterNum] = emd_sssc(x,fs,'option_name1',option_value1,....); % % INPUTS: % [1] x: a row signal vecter. % [2] option: a struct contains options' name(option_name) and % corresponding values(option_value). % [2.1] 'display' % plot imf or not,1 plot,0 do not. % default: 0 % [2.2] 'max_iter' % max number of iterations in one imf sift procedure. % default: 30 % [2.3] 'max_imfs' % max number of imf obtained in emd procedure. % default: 10 % [2.4] 'ext_ratio' % end extension length to original data length ratio. % can be any positive real number from (0,1] % default: 0.2 % % OUTPUTS % [1] imf % Intrinsic Mode Function (imf) Matrix of which each row is an imf and the last % row is the residual signal. % [2] iterNum % iteration number for each imf. % [3] fvs % funciton values. % [4] ort % index of orthogonality. % % REFERENCE % [1] Dandan Peng, Zhiliang Liu, Yaqiang Jin, Yong Qin. Improved EMD with a Soft % Sifting Stopping Criterion and Its Application to Fault Diagnosis of Rotating Machinery. % Journal of Mechanical Engineering. Accepted on Jan. 01, 2019. % [2] Zhiliang Liu, Yaqiang Jin, Ming J. Zuo, and Zhipeng Feng. Time-frequency % representation based on robust local mean decomposition for multi-component % AM-FM signal analysis. Mechanical Systems and Signal Processing. 95: 468-487, 2017. % % EXAMPLE: [x, display, ssc, max_iter, max_imfs, smooth_mode,ext_ratio, x_energy, imf, iterNum, fvs]= initial(x,varargin{:}); % Initialize main loop i = 0; xs = x; % copy x to xs for sifting process, reserve original input as x. nx = length(x); while i < max_imfs && ~stopemd(xs, x_energy) % outer loop for imf selection
i = i+1; % initialize variables used in imf sifting loop s_j = zeros(max_iter,nx);
% imf sifting iteration loop j = 0; stop_flag_sifting_process = 0; s = xs; while j < max_iter && ~stop_flag_sifting_process % inner loop for sifting process
j = j+1; if j==1 [m_j, n_extr] = emd_mean(s, smooth_mode, ext_ratio); end
% force to stop iteration if number of extrema of s is smaller than 3. if n_extr < 3 break; end s = s-m_j; % remove mean. s_j(j, :) = s; [m_j, n_extr] = emd_mean(s, smooth_mode,ext_ratio); [stop_flag_sifting_process,fvs(i,:)] = is_sifting_process_stop(m_j, s,j, fvs(i,:), ssc); end
switch ssc case {'liu'} [~, opt0] = min(fvs(i,1:j)); % ***Critical Step*** opt_IterNum = min(j, opt0); % in case iteration stop for n_extr 2 % input options seperately. try in_optns = struct(varargin{:}); catch error('wrong argmument syntax') end else error('arguments error: maybe not enough or wrong syntax') end names = fieldnames(in_optns);% get input options' name and value for k = names' if ~any(strcmpi(char(k), optn_fields)) % find any wrong argument in syntax. error(['bad option field name: ',char(k)]) end if ~isempty(eval(['in_optns.',char(k)])) % alter default option values with input, and empty input keep default. eval(['optns.',lower(char(k)),' = in_optns.',char(k)]) end end display = optns.display; ssc = optns.ssc; max_iter = optns.max_iter; max_imfs = optns.max_imfs; smooth_mode = optns.smooth_mode; ext_ratio = optns.ext_ratio; % initialize x(input signal), x_energy, IMF, iterNum and fvs x = x(:)'; % make x a row vector. nx = length(x); x_energy = sum(x.^2); % energy = square summation. imf = zeros(max_imfs,nx); iterNum = zeros(1,max_imfs); fvs = zeros(max_imfs,max_iter); end % Check whether there are enough (3) extrema to continue the decomposition function stop = stopemd(xs, x_energy) [indmin,indmax] = extr(xs); peak = length(indmin) + length(indmax); ratio = sum(xs.^2)/x_energy; stop = peak < 3 | ratio < 0.001; end % Compute mean function of x in EMD function [m, n_extr] = emd_mean(x, smooth_mode, ext_ratio) % find extremum indices [indmin, indmax, ~] = extr(x); % total amount of extrema n_extr = length(indmin)+length(indmax); if n_extr < 3 m = []; return end % extend original data to refrain end effect [ext_indmin,ext_indmax,ext_x,cut_index] = extend(x, indmin, indmax, ext_ratio); % compute local mean switch smooth_mode case 'spline' l = length(ext_x); ext_indmax(ext_indmax==1) = []; ext_indmax(ext_indmax==l) = []; ext_indmin(ext_indmin==1) = []; ext_indmin(ext_indmin==l) = []; max_ext_x = interp1([1,ext_indmax,l], ext_x([1,ext_indmax,l]),... 1:l, 'spline'); % pchip min_ext_x = interp1([1,ext_indmin,l], ext_x([1,ext_indmin,1]),... 1:l, 'spline'); ext_m = 0.5*(max_ext_x+min_ext_x); m = ext_m(cut_index(1):cut_index(2)); otherwise error(['mean computation method must be one of the following: ma,',... ' spline',' maspline']) end end % sifting stopping criterion function [stop_flag_sifting_process,fv_i] = is_sifting_process_stop(m, s, j, fv_i, ssc) df = m; [indmin, indmax, indzer] = extr(s); lm = length(indmin); lM = length(indmax); nem = lm + lM; nzm = length(indzer); switch ssc
case 'liu' % local optimal iteration. fv_i(j) =rms(df)+ abs(kurtosis(df)-3); if j >= 3 && abs(nzm-nem)= fv_i(j-1)) && (fv_i(j-1) >= fv_i(j-2))) stop_flag_sifting_process = 1; return; end end
end stop_flag_sifting_process = 0; end % Plot IMFs function emdplot(x,imf,fs) t = (1:size(imf,2))/fs; imfn = size(imf,1); figure subplot(imfn+1,1,1); plot(t,x); title('Input Signal'); for imfi = 1:imfn subplot(imfn+1,1,imfi+1); plot(t,imf(imfi,:)); if imfi < imfn title(['IMF',num2str(imfi)] ); else title('Residual'); end
end end % Compute the index of orthogonality % ** Copied from emd toolbox by G.Rilling and P.Flandrin % ** http://perso.ens-lyon.fr/patrick.flandrin/emd.html function ort = io(x,imf) % ort = IO(x,pfs) computes the index of orthogonality % % inputs : - x : analyzed signal % - pfs : production function 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 % Extracts the indices of extrema % ** Copied from emd toolbox by G.Rilling and P.Flandrin % ** http://perso.ens-lyon.fr/patrick.flandrin/emd.html function [indmin, indmax, indzer] = extr(x) m = length(x); if nargout > 2 x1 = x(1:m-1); x2 = x(2:m); indzer = find(x1.*x2 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 ~isempty(imax) indmax = sort([indmax imax]); end
if ~isempty(imin) indmin = sort([indmin imin]); end
end end % Extend original data to refrain end effect % ** Modified on emd by G.Rilling and P.Flandrin % ** http://perso.ens-lyon.fr/patrick.flandrin/emd.html function [ext_indmin, ext_indmax, ext_x, cut_index] = extend(x, indmin,... indmax, ext_ratio) if ext_ratio == 0 % do not extend x ext_indmin = indmin; ext_indmax = indmax; ext_x = x; cut_index = [1,length(x)]; return end nbsym = ceil(ext_ratio*length(indmax)); % number of extrema in extending end xlen = length(x); t = 1:xlen; % boundary conditions for interpolations : % left end extend if indmax(1) < indmin(1) % first extremum is max if x(1) > x(indmin(1)) % first point > first min extremum lmax = fliplr(indmax(2:min(end,nbsym+1))); lmin = fliplr(indmin(1:min(end,nbsym))); lsym = indmax(1); else % first point < first min extremum lmax = fliplr(indmax(1:min(end,nbsym))); lmin = [fliplr(indmin(1:min(end,nbsym-1))),1]; lsym = 1; end
else % first extremum is maxmum
if x(1) < x(indmax(1)) % first point < first maxmum lmax = fliplr(indmax(1:min(end,nbsym))); lmin = fliplr(indmin(2:min(end,nbsym+1))); lsym = indmin(1); else % first point > first minimum lmax = [fliplr(indmax(1:min(end,nbsym-1))),1]; lmin = fliplr(indmin(1:min(end,nbsym))); lsym = 1; end end % right end if indmax(end) < indmin(end) % last extremum is minimum if x(end) < x(indmax(end)) % last point < last maxmum rmax = fliplr(indmax(max(end-nbsym+1,1):end)); rmin = fliplr(indmin(max(end-nbsym,1):end-1)); rsym = indmin(end); else % last point > last maxmum rmax = [xlen, fliplr(indmax(max(end-nbsym+2,1):end))]; rmin = fliplr(indmin(max(end-nbsym+1,1):end)); rsym = xlen; end else % last extremum is maxmum if x(end) > x(indmin(end)) % last point > last minimum rmax = fliplr(indmax(max(end-nbsym,1):end-1)); rmin = fliplr(indmin(max(end-nbsym+1,1):end)); rsym = indmax(end); else % last point < last minimum rmax = fliplr(indmax(max(end-nbsym+1,1):end)); rmin = [xlen, fliplr(indmin(max(end-nbsym+2,1):end))]; rsym = xlen; 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); % in case symmetrized parts do not extend enough 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(xlen) || trmax(end) < t(xlen) 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 == xlen error('bug') end rsym = xlen; % trmin = 2*t(rsym)-t(rmin); % trmax = 2*t(rsym)-t(rmax); end l_end = max(max(lmax, lmin)); r_end = min(min(rmax, rmin)); new_lmax = l_end+1-lmax; new_lmin = l_end+1-lmin; new_rmax = rsym-rmax; new_rmin = rsym-rmin; lx_length = l_end-lsym; lx = fliplr(x(lsym+1:l_end)); rx = fliplr(x(r_end:rsym-1)); ext_x = [lx, x(lsym:rsym), rx]; ext_indmin = [new_lmin,indmin+lx_length-lsym+1,new_rmin+lx_length-lsym+1+... rsym]; ext_indmax = [new_lmax,indmax+lx_length-lsym+1,new_rmax+lx_length-lsym+1+... rsym]; % Index for cutting extension of x cut_index = [lx_length-lsym+2, length(x)+lx_length-lsym+1]; end ⛄ 运行结果 ⛄ 参考文献[1] Zhiliang Liu*, Dandan Peng, Ming J. Zuo, Jiansuo Xia, and Yong Qin. Improved Hilbert-Huang transform with soft sifting stopping criterion and its application to fault diagnosis of wheelset bearings. ISA Transactions. 125: 426-444, 2022 ❤️部分理论引用网络文献,若有侵权联系博主删除 ❤️ 关注我领取海量matlab电子书和数学建模资料
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |