Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
vad-端点检测程序.m
Package: matlabyuyinshibiesuanfa.rar [view]
Upload User: djljerry
Upload Date: 2013-05-21
Package Size: 3k
Code Size: 2k
Category:
Speech/Voice recognition/combine
Development Platform:
Matlab
- function [x1,x2] = vad(x)
- %幅度归一化到[-1,1]
- x = double(x);
- x = x / max(abs(x));
- %常数设置
- FrameLen = 240;
- FrameInc = 80;
- amp1 = 10;
- amp2 = 2;
- zcr1 = 10;
- zcr2 = 5;
- maxsilence = 8; % 6*10ms = 30ms
- minlen = 15; % 15*10ms = 150ms
- status = 0;
- count = 0;
- silence = 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(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 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} % 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;