限,一个是较低的门限数值较小,对信号的 变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。低门限被超过未必是语音 的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音超
首先,可根据浊语音情况下短时平均幅度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).
①打开语音文件
function openbutton_Callback(hObject, eventdata, handles) clc;
axes(handles.wavaxes);cla reset;box
on;set(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); %′ò?a′y′|àíμ?ó?ò????t
[filename,pathname]=uigetfile({'*.wav','All Wav Files'},'????ó?ò????t'); if filename == 0
return;%è?1???óD????D?μ????t£??ò·μ?? end
file=fullfile(pathname,filename);%???t??
[signal,fs,bit]=wavread(file);%?áè?????μ?ó?ò?êy?Y axes(handles.wavaxes) plot(signal)%??ê?2¨D?
handles.wavsignal=signal; %update handles structure guidata(hObject,handles);
②预处理
预处理程序
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) signal=handles.wavsignal;
signal=filter([1,-0.9375],1,signal);%?¤?ó????2¨ axes(handles.wavaxes) plot(signal)%??ê??¤?ó??oó2¨D? title('?¤?ó????2¨oóó?ò?2¨D?'); handles.wavsignal=signal; framelength=256;%′°3¤£?
framenumber=fix(length(signal)/framelength);%×ü??êy for i=1:framenumber;
framesignal(i,1:framelength)=signal((i-1)*framelength+1:i*framelength
);%·???′|àí end
handles.framesignal=framesignal; %Update handles structure guidata(hObject,handles);
③短时能量
短时能量
function Energebutton_Callback(hObject, eventdata, handles) % hObject handle 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);%??μ?êy?Yè?êy for i=1:framenumber; E(i)=0;
E(i)=sum(framesignal(i,:).^2);%?????ìê±?üá? end
axes(handles.Energeaxes) %c=[1 2 3 4 5 6 4 3 3 3 3]; plot(E);%???üá?????ê??ú?üá?′°?ú handles.E=E;
%Update handles structure