www.pudn.com > hmm--matlab.rar > test.asv
clear;
x1=wavread('c1.wav');
%soundview('traffic69.wav');
x2=wavread('c2.wav');
x3=wavread('s1.wav');
x4=wavread('s2.wav');
x5=wavread('p1.wav');
x6=wavread('p2.wav');
x = {x1 x2};
y = {x3 x4};
z = {x5 x6};
samples={x y z};
sample=[];
for k=1:length(samples{1})
sample(k).wave = samples{1}{k};
sample(k).data=[];
end
K = length(sample);
%计算语音参数
disp('正在计算语音参数……')
for k=1:K
if isfield(sample(k),'data')&~isempty(sample(k).data)
continue;
else
sample(k).data = mfcc(sample(k).wave);
end
end
hmm = inithmm(sample,[3,3,3]);
loop =1;
fprintf('\n第%d遍训练\n\n',loop)
hmm = baum(hmm,sample);
%计算总输出概率
pout(loop) = 0;
for k=1:K
init = hmm.init; %初始概率
trans = hmm.trans; %转移概率
mix = hmm.mix; %高阶混合
N = hmm.N; %HMM的状态数
T = size(sample(k).data,1); %语音帧数
%计算log(init)
ind1 = find(init>0);
ind0 = find(init<=0);
init(ind0) = -inf;
init(ind1) = log(init(ind1));
%计算log(trans)
ind1 = find(trans>0);
ind0 = find(trans<=0);
trans(ind0) = -inf;
trans(ind1) = log(trans(ind1));
%初始化
delta = zeros(T,N);
fai = zeros(T,N);
q = zeros(T,1);
%t=1
x = sample(k).data(1,:);
for i =1:N
delta(1,i) = init(i)+log(mixture(mix(i),x));
end
%t=2:T
for t=2:T
for j=1:N
[delta(t,j) fai(t,j)] = max(delta(t-1,:)+trans(:,j)');
x = sample(k).data(t,:);
delta(t,j) = delta(t,j)+log(mixture(mix(j),x));
end
end
%最终概率和最后节点
[prob q(T)] = max(delta(T,:));
%回溯最佳状态路径
for t=T-1:-1:1
q(t) = fai(t+1,q(t+1));
end
end
fprintf('总和输出概率(log)=%d\n',pout(loop));