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

语音合成与识别

开发平台:

Matlab

  1. % function [lik,likv]=hmm_cl(X,T,K,Mu,Cov,P,Pi);
  2. % Calculate Likelihood for Hidden Markov Model 
  3. %
  4. % X - N x p data matrix
  5. % T - length of each sequence (N must evenly divide by T, default T=N)
  6. % K - number of states
  7. % Mu - mean vectors
  8. % Cov - output covariance matrix (full, tied across states)
  9. % P - state transition matrix
  10. % Pi - priors
  11. %
  12. % lik - log likelihood of X 
  13. % likv - vector of log likelihoods of each sequence
  14. %
  15. % If 0 or 1 output arguments requested, lik is returned. If 2 output
  16. % arguments requested, [lik likv] is returned.
  17. %
  18. function [lik,likv]=hmm_cl(X,T,K,Mu,Cov,P,Pi);
  19. p=length(X(1,:));
  20. N=length(X(:,1));
  21. tiny=exp(-700);
  22. if (rem(N,T)~=0)
  23.   disp('Error: Data matrix length must be multiple of sequence length T');
  24.   return;
  25. end;
  26. N=N/T;
  27. alpha=zeros(T,K);
  28. B=zeros(T,K);      % P( output | s_i) 
  29. k1=(2*pi)^(-p/2);
  30. Scale=zeros(T,1);
  31. likv=zeros(1,N);
  32. for n=1:N
  33.   
  34.   B=zeros(T,K); 
  35.   iCov=inv(Cov);      
  36.   k2=k1/sqrt(det(Cov));
  37.   for i=1:T
  38.     for l=1:K
  39.       d= Mu(l,:)-X((n-1)*T+i,:);
  40.       B(i,l)=k2*exp(-0.5*d*iCov*d');
  41.     end; 
  42.   end; 
  43.   
  44.   scale=zeros(T,1);
  45.   alpha(1,:)=Pi(:)'.*B(1,:);
  46.   scale(1)=sum(alpha(1,:)); 
  47.   alpha(1,:)=alpha(1,:)/(scale(1)+tiny);
  48.   for i=2:T
  49.     alpha(i,:)=(alpha(i-1,:)*P).*B(i,:); 
  50.     scale(i)=sum(alpha(i,:));
  51.     alpha(i,:)=alpha(i,:)/(scale(i)+tiny);
  52.   end;
  53.   likv(n)=sum(log(scale+(scale==0)*tiny));
  54.   Scale=Scale+log(scale+(scale==0)*tiny);
  55. end;
  56. lik=sum(Scale);