|
i m doing VAD based on zero crossing rate.i have studied papers and come to know that zero crossing rate threshold is
ZCRT=mean(noise)+5*standard deviation(noise)
how can i set value of detection?how can i implement ZCR in SIMULINK?
is there any other method?
its mfile is
function [w]=vad(x)
x=double(x);
x=x/max(abs(x));
%常数设置
framelen=256;
framelnc=100;
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=3;%3*10ms=30ms
minlen=15; %15*10ms=150ms
status=0;
count=0;
silence=0;
tmp1=enframe(x(1:length(x)-1),framelen,framelnc);
tmp2=enframe(x(2:length(x)),framelen,framelnc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
zcr=sum(signs.*diffs,2);
%计算短时能量
amp=sum(abs(enframe(filter([1 -0.9375],1,x),framelen,framelnc)),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}
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<maxsilence
count=count+1;
elseif count<minlen
status=0;
silence=0;
count=0;
else
status=3;
end
end
case 3,
break;
end
end
count=count-silence/2;
x2=x1+count-1;
subplot(1,1,1)
plot(x)
w=x(x1*framelnc:x2*framelnc,:);
figure(2)
plot(w)
|