资源简介
过零法和短时信号能量法,检测语音信号的起始点
代码片段和文件信息
function [x1x2]=vad(x)
% 幅度归一化[-1,1]
x=double(x);
x=x/max(abs(x));
framelen=200;
frameinc=100;
%门限参数
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=3;
minlen=15;
status=0;
cout=0;
silence=0;
% 分祯and 计算过零率
tmp1=enframe(x(1:length(x)-1)framelenframeinc);
tmp2=enframe(x(2:length(x))framelenframeinc);
signs=(tmp1.*tmp2)<0; %n*framelen 的矩阵
diffs=(tmp1-tmp2)>0.02;
% sum函数的使用 sum(a1)是表示每列相加 而sum(a2)是表示每行相加
zcr=sum(signs.*diffs2); % n*1的矩阵
%计算短时间能量
amp=sum(abs(enframe(filter([1-0.9375]1x)framelenframeinc))2); % n*1的矩阵
%调整能量门限
amp1=min(amp1max(amp)/4);
amp2=min(amp2max(amp)/8);
%开始端点检测
x1=0;
x2=0;
for n=1:length(zcr) % length =max(size(x)) 这儿实际是n
goto = 0; % 这个有什么作用 ???????????
switch status
case {01}
if amp(n)>amp1
x1=max(n-cout-11);
status=2;
silence=0;
cout=cout+1;
elseif amp(n)>amp2 | zcr(n)>zcr2
status=1;
cout=cout+1;
else
status=0;
cout=0
评论
共有 条评论