基于Matlab编写的语音端点检测.docx

上传人:b****0 文档编号:12457142 上传时间:2023-04-19 格式:DOCX 页数:32 大小:2.18MB
下载 相关 举报
基于Matlab编写的语音端点检测.docx_第1页
第1页 / 共32页
基于Matlab编写的语音端点检测.docx_第2页
第2页 / 共32页
基于Matlab编写的语音端点检测.docx_第3页
第3页 / 共32页
基于Matlab编写的语音端点检测.docx_第4页
第4页 / 共32页
基于Matlab编写的语音端点检测.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

基于Matlab编写的语音端点检测.docx

《基于Matlab编写的语音端点检测.docx》由会员分享,可在线阅读,更多相关《基于Matlab编写的语音端点检测.docx(32页珍藏版)》请在冰豆网上搜索。

基于Matlab编写的语音端点检测.docx

基于Matlab编写的语音端点检测

基于Matlab编写的语音端点检测

 

专业:

班级:

姓名:

指导教师:

 

2011年6月18日

 

一、实验目的

1.学会MATLAB的使用,掌握MATLAB的程序设计方法;

3.掌握语音处理的基本概念、基本理论和基本方法;

4.掌握基于MATLAB编程实现带噪语音信号端点检测;

5.学会用MATLAB对信号进行分析和处理。

二、实验内容简介:

可利用时域分析(短时能量、短时过零率、短时自相关)方法的某一个特征或某几个特征的结合,判定某一语音信号的端点,尤其在有噪声干扰时,如何准确检测语音信号的端点,这在语音处理中是富有挑战性的一个课题。

要求:

(1)录制语音,读入文件,绘制波形

(2)分帧,绘制能量曲线和短时过零率曲线

(3)根据上述端点检测原理,实现端点检测

(4)界面

三.课程设计原理

端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果,因此端点检测方法的研究一直是语音信号处理中的热点。

本设计使用传统的短时能量和过零率相结合的语音端点检测算法利用短时过零率来检测清音.用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。

算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。

算法以短时能量检测为主,短时过零率检测为辅。

根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。

在本算法中,短时能量检测可以较好地区分出浊音和静音。

对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。

将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段

1、短时能量计算

定义n时刻某语音信号的短时平均能量

为:

式中N为窗长,可见短时平均能量为为一帧样点值的甲醛平方和。

特殊地,当窗函数为矩形窗时,有

2、短时过零率

过零就是指信号通过零值。

过零率就是每秒内信号值通过零值的次数。

对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。

对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。

可以用相邻两个取样改变符号的次数来计算。

如果窗的起点是n=0,短时过零率Z为

波形穿过横轴(零电平)的次数

 

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

浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。

3、短时自相关函数

 

1、是偶函数;

2、s(n)是周期的,那么R(k)也是周期的;

3、可用于基音周期估计和线性预测分析

4、判断语音信号的起点和终点

利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。

语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者配合。

首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。

低门限被超过未必是语音的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音超

首先,可根据浊语音情况下短时平均幅度M的概率密度函数P(M/V)确定一个阈值参数MH,MH的值定得比较高。

当一帧输入信号的M值超过MH时,就可以十分肯定该帧语音信号不是无声,而有相当大的可能性是浊音由N1’向前和N2’向后继续用短时过零率Z进行搜索。

根据无声情况下短时过零率Z的均值,设置一个参数Z0,如果由N1’向前搜索时Z始终大于Z0的3倍,则认为这些信号仍属于语音段,直至Z突然下降到低于3Z0值时,这时可以确定语音的精确起点(为了保证可靠,由N1’向前搜索时间不超过25ms)。

对终点做同样的处理。

采取这一算法的原因在于,N1’以前可能是一段清辅音段(如f,s),它的能量相当弱,依靠能量不可能把他们与无声段区别开,而他们的过零率明显高于无声,因而能用这个参数来精确的判断二者的分割点,也就是语音真正的起点。

四、实验步骤及分步结果

1.界面设计

2.程序设计

(1).

①打开语音文件

functionopenbutton_Callback(hObject,eventdata,handles)

clc;

axes(handles.wavaxes);clareset;boxon;set(gca,'XTickLabel',[],'YTickLabel',[]);

axes(handles.Energeaxes);clareset;boxon;set(gca,'XTickLabel',[],'YTickLabel',[]);

axes(handles.Zerorateaxes);clareset;boxon;set(gca,'XTickLabel',[],'YTickLabel',[]);

set(handles.T1edit,'string',0);

set(handles.T2edit,'string',0);

set(handles.T3edit,'string',0);

%´ò¿ª´ý´¦ÀíµÄÓïÒôÎļþ

[filename,pathname]=uigetfile({'*.wav','AllWavFiles'},'Ñ¡ÔñÓïÒôÎļþ');

iffilename==0

return;%Èç¹ûûÓÐÑ¡ÔñеÄÎļþ£¬Ôò·µ»Ø

end

file=fullfile(pathname,filename);%ÎļþÃû

[signal,fs,bit]=wavread(file);%¶ÁÈ¡Ñ¡ÔñµÄÓïÒôÊý¾Ý

