matlab 波形匹配算法,波形匹配函数怎么用?

function [tmin,tmax,zmin,zmax] = boundary_matchwave(indmin,indmax,t,x)

% 一种自适应波形匹配端点延拓法

% 输入参数说明: indmin 极小值地址序列

% indmax 极大值地址序列

% t 时间序列(时序)1:length(x)

% x 时间序列(值)

%

% 输出参数说明: tmin 极小值地址序列

% tmax 极大值地址序列

% zmin 极小值

% zmax 极大值

%

lx = length(x);

indmax=find(diff(sign(diff(x)))==-2)+1;

indmin=find(diff(sign(diff(x)))==2)+1;

% 判断极值点个数

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

error('not enough extrema')

end

% 左端处理

leftmax = indmax(1);

leftmin = indmin(1);

if leftmin > leftmax

left = leftmin; % 左边处理长度

leftindex = indmin;

leftminind = indmax;

leftdisc = leftmax; % 末端长度

else

left = leftmax;

leftindex = indmax;

leftminind = indmin;

leftdisc = leftmin;

end;

leftvalue = x(1:left);

indexlen = length(leftindex);

mintol = 99999;

for i = 2:indexlen

len = leftindex(i);

leftvalue1 = x(len-left+1:len);

[tol,err,extrx1] = SelfAdapMatchWave(leftvalue,leftvalue1);

if tol < mintol

mintol = tol;

%avg=(sum(abs(extrx1))+sum(abs(rightvalue)))/(length(extrx1)*2-2);%有人说此处要改为leftvalue

avg=(sum(abs(extrx1))+sum(abs(leftvalue)))/(length(extrx1)*2-2);

erroo = leftvalue - extrx1;

avgerr=sum(abs(erroo))/(length(erroo)-1);

minextrx1 = extrx1;

newerr = err;

minindex = len;

indmini = i;

end

end;

%minextrx1

if (mintol < avg/(10*2) || mintol < avgerr*2) % 没有找到匹配子波,左端处理,取原始信号最左端的两个相邻极大值点的均值作为左端点的极大值,取信号最左端的两个相邻极小值点的均值作为左端点的极小值

lindmin = indmin(1)-indmin(2);

lvmin = (x(indmin(1))+x(indmin(2)))/2;

lindmax = indmax(1)-indmax(2);

lvmax = (x(indmax(1))+x(indmax(2)))/2;

else % 找到匹配子波,左端处理

leftindex = leftminind(indmini);

leftx = x(leftindex-left-1:leftindex)+newerr;

leftx = [leftx,x(1:2)];

[lhindmin,lhindmax,lhindzer] = extr(leftx);

lindmin = lhindmin(end)-(length(leftx)-2);

lindmax = lhindmax(end)-(length(leftx)-2);

lvmin = leftx(lhindmin(end));

lvmax = leftx(lhindmax(end));

end;

% 右端处理

rightmax = indmax(end);

rightmin = indmin(end);

if rightmin < rightmax

right = lx - rightmin; % 右边处理长度

rightindex = indmin;

rightmaxind = indmax;

rightdisc = lx - rightmax; % 末端长度

else

right = lx - rightmax;

rightindex = indmax;

rightmaxind = indmin;

rightdisc = lx - rightmin;

end;

rightvalue = x(end-right+1:end);

indexlen = length(rightindex)-1;

mintol = 99999;

for i = 1:indexlen

len = rightindex(i);

rightvalue1 = x(len:len+right-1);

[tol,err,extrx1] = SelfAdapMatchWave(rightvalue,rightvalue1);

if tol < mintol

mintol = tol;

avg=(sum(abs(extrx1))+sum(abs(rightvalue)))/(length(extrx1)*2-2);

erroo = rightvalue - extrx1;

avgerr=sum(abs(erroo))/(length(erroo)-1);

minextrx1 = extrx1;

newerr = err;

minindex = len;

indmini = i;

end

end;

%minextrx1

if (mintol < avg/(10*2) || mintol < avgerr*2) % 没有找到匹配子波,右端处理,取原始信号最右端的两个相邻极大值点的均值作为右端点的极大值,取信号最右端的两个相邻极小值点的均值作为右端点的极小值

rindmin = lx + (indmin(end)-indmin(end-1));

rvmin = (x(indmin(end-1))+x(indmin(end)))/2;

rindmax = lx + (indmax(end)-indmax(end-1));

rvmax = (x(indmax(end-1))+x(indmax(end)))/2;

else % 找到匹配子波,右端处理

rightindex = minindex; % rightmaxind(indmini)

rightx = x(rightindex+right:rightindex+2*right+5)+newerr;

rightx =[x(rightmaxind(end)+1:end),rightx];

[rhindmin,rhindmax,rhindzer] = extr(rightx);

rvmin = rightx(rhindmin(1));

rvmax = rightx(rhindmax(1));

rindmin = lx + (rhindmin(1)-length(x(rightmaxind(end):end)));

rindmax = lx + (rhindmax(1)-length(x(rightmaxind(end):end)));

end;

% 取拓延的点,拓延到两边(极大值与极小值)

tlmin = lindmin;

tlmax = lindmax;

trmin = rindmin;

trmax = rindmax;

% 延拓点上的取值(极大值与极小值)

zlmax = lvmax;

zlmin = lvmin;

zrmax = rvmax;

zrmin = rvmin;

% 完成延拓

tmin = [tlmin t(indmin) trmin];

tmax = [tlmax t(indmax) trmax];

zmin = [zlmin x(indmin) zrmin];

zmax = [zlmax x(indmax) zrmax];

end

tstar=min(tlmin tlmax);

tend=max(tlmin tlmax);

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

function [tol,err,extrx1] = SelfAdapMatchWave(x0,x1)

% 一种自适应波形匹配方法

% 输入参数说明: x0 需要匹配的波形数据,长度为l

% x1 被匹配的波形数据,长度为l

%

% 输出参数说明: tol x0,x1的波形匹配度

% extrx1 x1的极值(extremum)序列,平移后的

%

len0 = length(x0);

len1 = length(x1);

if (len0 ~= len1)

error('x0,x1数据的长度不一致');

end;

% 数据x1平移操作,使x0,x1的极值重合

Max0 = max(x0);

Max1 = max(x1);

err = Max0 - Max1;

extrx1 = x1 + err;

x2 = extrx1;

% 对极值做匹配度的计算

tol = 0;

for i = 1:len0

erroo1(i) = x0(i)-x2(i);

tol = tol+(x0(i)-x2(i))*(x0(i)-x2(i));

end;

avg = (sum(abs(x0))+sum(abs(x2)))/(len0*2-2);

erravg = sum(abs(erroo1))/(len0-1);