>> main
正在计算语音参数
第1遍训练
计算样本参数...
1 2 3 4 5 6 7 8 9 10
重估转移概率矩阵A...
重估混合高斯的参数...
1,1 带有下标的赋值维度不匹配。
出错 baum (line 52)
hmm.mix(l).mean(j,:) = nommean / denom;
出错 train (line 24)
hmm = baum(hmm, samples);
出错 main (line 7)
hmm{i}=train(sample,[3 3 3 3]);
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