www.gusucode.com > 端点检测和基于DTW和HMM的孤立词识别和连续语音识别 > code/cdhmm/baum.m
function hmm = baum(hmm, samples) mix = hmm.mix; %高斯混合 N = length(mix); %HMM状态数 K = length(samples); %语音样本数 SIZE = size(samples(1).data,2); %参数阶数 % 计算前向, 后向概率矩阵, 考虑多观察序列和下溢问题 disp('计算样本参数...'); for k = 1:K fprintf('%d ',k) param(k) = getparam(hmm, samples(k).data); end fprintf('\n') % 重估转移概率矩阵A: trans disp('重估转移概率矩阵A...') for i = 1:N-1 denom = 0; for k = 1:K tmp = param(k).ksai(:,i,:); denom = denom + sum(tmp(:)); end for j = i:i+1 nom = 0; for k = 1:K tmp = param(k).ksai(:,i,j); nom = nom + sum(tmp(:)); end hmm.trans(i,j) = nom / denom; end end % 重估混合高斯的参数 disp('重估混合高斯的参数...') for l = 1:N for j = 1:hmm.M(l) fprintf('%d,%d ',l,j) % 计算各pdf的均值和方差 nommean = zeros(1,SIZE); nomvar = zeros(1,SIZE); denom = 0; for k = 1:K T = size(samples(k).data,1); for t = 1:T x = samples(k).data(t,:); nommean = nommean + param(k).gama(t,l,j) * x; nomvar = nomvar + param(k).gama(t,l,j) * (x-mix(l).mean(j,:)).^2; denom = denom + param(k).gama(t,l,j); end end hmm.mix(l).mean(j,:) = nommean / denom; hmm.mix(l).var (j,:) = nomvar / denom; % 计算各pdf的权 nom = 0; denom = 0; for k = 1:K tmp = param(k).gama(:,l,j); nom = nom + sum(tmp(:)); tmp = param(k).gama(:,l,:); denom = denom + sum(tmp(:)); end hmm.mix(l).weight(j) = nom/denom; end fprintf('\n') end