实验一语音信号端点检测最终报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一语音信号端点检测
一、实验目的
1.学会MATLAB 的使用,掌握MATLAB 的程序设计方法;
2.掌握语音处理的基本概念、基本理论和基本方法;
3.掌握基于MATLAB 编程实现带噪语音信号端点检测;
4.学会用MATLAB 对信号进行分析和处理。
5. 学会利用短时过零率和短时能量,对语音信号的端点进行检测。
二、实验仪器设备及软件
HP D538、MATLAB
三、实验原理
端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果。本次实验利用短时过零率和短时能量相结合的语音端点检测算法利用短时过零率来检测清音,用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。
算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。算法以短时能量检测为主,短时过零率检测为辅。根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。在本算法中,短时能量检测可以较好地区分出浊音和静音。对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段
1、短时能量计算
定义n 时刻某语言信号的短时平均能量En 为:
∑∑--=+∞∞--=
-=n
N n m m n w m x m n w m x En )1(2
2)]()([)]()([ 式中N 为窗长,可见短时平均能量为一帧样点值的平方和。特殊地,当窗函数为
矩形窗时,有∑--==
n
N n m m x En )
1(2)( 2、短时过零率 过零就是指信号通过零值。过零率就是每秒内信号值通过零值的次数。
对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变
符号的次数。对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。可以用相邻两个取样改变符号的次数来计算。
如果窗的起点是n=0,短时过零率Z 为
波形穿过横轴(零电平)的次数
|))1(())((|211
00∑-=--=N n w w n S Sgn n S Sgn Z
{0
0,1,1)sgn(≥<-=x x x
短时过零可以看作信号频率的简单度量
浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无
声居中,浊音的短时过零率最小。
3、短时自相关函数
∑--=+=1
0)()()(k N n w w w k n s n s
k R
①是偶函数;
②s(n)是周期的,那么R (k )也是周期的;
③可用于基音周期估计和线性预测分析
4、判断语音信号的起点和终点
利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者配合。首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。低门限被超过未必是语音 的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音。
四、实验步骤及程序
(1) 实验步骤:
1、取一段录音作为音频样本。
2、利用公式分别编程计算这段语音信号的短时能量和短时过零率,然后分别画出它们
的曲线。
3、调整能量门限。
4、进行幅度归一化并设置帧长、短时能量阈值、过零率阈值等参数。
5、编写程序实现语音端点检测。
6、最后得到语音端点检测图像。
(2) 语音信号的端点检测程序流程图:
输入语音信号
幅度归一化
设置参数
计算短时能量和过零率
调整能量门限
开始端点检测
输出样本端点检测图像
图 1.1 语音信号的端点检测程序流程图
(3) 语音信号的端点检测实验源程序:
[x,fs,nbits]=wavread('1.wav');%语音信号的端点检测matlab实现x = x / max(abs(x));%幅度归一化到[-1,1]
%参数设置
FrameLen = 256; %帧长
inc = 90; %未重叠部分
amp1 = 10; %短时能量阈值
amp2 = 2;
zcr1 = 10; %过零率阈值
zcr2 = 5;
minsilence = 6; %用无声的长度来判断语音是否结束
minlen = 15; %判断是语音的最小长度
status = 0; %记录语音段的状态
count = 0; %语音序列的长度
silence = 0; %无声的长度
%计算过零率
tmp1 = enframe(x(1:end-1), FrameLen,inc);
tmp2 = enframe(x(2:end) , FrameLen,inc);
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, inc))).^2, 2);
%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%开始端点检测
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% 语音将结束