1、基于Matlab编写的语音端点检测专 业: 班 级: 姓 名: 指导教师: 2011 年 6月 18 日一、实验目的1学会MATLAB的使用,掌握MATLAB的程序设计方法;3掌握语音处理的基本概念、基本理论和基本方法;4掌握基于MATLAB编程实现带噪语音信号端点检测;5学会用MATLAB对信号进行分析和处理。二、实验内容简介:可利用时域分析(短时能量、短时过零率、短时自相关)方法的某一个特征或某几个特征的结合,判定某一语音信号的端点,尤其在有噪声干扰时,如何准确检测语音信号的端点,这在语音处理中是富有挑战性的一个课题。 要求:(1)录制语音,读入文件,绘制波形 (2)分帧,绘制能量曲线和短
2、时过零率曲线 (3)根据上述端点检测原理,实现端点检测 (4)界面三课程设计原理端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果,因此端点检测方法的研究一直是语音信号处理中的热点。本设计使用传统的短时能量和过零率相结合的语音端点检测算法利用短时过零率来检测清音用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。算法以短时能量检测为主,短时过零率检测为辅。根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。在本算法中,短时能量检测可以较好地区分
3、出浊音和静音。对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段1、短时能量计算定义n时刻某语音信号的短时平均能量为:式中N为窗长,可见短时平均能量为为一帧样点值的甲醛平方和。特殊地,当窗函数为矩形窗时,有2、短时过零率过零就是指信号通过零值。过零率就是每秒内信号值通过零值的次数。对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。可以用相邻两个取样改变符号的次数来计
4、算。如果窗的起点是n=0,短时过零率Z为波形穿过横轴(零电平)的次数短时过零可以看作信号频率的简单度量浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。3、 短时自相关函数1、是偶函数;2、s(n)是周期的,那么R(k)也是周期的;3、可用于基音周期估计和线性预测分析4、判断语音信号的起点和终点利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者 配合。首先为短时能量和过零率分别确
5、定两个门限,一个是较低的门限数值较小,对信号的 变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。低门限被超过未必是语音 的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音超首先,可根据浊语音情况下短时平均幅度M的概率密度函数P(M/V)确定一个阈值参数MH, MH的值定得比较高。当一帧输入信号的M值超过MH时,就可以十分肯定该帧语音信号不是无声,而有相当大的可能性是浊音由N1向前和N2向后继续用短时过零率Z进行搜索。根据无声情况下短时过零率Z的均值,设置一个参数Z0,如果由N1向前搜索时Z始终大于Z0的3倍,则认为这些信号仍属于语音段,直至Z突然下降到低于
6、3Z0值时,这时可以确定语音的精确起点(为了保证可靠,由N1 向前搜索时间不超过25ms)。对终点做同样的处理。采取这一算法的原因在于, N1以前可能是一段清辅音段(如f,s),它的能量相当弱,依靠能量不可能把他们与无声段区别开,而他们的过零率明显高于无声,因而能用这个参数来精确的判断二者的分割点,也就是语音真正的起点。四、实验步骤及分步结果 1.界面设计 2.程序设计(1).打开语音文件function openbutton_Callback(hObject, eventdata, handles)clc;axes(handles.wavaxes);cla reset;box on;set(
7、gca,XTickLabel,YTickLabel,);axes(handles.Energeaxes);cla reset;box on;set(gca,XTickLabel,YTickLabel,);axes(handles.Zerorateaxes);cla reset;box on;set(gca,XTickLabel,YTickLabel,);set(handles.T1edit,string,0);set(handles.T2edit,string,0);set(handles.T3edit,string,0);% filename,pathname=uigetfile(*.wav
8、,All Wav Files,); if filename = 0 return;% end file=fullfile(pathname,filename);% signal,fs,bit=wavread(file);% axes(handles.wavaxes) plot(signal)% handles.wavsignal=signal; %update handles structure guidata(hObject,handles);预处理预处理程序function prebutton_Callback(hObject, eventdata, handles)% hObject h
9、andle to prebutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)signal=handles.wavsignal;signal=filter(1,-0.9375,1,signal);%axes(handles.wavaxes)plot(signal)%title();handles.wavsignal=signal;framelength=256;%f
10、ramenumber=fix(length(signal)/framelength);%for i=1:framenumber; framesignal(i,1:framelength)=signal(i-1)*framelength+1:i*framelength);%endhandles.framesignal=framesignal;%Update handles structureguidata(hObject,handles);短时能量短时能量function Energebutton_Callback(hObject, eventdata, handles)% hObject ha
11、ndle to Energebutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)framesignal=handles.framesignal;framenumber=size(framesignal,1);%for i=1:framenumber; E(i)=0; E(i)=sum(framesignal(i,:).2);%endaxes(handles.Ene
12、rgeaxes)%c=1 2 3 4 5 6 4 3 3 3 3;plot(E);%handles.E=E;%Update handles structureguidata(hObject,handles); % - Executes on button press in Zeroratebutton.function Zeroratebutton_Callback(hObject, eventdata, handles)% hObject handle to Zeroratebutton (see GCBO)% eventdata reserved - to be defined in a
13、future version of MATLAB% handles structure with handles and user data (see GUIDATA)framesignal=handles.framesignal;framenumber=size(framesignal,1);%framelength=size(framesignal,2);%for i=1:framenumber; Z(i)=0; for j=2:framelength-1; Z(i)=Z(i)+abs(sign(framesignal(i,j)-sign(framesignal(i,j-1);% ende
14、ndaxes(handles.Zerorateaxes)%plot(Z)handles.Z=Z;handles.framelength=framelength;%Update handles structureguidata(hObject,handles);短时过零率短时过零率function Zeroratebutton_Callback(hObject, eventdata, handles)% hObject handle to Zeroratebutton (see GCBO)% eventdata reserved - to be defined in a future versi
15、on of MATLAB% handles structure with handles and user data (see GUIDATA)framesignal=handles.framesignal;framenumber=size(framesignal,1);%framelength=size(framesignal,2);%for i=1:framenumber; Z(i)=0; for j=2:framelength-1; Z(i)=Z(i)+abs(sign(framesignal(i,j)-sign(framesignal(i,j-1);% endendaxes(handl
16、es.Zerorateaxes)%plot(Z)handles.Z=Z;handles.framelength=framelength;%Update handles structureguidata(hObject,handles);设定门限1.2阈值设置门限1.2(编辑框2)function T2edit_Callback(hObject, eventdata, handles)% hObject handle to T2edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% ha
17、ndles structure with handles and user data (see GUIDATA)clcaxes(handles.Energeaxes);cla reset;box on;set(gca,XTicklabel,YTicklabel,);%a,bEnergeaxesTL=get(handles.T1edit,string);%TLTH=get(handles.T2edit,string);%THTL=str2num(TL);%TH=str2num(TH);E=handles.E;MeanE=mean(E(1:10);%10axes(handles.Energeaxe
18、s)plot(E)hold online(1 length(E),TL TL,Color,r);%TLhold online(1 length(E),TH,TH,Color,b);%THhandles.TL=TL;handles.TH=TH;%Update handles structureguidata(hObject,handles);编辑框3门限3function T3edit_Callback(hObject, eventdata, handles)% hObject handle to T3edit (see GCBO)% eventdata reserved - to be def
19、ined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)clc axes(handles.Zerorateaxes);cla reset;box on;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.
20、Zerorateaxes)plot(Z)hold online(1,length(Z),ZT,ZT,Color,b);handles.ZT=ZT;guidata(hObject,handles);端点检测端点检测function Detectpointbutton_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(
21、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=
22、accustartframe; end else k=0; end i=i+1;end else i=i+1; endend endflag=1;endframe=length(E);i=endframe;accuendflag=1;accuendframe=endframe+15;i=accuendframe;k=0;j=size(E);for i=11:j-1;% if(i=1) break; end if(E(i)TL)&(E(i-1)TH) endframe=i; while(accuendflag)% if(ilength(Z) break; end if(Z(i)ZT) k=k+1
23、; if(k=3) accuendflag=0; accuendframe=i; endframe=accuendframe; endflag=0; end else k=0; end i=i+1; end else i=i-1; endendhold online(startframe*256 startframe*256,-0.5 0.5,Color,b);%hold online(endframe*256 endframe*256,-0.5 0.5,Color,r);%五、实验结论分析:(1) 从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。清
24、音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。(2) 浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。(3) 门限值的选取对语音检测结果有很大影响。(4) 仅仅根据能量判断是比较粗糙的,还需根据过零率进行判断。因为清音和噪声的短时平均过零率比背景噪声的平均过零率要高出好几倍。六,实验心得 这次的实验,,给我最大的收获就是培养了独立思考和动手的能力,还有就是实验的灵活性,总得来说就是在独立与创新这二个环节,我更加掌握MATLAB的程序设计方法,进一步的了解了掌握基于MATLAB编程实现带噪语音信号端点检测的原理,这充分锻炼了
25、我们独立的动手能力和独立的解决所遇到的问题,让我对这门课程又有了新的理解。七参考资料1.王永琦 MATLAB与音视频技术 北京 清华大学出版社 2013年11月第一版 :91-103.2.韩纪庆 张磊 郑铁然 语音信号处理 北京 清华大学出版社 2004年9月第一版 附源代码:function varargout = duandianjiance(varargin)% DUANDIANJIANCE MATLAB code for duandianjiance.fig% DUANDIANJIANCE, by itself, creates a new DUANDIANJIANCE or rais
26、es the existing% singleton*.% H = DUANDIANJIANCE returns the handle to a new DUANDIANJIANCE or the handle to% the existing singleton*.% DUANDIANJIANCE(CALLBACK,hObject,eventData,handles,.) calls the local% function named CALLBACK in DUANDIANJIANCE.M with the given input arguments.% DUANDIANJIANCE(Pr
27、operty,Value,.) creates a new DUANDIANJIANCE or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before duandianjiance_OpeningFcn gets called. An% unrecognized property name or invalid value makes property application% stop. All inputs are passed
28、to duandianjiance_OpeningFcn via varargin.% *See GUI Options on GUIDEs Tools menu. Choose GUI allows only one% instance to run (singleton).% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help duandianjiance% Last Modified by GUIDE v2.5 29-Dec-2014 14:40:22% Begi
29、n initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, duandianjiance_OpeningFcn, . gui_OutputFcn, duandianjiance_OutputFcn, . gui_LayoutFcn, , . gui_Callback, );if nargin & ischar(varargin1) gui_State.gui_Callba
30、ck = str2func(varargin1);endif nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);end% End initialization code - DO NOT EDIT% - Executes just before duandianjiance is made visible.function duandianjiance_OpeningFcn(hObject, eventdata, handles, varar
31、gin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% varargin command line arguments to duandianjiance (see VARARGIN)% Choose default command lin
32、e output for duandianjiancehandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes duandianjiance wait for user response (see UIRESUME)% uiwait(handles.figure1);% - Outputs from this function are returned to the command line.function varargout = duandianjiance_Out
33、putFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles
34、structurevarargout1 = handles.output;% - Executes on button press in prebutton.function prebutton_Callback(hObject, eventdata, handles)% hObject handle to prebutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA
35、)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);for i=1:framenumber; framesignal(i,1:framelength)=signal(i-1)*framelength+1:i*framele
36、ngth);endhandles.framesignal=framesignal;%Update handles structureguidata(hObject,handles);% - Executes on button press in openbutton.function openbutton_Callback(hObject, eventdata, handles)% hObject handle to openbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB%
37、handles structure with handles and user data (see GUIDATA)%当打开新的语音文件后,将3个轴对象清空,将各个门限值设置为零clc;axes(handles.wavaxes);cla reset;box on;set(gca,XTickLabel,YTickLabel,);axes(handles.Energeaxe);cla reset;box on;set(gca,XTickLabel,YTickLabel,);axes(handles.Zerorateaxes);cla reset;box on;set(gca,XTickLabel,
38、YTickLabel,);set(handles.T1edit,string,0);set(handles.T2edit,string,0);set(handles.T3edit,string,0);%打开待处理的语音文件 filename,pathname=uigetfile(*.wav,All Wav Files,选择语音文件); if filename = 0 return;%如果没有选择新的文件,则返回 end file=fullfile(pathname,filename);%文件名 signal,fs,bit=wavread(file);%读取选择的语音数据 axes(handle
39、s.wavaxes) plot(signal)%显示波形 handles.wavsignal=signal; %update handles structure guidata(hObject,handles);% - Executes on button press in Energebutton.function Energebutton_Callback(hObject, eventdata, handles)% hObject handle to Energebutton (see GCBO)% eventdata reserved - to be defined in a futur
40、e version of MATLAB% handles structure with handles and user data (see GUIDATA)framesignal=handles.framesignal;framenumber=size(framesignal,1);%获得数据桢数for i=1:framenumber; E(i)=0; E(i)=sum(framesignal(i,:).2);%计算短时能量endaxes(handles.Energeaxes)%c=1 2 3 4 5 6 4 3 3 3 3;plot(E);%将能量只显示在能量窗口handles.E=E;%
41、Update handles structureguidata(hObject,handles);% - Executes on button press in Zeroratebotton.function Zeroratebotton_Callback(hObject, eventdata, handles)% hObject handle to Zeroratebotton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)framesignal=handles.fram