端点检测的双门限法 双门限法主要是用短时能量和短时过零率。短时能量用于区分浊音(能量高) 和清音(能量低)短时过零率 zcr 用于区分清音(准确地说是清辅音)和静音,清 辅音 zcr 高,静音的 zcr 低。语音的两端是辅音: 元音:气流呼出口腔时不受到阻碍的音 辅音:气流受到口腔或者鼻腔阻碍的音; 清音:声带不震动的音 浊音:声带振动的音
1、理论基础: 语音信号一般可分为无声段、清音段和浊音段。无声段是背景噪声段,平均能量 最低;浊音段为声带振动发出对应的语音信号段,平均能量最高;清音段是空气在口 腔中的摩擦、冲击或爆破而发出的语音信号段,平均能量居于前两者之间。清音段和 无声段的波形特点有明显的不同,无声段信号变化较为缓慢,而清音段信号在幅度上 变化剧烈,穿越零电平次数也多。经验表明,通常清音段过零率最大。端点检测就是 首先判断/有声 0 还是/无声 0,如果有声,则还要判断是/清音 0 还是/浊音 0。为正确 地实现端点检测,一般综合利用短时能量和过零率两个特征,采用/双门限检测法 0。
2、基本思路: 根据信号设置三个阈值:能量阈值,TL,TH;过零率阈值 ZCR,当某帧信号大于 TL 或者大于 ZCR 时,认为信号的开始、起点,当大于 TH 时,则认为正式的语音信 号,如果保持一段时间,则确认这信号即所需信号。
3、步骤: (1)在对语音信号进行分析和处理之前,必须对其进行预加重、分帧、加窗等预处理 操作。这些操作的目的是消除因为人类发声器官本身和由于采集语音信号的设备所 带来的混叠、高次谐波失真、高频等等因素,对语音信号质量的影响。尽可能保证 后续语音处理得到的信号更均匀、平滑,为信号参数提取提供优质的参数,提高语 音处理质量。 (2)短时能量短时能量序列反映了语音振幅或能量随着时间缓慢变化的规律 (3)过零率 语音信号处理中的端点检测主要是为了自动检测出语音的起始点及结束点。 这里我们采用了双门限比较法来进行端点检测。双门限比较法以短时能量 E 和短时 平均过零率 Z 作为特征,结合 Z 和 E 的优点,使检测更为准确,有效降低系统的处 理时间,能排除无声段的噪声干扰,从而提高的语音信号的处理性能。
%能量与过零数的端点检测算法 1 clear all; file='D:\大三下数字图像处理\语音 ppt\imut_du\a.wav'; [x,Fs]=audioread(file);
x=x/max(abs(x));%归一化 %阈值设置
amp1 = 0.1; amp2 = 0.05;
zcr1 = 90; zcr2 = 135;
x=filter([1 -0.98],[1],x);%预加重
wlen=200;%帧长
inc=100;%帧移
win=hamming(wlen);%海明窗
N=length(x);%信号长度
time=(0:N-1)/Fs;%计算出信号的时间刻度
X=enframe(x,win,inc)'; %分帧,一列是一帧
fn=size(X,2)';%帧数
frameTime=(((1:fn)-1)*inc+wlen/2)/Fs;% 计算每帧对应的时间 %短时能量 for i=1:fn y=X(:,i);%每一帧数据
b=0;
for m=1:1:200%一帧中的数据
b=b+y(m).^2;
end
E(i)=b;
end %短时过零率
Z=zeros(1,fn); % 初始化,fn 之前用过
for i=1:fn y=X(:,i);%每一帧数据
b=0;
for m=1:1:199
if y(m)*y(m+1)<0;
b=b+1;
end
Z(i)=b;
end
end %找短时能量的门限来确定语音的开始和结束
zeros(i); q=[];%存储开始语音界限的位置
i1=1;
while (i1<length(E))
for i1=i1:1:length(E)
e=E(i1);
if e>amp1 q=[q i1-1];
i1=i1+1;
for i2=i1:length(E)
e=E(i2);
if e<amp2 q=[q i2+1];
i1=i2+1;
break
end
end
break
end
end
end%过零率
i1=1;
w=[];%存储结束语音界限位置
while (i1<length(Z))
for i1=i1:1:length(Z)
e=Z(i1);
if e>zcr2 w=[w i1];
i1=i1+1;
for i2=i1:length(Z)
e=Z(i2);
if e<zcr1 w=[w i2+1];
i1=i2+1;
break
end
end
break
end
end
end %画图
subplot(311) plot(time,x); title('原始信号')
xlabel('时间');ylabel('幅度');
subplot(312) plot(frameTime(q),E(q),'or'); hold on plot(frameTime,E);
title('短时能量') xlabel('时间');ylabel('幅度'); subplot(313) plot(frameTime(w),Z(w),'or'); hold on plot(frameTime,Z); title('过零率') xlabel('时间');ylabel('次数');
由上图大致可知,端点检测即为在短时能量谱和短时过零检测上通过能量大小 和过零点次数的多少来判断语音的开始和结束,由于语音信号的不同,其效果也不 同,该方法适用于过零次数相差较大和能量幅度相差较大的情况 同样的程序更改音频 BUZZ4.wav’(见附件)后,重新设置阈值 amp1 = 1; amp2 = 1; zcr1 = 60; zcr2 = 50; 后,有