www.pudn.com > hmm--matlab.rar > vad.m


function [x1,x2] = vad(x) 
 
%幅度归一化到[-1,1] 
x = double(x); 
x = x/max(abs(x)); 
 
%常数设置 
Len = 240; 
Inc = 80; 
 
amp1 = 10; 
amp2 = 2; 
zcr1 = 10; 
zcr2 = 5; 
 
maxsilence = 3; % 3*10ms = 30ms 
minlen = 15;    %15*10ms = 150ms 
status = 0;  %表示当前所处的状态,0为静音,1为过渡段,2为语音段,3为结束 
count = 0;    
silence = 0; 
 
%计算过零率 
tmp1 = enframe(x(1:length(x)-1),Len,Inc); 
tmp2 = enframe(x(2:length(x)),Len,Inc); 
signs = (tmp1.*tmp2)<0; 
diffs = (tmp1-tmp2)>0.02; 
zcr = sum(signs.*diffs,2); 
 
%计算短时能量 
amp = sum(abs(enframe(filter([1 -0.9375],1,x),Len,Inc)),2);   %每一帧的短时能量 
 
%调整能量门限 
amp1 = min(amp1,max(amp)/4); 
amp2 = min(amp2,max(amp)/8); 
 
%开始端点检测 
x1 = 0; 
x2 = 0; 
for n = 1:length(zcr) 
    goto = 0; 
    switch status 
        case {0,1}   % 0:静音,1:可能开始 
            if amp(n)>amp1   %确信进入语音段 
                x1 = max(n-count-1,1);  %起点,用确信进入的语音段的点减去可能处于语音段的时候的点,得到开始进入语音段的点 
                status = 2; 
                silence = 0; 
                count = count+1; 
            elseif amp(n)>amp2|zcr(n)>zcr2  %可能处于语音段 
                    status = 1; 
                    count = count+1; 
                else  %没有进入语音段 
                    status = 0; 
                    count = 0; 
                end 
        case 2,   % 2:语音段 
            if amp(n)>amp2|zcr(n)>zcr2   %保持在语音段 
                    count = count+1; 
                else 
                    silence = silence+1; 
                    if silence