www.pudn.com > specbandvar0805.rar > specbandvar.m


function [x1,x2]=specbandvar(x) 
%基于频谱方差的语音端点检测 
 
framelen=662;%帧长 
framelnc=221;%帧移 
 
maxsilence=3;%3*10ms=30ms 
minlen=15; %15*10ms=150ms 
status=0;%信号状态 
count=0;% 
silence=0; % 
spe1= 
spe=0.02; 
 
 
%对信号做预加重处理 
x=filter([1 -0.9375], 1, x); 
x=5*(x-mean(x)); 
 
framenumber=floor((length(x)-framelen)/framelnc)+1;     %计算帧的个数 
A=zeros(framelen,framenumber); 
 
%下面循环是x信号的加窗处理并求出各点频谱能量 
for i=1:framenumber 
    n1=(i-1)*framelnc+1;%起始帧 
    n2=n1+(framelen-1);%终点帧 
    xx=x(n1:n2);%分帧 
    xx=xx.*hamming(framelen);%加汉明窗 
    y=fft(xx,framelen); 
    y=y(1:framelen); 
    A(:,i)=abs(y); 
end 
%设阀值 
d=0; 
d=var(A(:,1))+eps; 
M=3*d; 
%利用频带计算频谱方差 
D=zeros(framenumber,1);D1=zeros(framenumber,1); 
for i=1:framenumber 
    D(i)=var(A(:,i))+eps; 
    if D(i)<=M 
        D1(i)=d/5; 
        else 
       D1(i)=2*D(i);  
        
    end 
end 
 
%端点检测 
x1=0; 
x2=0; 
for n=1:length(D1) 
    goto=0; 
    switch status 
        case 0 
            if D1(n)>spe                %确信进入语音段 
                x1=max(n-count-1,1); 
                status=1; 
                silence=0; 
                count=count+1; 
            else 
                status=0; 
                count=0; 
            end 
        case 1,                            %2=语音段 
            if D1(n)>spe     %保持在语音段 
                count=count+1; 
            else 
                silence=silence+1; 
                if silence