复件 baum.m
资源名称:speech.rar [点击查看]
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:1k
源码类别:
语音合成与识别
开发平台:
Matlab
- 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