function varargout = GUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI_OpeningFcn, ...
'gui_OutputFcn', @GUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function GUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = GUI_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function pushbutton1_Callback(hObject, eventdata, handles)
set(handles.text1,'Visible','off');
[filename pathname]=uigetfile({'*.WAV';'*.*'},'¿ªÊ¼'); %%读取音频文件
str=[pathname filename];
[Y,fs]=audioread(str);
L=length(Y); %原信号点数
N=fix(fs*0.015); %帧长
frameN=fix(L/N); %帧数
Y=Y/max(abs(Y)); %归一化
%%
%%%%%%短时能量%%%%%%%%
En=zeros(1,frameN);
Mn=zeros(1,frameN);
for i=1:frameN
Yn=Y(((i-1)*N+1):i*N);
En(i)=sum(Yn.*Yn);
end
%%
%%%%%%浊音提取%%%%%%%%
Emax=max(En);
ref=0.08*Emax;
for i=1:frameN
if(En(i)>ref)
Mn(i)=1;
end
end
%%
%%%%%%基音频率%%%%%%%%
for i=1:frameN
if(Mn(i)==1)
Yn=Y(((i-1)*N+1):i*N);
Yn0=Yn;
R=Relation(Yn0,N);
[Rmax1,Rdot1]=max(R(18:160));
f1(i)=fs/(Rdot1+17);
end
end
%%%%%%某帧采样点%%%
for i=140:140
if(Mn(i)==1)
Yn=Y(((i-1)*N+1):i*N);
Yn0=Yn;
R1=Relation(Yn0,N);
end
end
axes(handles.axes1);
plot(Y),xlabel('帧数'),ylabel('幅度'),title('原信号');
axes(handles.axes2);
plot(En),xlabel('帧数'),ylabel('En'),title('短时能量');
axes(handles.axes3);
plot(f1),xlabel('帧数'),ylabel('f'),title('基音频率');
axes(handles.axes4);
plot(R1),xlabel('帧数'),title('自相关');
%%%%男女声判断%%%%
sum1=0;
s=0;
for i=1:frameN
if(Mn(i)==1)
s=s+1;
sum1=sum1+f1(i);
end
end
Final=mean(sum1);
if Final>200
set(handles.text2,'String','判断结果:女声');
else
set(handles.text2,'String','判断结果:男声');
end
function pushbutton2_Callback(hObject, eventdata, handles)
close;
自相关函数另外编写(放在主程序里运行时间长)function Re=Relation(X,N)
for i=0:(N-1)
Re(i+1)=0;
for n=1:(N-i)
Re(i+1)=Re(i+1)+X(n)*X(n+i);
end
end