gusucode.com > 端点检测和基于DTW和HMM的孤立词识别和连续语音识别 > code/cdhmm/getparam.m

    function param = getparam(hmm, O)
%给定输出序列O, 计算前向概率alpha, 后向概率beta, 标定系数c, 及ksai,gama
%输入:
%  hmm -- HMM模型参数
%  O   -- n*d 观察序列
%输出:
%  param -- 包含各种参数的结构

T = size(O,1);	%序列的长度

init  = hmm.init;	%初始概率
trans = hmm.trans;	%转移概率
mix   = hmm.mix;	%高斯混合
N     = hmm.N;		%HMM状态数

% 给定观察序列O, 计算前向概率alpha
alpha = zeros(T,N);

% t=1的前向概率
x = O(1,:);
for i = 1:N
	alpha(1,i) = init(i) * mixture(mix(i),x);	
end

% 标定t=1的前向概率
c    = zeros(T,1);
c(1) = 1/sum(alpha(1,:));		
alpha(1,:) = c(1) * alpha(1,:);

% t=2:T的前向概率和标定
for t = 2:T
	for i = 1:N
		temp = 0;
		for j = 1:N
			temp = temp + alpha(t-1,j) * trans(j,i);
		end
		alpha(t,i) = temp * mixture(mix(i),O(t,:));
	end
	c(t) = 1/sum(alpha(t,:));
	alpha(t,:) = c(t)*alpha(t,:);
end

% 给定观察序列O, 计算后向概率beta
beta = zeros(T,N);

% t=T的后向概率及标定
for l = 1:N
	beta(T,l) = c(T);	
end

% t=T-1:1的后向概率和标定
for t = T-1:-1:1
	x = O(t+1,:);
	for i = 1:N
	for j = 1:N
		beta(t,i) = beta(t,i) + beta(t+1,j) * mixture(mix(j),x) * trans(i,j);
	end
	end
	beta(t,:) = c(t) * beta(t,:);
end

%过渡概率ksai
ksai = zeros(T-1,N,N);
for t = 1:T-1
	denom = sum(alpha(t,:).*beta(t,:));
	for i = 1:N-1
	for j = i:i+1
		nom = alpha(t,i) * trans(i,j) * mixture(mix(j),O(t+1,:)) * beta(t+1,j);
		ksai(t,i,j) = c(t) * nom/denom;
	end
	end
end

%混合输出概率:gama
gama = zeros(T,N,max(hmm.M));
for t = 1:T
	pab = zeros(N,1);
	for l = 1:N
		pab(l) = alpha(t,l) * beta(t,l);
	end
	x = O(t,:);
	for l = 1:N
		prob = zeros(mix(l).M,1);
		for j = 1:mix(l).M
			m = mix(l).mean(j,:);
			v = mix(l).var (j,:);
			prob(j) = mix(l).weight(j) * pdf(m, v, x);
		end
		tmp  = pab(l)/sum(pab);
		for j = 1:mix(l).M
			gama(t,l,j) = tmp * prob(j)/sum(prob);
		end
	end
end

param.c     = c;
param.alpha = alpha;
param.beta  = beta;
param.ksai  = ksai;
param.gama  = gama;