dtw算法的代码:
function dist = dtw(t,r) n = size(t,1); m = size(r,1); % 帧匹配距离矩阵 d = zeros(n,m); for i = 1:n for j = 1:m d(i,j) = sum((t(i,:)-r(j,:)).^2); end end % 累积距离矩阵 D = ones(n,m) * realmax; D(1,1) = d(1,1); % 动态规划 for i = 2:n for j = 1:m 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);
输入B.3随笔中计算得到的两个语音mfcc特征系数。
为DTW算法代码中设置断点。断点处画图d矩阵的图像:
从这个相异度图像中可以看出dtw算法就是要在这个图像中找到一条从(0,0)点到(86,67)点一条折线,统计这条线上的值,累计和为其它任意折线累计和的最小值。也就是说要找图像中最谷底的连线。
该连线找到后,累计计算线上每个值的和。这个值就为dtw算法所最终求出的相异度。
改进dtw算法:如果在计算相异度之前,对相异度图像进行加权处理,在求相异度,观察结果。