资源简介

过零法和短时信号能量法,检测语音信号的起始点

资源截图

代码片段和文件信息

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

评论

共有 条评论