www.pudn.com > asr.rar > HMMTRN.M, change:2004-11-06,size:1741b


function [a,b,pai,lrncrv]=hmmtrn(trnset,N,M,LRmodel) 
 
%% HMM Model Training  
%% 
%% [a,b,pai,lrncrv] = hmmtrn(trnset,N,M,LRmodel) 
%%  
%% a,b,pai --- HMM parameters 
%% lrncrv --- learning curve for re-estimation 
%% trnset --- training set 
%% N --- number of states 
%% M --- number of possible observation symbols 
%% LRmodel --- left-right model flag 
%% 
 
 
%% initialize a's, b's, and pai's 
[a,b,pai] = rndmpara(N,M,LRmodel); 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%% Re-estimation Procedure for multiple training seq.%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
no_of_trnptn=size(trnset,2); 
avgT=nnz(trnset)/no_of_trnptn; 
threshold=0.00001; 
cnt=0; 
flag=1; 
while(flag) 
  cnt=cnt+1; 
  old_a=a; 
  old_b=b; 
  old_pai=pai; 
  acc_na=zeros(N,N); 
  acc_da=zeros(N,1); 
  acc_nb=zeros(M,N); 
  acc_db=zeros(N,1); 
  acc_npai=zeros(N,1); 
  acc_dpai=zeros(1,1); 
 
  for i=1:no_of_trnptn 
    T=nnz(trnset(:,i)); 
    [alpha,ct,p]=forward(trnset(1:T,i),a,b,pai); 
    beta = backward(trnset(1:T,i),a,b,ct); 
    [na,da,nb,db,npai,dpai]=baumwlch(alpha,beta,ct,a,b,trnset(1:T,i)); 
    acc_na=acc_na+na; 
    acc_da=acc_da+da; 
    acc_nb=acc_nb+nb; 
    acc_db=acc_db+db; 
    acc_npai = acc_npai + npai / (ct(1)^2); 
    acc_dpai = acc_dpai + dpai / (ct(1)^2); 
  end 
 
  acc_da = 1 ./ acc_da; 
  acc_db = 1 ./ acc_db; 
  acc_dpai = 1 /  acc_dpai; 
 
  pai = acc_npai * acc_dpai; 
  for i=1:N 
     a(i,:) = acc_na(i,:) * acc_da(i); 
     b(:,i) = acc_nb(:,i) * acc_db(i); 
  end 
  %% compute statistical distance between new and old  
  %% parameters 
  lrncrv(cnt) = statdist(a,b,pai,old_a,old_b,old_pai,avgT) 
  if(abs(lrncrv(cnt))  threshold) 
     flag =0; 
  end   
end 
 
return