logo资料库

EMD和BEMD算法.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
EMD 和 BEMD 算法 function imf = emd(x) % Empiricial Mode Decomposition (Hilbert-Huang Transform) % EMD 分解或 HHT 变换 % 返回值为 cell 类型,依次为一次 IMF、二次 IMF、...、最后残差 x imf = []; while ~ismonotonic(x) = transpose(x(:)); x1 = x; sd = Inf; while (sd > 0.1) || ~isimf(x1) s1 = getspline(x1); s2 = -getspline(-x1); h = x1-(s1+s2)/2; sd = sum((x1-h).^2)/sum(x1.^2); x1 = h; end % 极大值点样条曲线 % 极小值点样条曲线 imf{end+1} = x1; x = x-x1; end imf{end+1} = x; end % 是否单调 function u = ismonotonic(x) u1 = length(findpeaks1(x))*length(findpeaks1(-x)); if u1 > 0 u = 0; end end % 是否 IMF 分量 function u = isimf(x) N = length(x); u1 = sum(x(1:N-1).*x(2:N) < 0); u2 = length(findpeaks1(x))+length(findpeaks1(-x)); if abs(u1-u2) > 1 % 过零点的个数 % 极值点的个数 else u = 1; u = 0; u = 1; else end
end % 据极大值点构造样条曲线 function s = getspline(x) N = length(x); p = findpeaks1(x); s = spline([0 p N+1],[0 x(p) 0],1:N); end function n = findpeaks1(x) % Find peaks. 找极大值点,返回对应极大值点的坐标 n u n(u) = n(u)+1; end = find(diff(diff(x) > 0) < 0); % 相当于找二阶导小于 0 的点 = find(x(n+1) > x(n)); bemd function [imf_matrix]=bemd(img) %%输入一副灰度图像 [row,col,dep] = size(img);% row, col and depth of original image if dep ~= 1 img = im2double(rgb2gray(img)); img = im2double(img); else end 余项 %%%%%主函数 % 分解 IMF 个数设置为 3(加上残余量为 4 个分解量)(可根据实际情况修改) m=4; k=1; input_img=img; while(k
[width height]=size(input_img); x=1:width; y=1:height; input_img_temple=input_img; while(1) 值点 [zmax imax zmin imin]=extrema2(input_img_temple); %%%%图像表面极 [xmax ymax]=ind2sub(size(input_img_temple),imax); [xmin ymin]=ind2sub(size(input_img_temple),imin); [zmaxgrid,~,~]=gridfit(ymax,xmax,zmax,y,x); %%%%曲面拟合,寻找包 络面的的极值点 [zmingrid,~,~]=gridfit(ymin,xmin,zmin,y,x); zavggrid=(zmaxgrid+zmingrid)/2; %%%%包络均值 %%%%%%IMF 分量判断%%%%% imf_de=input_img_temple-zavggrid; SD=sum(sum(imf_de-input_img_temple).^2)/sum(sum(imf_de).^2); if SD<0.2 break else end end input_img_temple=imf_de; res_de=input_img-imf_de; end 改进点:BEMD 利用 extrema2 寻求曲面极值和 gridfit 曲面拟合函数实现包络面的获取
分享到:
收藏