资源简介

matlab程序双门限法语音信号端点检测(可实现多段检测)

资源截图

代码片段和文件信息

function [x1x2] = vad(x)

%幅度归一化到[-11]
x = double(x);
x = x / max(abs(x));

%常数设置
frameLen = 240;%帧长为240点
frameInc = 80;%帧移为80点

amp1 = 10;%初始短时能量高门限
amp2 = 2;%初始短时能量低门限
zcr1 = 10;%初始短时过零率高门限
zcr2 = 5;%初始短时过零率低门限

maxsilence = 8;  % 8*10ms  = 80ms   语音段中允许的最大静音长度

minlen  = 15;    % 15*10ms = 150ms  语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音

status  = 0;     %初始状态为静音状态
count   = 0;     %初始语音段长度为0
silence = 0;     %初始静音段长度为0
 

%计算过零率
tmp1  = enframe(x(1:end-1) frameLen frameInc);
tmp2  = enframe(x(2:end)   frameLen frameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr   = sum(signs.*diffs 2);
 

%计算短时能量
amp = sum(abs(enframe(x frameLen frameInc)) 2);
 

%调整能量门限
amp1 = min(amp1 max(amp)/4);
amp2 = min(amp2 max(amp)/8);

subplot(311)    %subplot(311)表示将图排成3行1列,最后的一个1表示下面要画第1幅图
plot(x)
axis([1 length(x) -1 1])    
ylabel(‘Speech‘);

subplot(312)   
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel(‘Energy‘);


subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel(‘ZCR‘);

 

%开始端点检测
x1 = 0;
x2 = 0;
for n=1:length(zcr)
   goto = 0;
   switch status
   case {01}                   % 0 = 静音 1 = 可能开始
      if amp(n) > amp1          % 确信进入语音段
         x1 = max(n-count-11);
         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) > z

评论

共有 条评论