实验一语音信号端点检测最终报告 下载本文

内容发布更新时间 : 2024/3/29 5:06:10星期一 下面是文章的全部内容请认真阅读。

实验一语音信号端点检测

一、实验目的

1.学会MATLAB的使用,掌握MATLAB的程序设计方法; 2.掌握语音处理的基本概念、基本理论和基本方法; 3.掌握基于MATLAB编程实现带噪语音信号端点检测; 4.学会用MATLAB对信号进行分析和处理。

5. 学会利用短时过零率和短时能量,对语音信号的端点进行检测。 二、实验仪器设备及软件

HP D538、MATLAB 三、实验原理

端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果。本次实验利用短时过零率和短时能量相结合的语音端点检测算法利用短时过零率来检测清音,用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。

算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。算法以短时能量检测为主,短时过零率检测为辅。根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。在本算法中,短时能量检测可以较好地区分出浊音和静音。对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段

1、短时能量计算

定义n时刻某语言信号的短时平均能量En为:

??n2En??[x(m)w(n?m)]????[x(m)w(n?m)]

m?n?(N?1)2式中N为窗长,可见短时平均能量为一帧样点值的平方和。特殊地,当窗函数为

n矩形窗时,有En?2、短时过零率

?x2(m)

m?n?(N?1)过零就是指信号通过零值。过零率就是每秒内信号值通过零值的次数。

对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。可以用相邻两个取样改变符号的次数来计算。

如果窗的起点是n=0,短时过零率Z为 波形穿过横轴(零电平)的次数

Z0?1N?1w|Sgn(S?2n?0(n))?Sgn(Sw(n?1))|

sgn(x)??1,x?0?1,x?0

短时过零可以看作信号频率的简单度量

浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。 3、短时自相关函数

N?k?1Rw(k)??sn?0w(n)sw(n?k)

①是偶函数;

②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 % 语音将结束

silence = silence+1;

if silence < minsilence % 静音还不够长,尚未结束 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; %记录语音段结束点

subplot(3,1,1) plot(x)

axis([1 length(x) -1 1])

xlabel('帧数');ylabel('Speech');

line([x1*inc x1*inc], [-1 1], 'Color', 'red'); line([x2*inc x2*inc], [-1 1], 'Color', 'red');

subplot(3,1,2)

plot(amp);

axis([1 length(amp) 0 max(amp)]) xlabel('帧数');ylabel('Energy');

line([x1 x1], [min(amp),max(amp)], 'Color', 'red'); line([x2 x2], [min(amp),max(amp)], 'Color', 'red');

subplot(3,1,3)

plot(zcr);

axis([1 length(zcr) 0 max(zcr)]) xlabel('帧数');ylabel('ZCR');

line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red'); line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');

五、实验结果与分析

图1.2语音信号的端点检测实验结果输出图像

(1)从图中可以明显看出,浊音的短时能量大、短时过零率低。清音的短时能量小、短时过零率高。

(2)门限的选取对语音检测结果有很大影响。 (3)仅仅根据能量判断是比较粗糙的,还需要根据过零率进行判断。因为清音和噪声的短时平均过零率比背景噪声的平均过零率要高出好几倍。

六、实验体会

这次的实验,,给我最大的收获就是培养了独立思考和动手的能力,还有就是实验的灵活性,总得来说就是在独立与创新这二个环节,我更加掌握MATLAB的程序设计方法,进一步的了解了掌握基于MATLAB编程实现带噪语音信号端点检测的原理,这充分锻炼了我们独立的动手能力和独立的解决所遇到的问题,让我对这门课程又有了新的理解。