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