axes(handles.wavaxes)

plot(signal)%ÏÔʾ²¨ÐÎ

handles.wavsignal=signal;

%updatehandlesstructure

guidata(hObject,handles);

②预处理

预处理程序

functionprebutton_Callback(hObject,eventdata,handles)

%hObjecthandletoprebutton(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

signal=handles.wavsignal;

signal=filter([1,-0.9375],1,signal);%Ô¤¼ÓÖØÂ˲¨

axes(handles.wavaxes)

plot(signal)%ÏÔʾԤ¼ÓÖغó²¨ÐÎ

title('Ô¤¼ÓÖØÂ˲¨ºóÓïÒô²¨ÐÎ');

handles.wavsignal=signal;

framelength=256;%´°³¤£»

framenumber=fix(length(signal)/framelength);%×ÜÖ¡Êý

fori=1:

framenumber;framesignal(i,1:

framelength)=signal((i-1)*framelength+1:

i*framelength);%·ÖÖ¡´¦Àí

end

handles.framesignal=framesignal;

%Updatehandlesstructure

guidata(hObject,handles);

③短时能量

短时能量

functionEnergebutton_Callback(hObject,eventdata,handles)

%hObjecthandletoEnergebutton(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

framesignal=handles.framesignal;

framenumber=size(framesignal,1);%»ñµÃÊý¾ÝèåÊý

fori=1:

framenumber;

E(i)=0;

E(i)=sum(framesignal(i,:

).^2);%¼ÆËã¶ÌʱÄÜÁ¿

end

axes(handles.Energeaxes)

%c=[12345643333];

plot(E);%½«ÄÜÁ¿Ö»ÏÔʾÔÚÄÜÁ¿´°¿Ú

handles.E=E;

%Updatehandlesstructure

guidata(hObject,handles);

%---ExecutesonbuttonpressinZeroratebutton.

functionZeroratebutton_Callback(hObject,eventdata,handles)

%hObjecthandletoZeroratebutton(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

framesignal=handles.framesignal;

framenumber=size(framesignal,1);%ÓïÒôÊý¾ÝÖ¡Êý

framelength=size(framesignal,2);%»ñÈ¡ÓïÒôÖ¡³¤

fori=1:

framenumber;

Z(i)=0;

forj=2:

framelength-1;

Z(i)=Z(i)+abs(sign(framesignal(i,j))-sign(framesignal(i,j-1)));%¼ÆËã¶Ìʱ¹ýÁãÂÊ

end

end

axes(handles.Zerorateaxes)%ÏÔʾ֡¹ýÁãÂÊÇúÏß

plot(Z)

handles.Z=Z;

handles.framelength=framelength;

%Updatehandlesstructure

guidata(hObject,handles);

④短时过零率

短时过零率

functionZeroratebutton_Callback(hObject,eventdata,handles)

%hObjecthandletoZeroratebutton(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

framesignal=handles.framesignal;

framenumber=size(framesignal,1);%ÓïÒôÊý¾ÝÖ¡Êý

framelength=size(framesignal,2);%»ñÈ¡ÓïÒôÖ¡³¤

fori=1:

framenumber;

Z(i)=0;

forj=2:

framelength-1;

Z(i)=Z(i)+abs(sign(framesignal(i,j))-sign(framesignal(i,j-1)));%¼ÆËã¶Ìʱ¹ýÁãÂÊ

end

end

axes(handles.Zerorateaxes)%ÏÔʾ֡¹ýÁãÂÊÇúÏß

plot(Z)

handles.Z=Z;

handles.framelength=framelength;

%Updatehandlesstructure

guidata(hObject,handles);

⑤设定门限1.2阈值

设置门限1.2(编辑框2)

functionT2edit_Callback(hObject,eventdata,handles)

%hObjecthandletoT2edit(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

clc

axes(handles.Energeaxes);clareset;boxon;

set(gca,'XTicklabel',[],'YTicklabel',[]);%ÔÚÊäÈëеÄa,bֵʱ£¬ÒªÇå¿ÕEnergeaxesÀïµÄͼÏñ

TL=get(handles.T1edit,'string');%»ñµÃTLÖµ

TH=get(handles.T2edit,'string');%»ñµÃTHÖµ

TL=str2num(TL);%½«×Ö·ûÀàÐÍת»¯³ÉÊýÖµÀàÐÍ

TH=str2num(TH);

E=handles.E;

MeanE=mean(E(1:

10));%ÇóÇ°10Ö¡µÄÄÜÁ¿¾ùÖµ

axes(handles.Energeaxes)

plot(E)

holdon

line([1length(E)],[TLTL],'Color','r');%ÓúìÏß»³öTLÖµ

holdon

line([1length(E)],[TH,TH],'Color','b');%ÓÃÀ¶Ïß»³öTHÖµ

handles.TL=TL;

handles.TH=TH;

%Updatehandlesstructure

guidata(hObject,handles);

编辑框3门限3

functionT3edit_Callback(hObject,eventdata,handles)

%hObjecthandletoT3edit(seeGCBO)

%eventdatareserved-tobedefinedinafutureversionofMATLAB

%handlesstructurewithhandlesanduserdata(seeGUIDATA)

clc

axes(handles.Zerorateaxes);clareset;boxon;

set(gca,'XTickLabel',[],'YtickLabel',[]);

v=get(handles.T3edit,'string');

v=1*str2num(v);

Z=handles.Z;

MeanZ=mean(Z(1:

10));

VarZ=std(Z(1:

10));

ZT=min(v,MeanZ+VarZ);

axes(handles.Zerorateaxes)

plot(Z)

holdon

line([1,length(Z)],[ZT,ZT],'Color','b');

handles.ZT=ZT;

guidata(hObject,handles);

⑦端点检测

端点检测

functionDetectpointbutton_Callback(hObject,eventdata,handles)

TL=handles.TL;%¼ÓÔØÊý¾Ý

TH=handles.TH;

ZT=handles.ZT;

Z=handles.Z;

E=handles.E;

startflag=1;

startframe=11;

mins=min(handles.wavsignal);

maxs=max(handles.wavsignal);

axes(handles.wavaxes);

plot(handles.wavsignal);

accustartflag=1;

accustartframe=startframe-15;

i=accustartframe;

k=0;

i=11;

while(startflag)%ÓöÌʱÄÜÁ¿³õ²½¼ÆËãÆðʼµã

if((E(i)>TL)&(E(i+1)>TH))

startframe=i;

startflag=0;%±ê־λÇåÁãÍ˳öÑ»·

while(accustartflag)%ÓöÌʱ¹ýÁãÂʽøÒ»²½¼ÆËãÆðʼµã

if(Z(i)>ZT);

k=k+1;

if(k==3)

accustartflag=0;

accustartframe=i-3

startframe=accustartframe;

end

else

k=0;

end

i=i+1;

end

else

i=i+1;

end

end

endflag=1;

endframe=length(E);

i=endframe;

accuendflag=1;

accuendframe=endframe+15;

i=accuendframe;

k=0;

j=size(E);

fori=11:

j-1;%ÓɶÌʱÄÜÁ¿´ÖÅÐÖÕÖ¹µã

if(i==1)

break;

end

if((E(i)>TL)&(E(i-1)>TH))

endframe=i;

while(accuendflag)%ÓɶÌʱ¹ýÁãÂʽøÒ»²½¼ÆËãÖÕÖ¹µã

if(i>length(Z))

break;

end

if(Z(i)>ZT)

k=k+1;

if(k==3)

accuendflag=0;

accuendframe=i;

endframe=accuendframe;

endflag=0;

end

else

k=0;

end

i=i+1;

end

elsei=i-1;

end

end

holdon

line([startframe*256startframe*256],[-0.50.5],'Color','b');%»³öÆðʼµã

holdon

line([endframe*256endframe*256],[-0.50.5],'Color','r');%»³öÖÕÖ¹µã

五、实验结论分析:

(1)从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。

清音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。

(2)浊音:

短时能量大、短时平均幅度大、短时过零率低;清音:

短时能量小、短时平均幅度小、短时过零率高。

(3)门限值的选取对语音检测结果有很大影响。

(4)仅仅根据能量判断是比较粗糙的,还需根据过零率进行判断。

因为清音和噪声的短时平均过零率比背景噪声的平均过零率要高出好几倍。

 

六,实验心得

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

七.参考资料

1.王永琦《MATLAB与音视频技术》北京清华大学出版社2013年11月第一版:

91-103.

2..韩纪庆张磊郑铁然《语音信号处理》北京清华大学出版社2004年9月第一版

 

附源代码:

functionvarargout=duandianjiance(varargin)

%DUANDIANJIANCEMATLABcodeforduandianjiance.fig

%DUANDIANJIANCE,byitself,createsanewDUANDIANJIANCEorraisestheexisting

%singleton*.

%

%H=DUANDIANJIANCEreturnsthehandletoanewDUANDIANJIANCEorthehandleto

%theexistingsingleton*.

%

%DUANDIANJIANCE('CALLBACK',hObject,eventData,handles,...)callsthelocal

%functionnamedCALLBACKinDUANDIANJIANCE.Mwiththegiveninputarguments.

%

%DUANDIANJIANCE('Property','Value',...)createsanewDUANDIANJIANCEorraisesthe

%existingsingleton*.Startingfromtheleft,propertyvaluepairsare

%appliedtotheGUIbeforeduandianjiance_OpeningFcngetscalled.An

%unrecognizedpropertynameorinvalidvaluemakespropertyapplication

%stop.Allinputsarepassedtoduandianjiance_OpeningFcnviavarargin.

%

%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone

%instancetorun(singleton)".

%

%Seealso:

GUIDE,GUIDATA,GUIHANDLES

%Edittheabovetexttomodifytheresponsetohelpduandianjiance

%LastModifiedbyGUIDEv2.529-Dec-201414:

40:

22

%Begininitializationcode-DONOTEDIT

gui_Singleton=1;

gui_State=struct('gui_Name',mfilename,...

'gui_Singleton',gui_Singleton,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1