?? 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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -