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));