www.pudn.com > SpeechTestDTW.rar > dtw.m


%   testS=[  1,2,2; 
%           3,5,6; 
%           1,2,3; 
%           1,2,3; 
%           4,5,6; 
%           1,2,3]'; 
%   refS=[  1,2,2; 
%           3,5,6; 
%           1,2,3; 
%           1,2,3; 
%           1,2,3; 
%           1,2,3; 
%           1,2,3; 
%           4,5,6; 
%           4,5,6; 
%           1,2,3]'; 
function dist=dtw(testS,refS) 
%test是测试语音信号n帧,ref是模板语音信号m帧,每帧信息表示为倒谱 
%ref=[1,2,3,4,5,6]; 
n=size(testS,2); 
m=size(refS,2); 
 if n>=m 
     test=testS; 
     ref=refS; 
 else 
     test=refS; 
     ref=testS; 
 end; 
 
n=size(test,2); 
m=size(ref,2); 
%if n>=m 
    %帧距离匹配矩阵 
    d=ones(n,m); 
 
    for i=1:n 
        for j=1:m 
            d(i,j)=sum((test(:,i)-ref(:,j)).^2); 
        end 
    end 
    D=ones(n,m)*realmax; 
    D(1,1)=d(1,1); 
 
    %动态规划 
    for i=2:n 
        j1=max(1,2*i-2*n+m); 
        j2=min(m,2*i-1); 
        for j=j1:j2 
            D1=D(i-1,j); 
            if(j>1) 
                D2=D(i-1,j-1); 
            else 
                D2=realmax; 
            end 
            if(j>2) 
                D3=D(i-1,j-2); 
            else 
                D3=realmax; 
            end            
            D(i,j)=d(i,j)+min([D1 D2 D3]); 
        end 
    end 
    dist=D(n,m); 
%    D 
% else 
%     %帧距离匹配矩阵 
%     d=ones(m,n); 
%  
%     for i=1:m 
%         for j=1:n 
%             d(i,j)=sum((ref(:,i)-test(:,j)).^2); 
%         end 
%     end 
%  
%     D=ones(m,n)*realmax; 
%     D(1,1)=d(1,1); 
%  
%     %动态规划 
%     for i=2:m 
%         for j=1:n 
%             D1=D(i-1,j); 
%             if(j>1) 
%                 D2=D(i-1,j-1); 
%             else 
%                 D2=realmax; 
%             end 
%             if(j>2) 
%                 D3=D(i-1,j-2); 
%             else 
%                 D3=realmax; 
%             end 
%             tempD=min([D1,D2,D3]); 
%             D(i,j)=d(i,j)+tempD; 
%         end 
%     end 
%     dist=D(m,n); 
% end