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

语音合成与识别

开发平台:

Matlab

  1. function hmm = baum(hmm, samples)
  2. mix  = hmm.mix; %高斯混合
  3. N    = length(mix); %HMM状态数
  4. K    = length(samples); %语音样本数
  5. SIZE = size(samples(1).data,2); %参数阶数
  6. % 计算前向, 后向概率矩阵, 考虑多观察序列和下溢问题
  7. disp('计算样本参数...');
  8. for k = 1:K
  9.     fprintf('%d ',k)
  10. param(k) = getparam(hmm, samples(k).data);
  11. end
  12. fprintf('n')
  13. % 重估转移概率矩阵A: trans
  14. disp('重估转移概率矩阵A...')
  15. for i = 1:N-1
  16. denom = 0;
  17. for k = 1:K
  18. tmp   = param(k).ksai(:,i,:);
  19. denom = denom + sum(tmp(:));
  20. end
  21. for j = i:i+1
  22. nom = 0;
  23. for k = 1:K
  24. tmp = param(k).ksai(:,i,j);
  25. nom = nom   + sum(tmp(:));
  26. end
  27. hmm.trans(i,j) = nom / denom;
  28. end
  29. end
  30. % 重估混合高斯的参数
  31. disp('重估混合高斯的参数...')
  32. for l = 1:N
  33. for j = 1:hmm.M(l)
  34. fprintf('%d,%d ',l,j)
  35. % 计算各pdf的均值和方差
  36. nommean = zeros(1,SIZE); 
  37. nomvar  = zeros(1,SIZE); 
  38. denom   = 0;
  39. for k = 1:K
  40. T = size(samples(k).data,1);
  41. for t = 1:T
  42. x     = samples(k).data(t,:);
  43. nommean = nommean + param(k).gama(t,l,j) * x;
  44. nomvar  = nomvar  + param(k).gama(t,l,j) * (x-mix(l).mean(j,:)).^2;
  45. denom   = denom   + param(k).gama(t,l,j);
  46. end
  47. end
  48. hmm.mix(l).mean(j,:) = nommean / denom;
  49. hmm.mix(l).var (j,:) = nomvar  / denom;
  50. % 计算各pdf的权
  51. nom   = 0;
  52. denom = 0;
  53. for k = 1:K
  54. tmp = param(k).gama(:,l,j);    nom   = nom   + sum(tmp(:));
  55. tmp = param(k).gama(:,l,:);    denom = denom + sum(tmp(:));
  56. end
  57. hmm.mix(l).weight(j) = nom/denom;
  58. end
  59. fprintf('n')
  60. end