dtwplot.m
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:3k
源码类别:

语音合成与识别

开发平台:

Matlab

  1. function dtwplot(vec1, vec2, DTWpath) 
  2. %DTWPLOT Plot the result of DTW of two pitch vectors
  3. % Usage:
  4. % dtwplot(vec1, vec2, DTWpath) 
  5. clf;
  6. if size(vec1,1)>1 & size(vec2,1)>1, % Inputs are matrices, for ASR
  7. frame1num = size(vec1, 2);
  8. frame2num = size(vec2, 2);
  9. % Vertical yellow grid line
  10. for i = 1:frame1num,
  11. line([i, i], [1, frame2num], 'color', 'y');
  12. end
  13. % Horizontal yellow grid line
  14. for j = 1:frame2num,
  15. line([1, frame1num], [j, j], 'color', 'y');
  16. end
  17. % ====== Solution obtained by DTW
  18. for i = 1:size(DTWpath,2)-1,
  19. line([DTWpath(1,i), DTWpath(1,i+1)], [DTWpath(2,i), DTWpath(2,i+1)], ...
  20.                 'color', 'r', 'marker', '.');
  21. end
  22. xlabel('Test vector');
  23. ylabel('Reference vector');
  24. if ~isempty(DTWpath),
  25. temp = vec1(:,DTWpath(1,:))-vec2(:,DTWpath(2,:));
  26. dtwDist = sum(sqrt(sum(temp.^2)));
  27. else
  28. dtwDist = inf;
  29. end
  30. title(['DTW distance = ', num2str(dtwDist)]);
  31. box on
  32. axis tight
  33. axis image
  34. return
  35. end
  36. vec1 = vec1(:);
  37. vec2 = vec2(:);
  38. pos = get(gcf, 'pos');
  39. width = pos(3);
  40. height = pos(4);
  41. % Assume width > height
  42. % Assume the aspect ratio of the signal axis is b:1
  43. b = 4;
  44. k = height/(b+2.5);
  45. vec1Axis = subplot(2,2,4);
  46. plot(1:length(vec1), vec1, 1:length(vec1), vec1, 'ro');
  47. axis tight
  48. ylabel('vec1');
  49. set(vec1Axis, 'unit', 'pixels');
  50. set(vec1Axis, 'position', [width-(b+0.5)*k, height-(b+2)*k, b*k, k]); 
  51. vec2Axis = subplot(2,2,1);
  52. plot(min(vec2)+max(vec2)-vec2, 1:length(vec2), min(vec2)+max(vec2)-vec2, 1:length(vec2), 'ro');
  53. axis tight;
  54. xlabel('vec2');
  55. set(vec2Axis, 'unit', 'pixels');
  56. set(vec2Axis, 'position', [width-(b+2)*k, height-(b+0.5)*k, k, b*k]); 
  57. % The following should be done after axis is resized
  58. xticklabel = get(vec2Axis, 'xticklabel');
  59. set(vec2Axis, 'xticklabel', flipud(xticklabel));
  60. pathAxis = subplot(2,2,2);
  61. box on;
  62. set(pathAxis, 'unit', 'pixels');
  63. position = [width-(b+0.5)*k, height-(b+0.5)*k, b*k, b*k]; 
  64. set(pathAxis, 'position', position); 
  65. % Plot the yellow grid line
  66. for i = 1:length(vec1),
  67. line([i, i], [1, length(vec2)], 'color', 'y');
  68. end
  69. for i = 1:length(vec2),
  70. line([1, length(vec1)], [i, i], 'color', 'y');
  71. end
  72. % ====== Solution obtained by DTW
  73. for i = 1:size(DTWpath,2)-1,
  74. line(DTWpath(1, i:i+1), DTWpath(2, i:i+1), 'color', 'r', 'marker', '.');
  75. end
  76. if ~isempty(DTWpath),
  77. dtwDist = sum(abs(vec1(DTWpath(1,:))-vec2(DTWpath(2,:))));
  78. else
  79. dtwDist = inf;
  80. end
  81. title(['DTW distance = ', num2str(dtwDist)]);
  82. axis equal
  83. axis tight
  84. if length(vec2)>length(vec1),
  85. % Adjust the axis of vec1
  86. dtwPlotWidth = position(3)*length(vec1)/length(vec2);
  87. oldPos = get(vec1Axis, 'pos');
  88. position = oldPos;
  89. position(1) = oldPos(1)+(oldPos(3)-dtwPlotWidth)/2;
  90. position(3) = dtwPlotWidth;
  91. set(vec1Axis, 'pos', position);
  92. else
  93. % Adjust the axis of vec2
  94. dtwPlotHeight = position(3)*length(vec2)/length(vec1);
  95. oldPos = get(vec2Axis, 'pos');
  96. position = oldPos;
  97. position(2) = oldPos(2)+(oldPos(4)-dtwPlotHeight)/2;
  98. position(4) = dtwPlotHeight;
  99. set(vec2Axis, 'pos', position);
  100. end
  101. set(findobj(gcf, 'unit', 'pixel'), 'unit', 'normalize');