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