文档库 最新最全的文档下载
当前位置:文档库 › DTW算法程序

DTW算法程序

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%申请两个n*m的矩阵D、d,分别为累积距离和帧匹配距离。这里n和m为测试模版与参考模版的帧数。然后通过一个循环计算两个模版的帧匹配距离d。接下来进行动态规划,为每个格点%(i,j)都计算其三个可能的前续格点的累积距离D1,D2,D3。考虑到边界问题,有些前续格点可能不存在,因此加入一些判断条件最后利用最小值函数min(),找到三个前续格点的累积%距离作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模版匹配的结果。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function dist = dtw(test,train)
n = size(test,1);
m = size(train,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; %返回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);

%DTW程序到此结束
%下面是匹配算法

disp('正在计算参考模板的参数...')
for i=1:10
fname = sprintf('c\voice\0.wav',i-1);
x = wavread(fname);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
ref(i).mfcc = m;
end

disp('正在计算测试模板的参数...')
for i=1:10
fname = sprintf('..\\ch6\\%db.wav',i-1);
x = wavread(fname);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
test(i).mfcc = m;
end

disp('正在进行模板匹配...')
dist = zeros(10,10);
for i=1:10
for j=1:10
dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc);
end
end

disp('正在计算匹配结果...')
for i=1:10
[d,j] = min(dist(i,:));
fprintf('测试模板 %d 的识别结果为:%d\n', i, j);
end

相关文档