clc;
close all;
defcolor=[0,0,0];
h_fig=figure(1);
set(h_fig,'Menubar','name','语音情感识别系统 v1.0',...
'Numbertitle','off',...
'color',[0.9023 0.9074 0.8055]);
h_text=uicontrol(h_fig,'style','text','unit','normalized',...
'position',[0.0,0.0,1,1]);
h_text1=uicontrol(h_fig,'style','text','unit','normalized',...
'position',[0.0,0.85,0.25,0.05],'horizontal','left',...
'string','请选择待检测wav文件:','fontsize',10,'ForegroundColor',defcolor);
h_edit1=uicontrol(h_fig,'style','edit','unit','normalized',...
'position',[0.28,0.80,0.5,0.1],'horizontal','left',...
'fontsize',10, 'ForegroundColor',defcolor);
h_push3=uicontrol(h_fig,'style','push','unit','normalized',...
'position',[0.78,0.8,0.08,0.1],'horizontal','left',...
'string','...','fontsize',20,'ForegroundColor',defcolor,'callback','getfile');
h_push1=uicontrol(h_fig,'style','push','unit','normalized',...
'position',[0.4,0.75,0.18,0.05],'horizontal','left',...
'string','确定','fontsize',10,'ForegroundColor',defcolor,'callback','process');
h_text3=uicontrol(h_fig,'style','text','unit','normalized',...
'position',[0,0.5,0.28,0.1],'horizontal','left',...
'string','传统KNN算法获得结果为:','fontsize',10,'ForegroundColor',defcolor);
h_edit2=uicontrol(h_fig,'style','edit','unit','normalized',...
'position',[0.28,0.5,0.3,0.1],'horizontal','left',...
'fontsize',10,'ForegroundColor',defcolor);
[y,fs]=wavread(filename);
sound(y,fs)
X3=mean(FunFre(y,fs));
[X1,X2,X4]=TimePara(y);
k=13;
XA=[Aa Ah As X1];XE=[Ea Eh Es X2];XF=[Fa Fh Fs X3];XZ=[Za Zh Zs X4];
PA=mapzo(XA);PE=mapzo(XE);PF=mapzo(XF);PZ=mapzo(XZ);
a=[PA(1:30);PE(1:30);PF(1:30);PZ(1:30)];
h=[PA(31:60);PE(31:60);PF(31:60);PZ(31:60)];
s=[PA(61:90);PE(61:90);PF(61:90);PZ(61:90)];
x=[PA(91);PE(91);PF(91);PZ(91)];
%%%传统KNN算法
disp('使用传统KNN算法识别结果为:')
A=oushi(a,x);
H=oushi(h,x);
S=oushi(s,x);
set(h_edit2,'style','text');
set(h_edit2,'string',judge(A,H,S,k));
%%%%%%%改进算法
disp('使用改进算法识别结果为:')
B=mean([Aa' Ah' As' Ea' Eh' Es' Fa' Fh' Fs' Za' Zh' Zs']);
A=reshape(B,3,4);
O=reshape([Aa Ah As],30,3);
for i=1:3
for j=1:30
OO(j,i)=(abs(O(j,i)-A(i,1))/A(i,1))^2;
end
end
O=sqrt(sum(OO));
P=reshape([Ea Eh Es],30,3);
for i=1:3
for j=1:30
PP(j,i)=(abs(P(j,i)-A(i,2))/A(i,2))^2;
end
end
P=sqrt(sum(PP));
Q=reshape([Fa Fh Fs],30,3);
for i=1:3
for j=1:30
QQ(j,i)=(abs(Q(j,i)-A(i,3))/A(i,3))^2;
end
end
Q=sqrt(sum(QQ));
R=reshape([Za Zh Zs],30,3);
for i=1:3
for j=1:30
RR(j,i)=(abs(R(j,i)-A(i,4))/A(i,4))^2;
end
end
R=sqrt(mean(RR));
X=[O' P' Q' R'];
for i=1:3
for j=1:4
V(i,j)=(sum(X(i,:))-X(i,j))/sum(X(i,:));
end
function [str]=judge(A,H,S,k)
f=[A H S]; %将欧距三个个矩阵合并
g=[A H];
d=numel(f);
c=[1:d]; %用来存放排序后的欧距
c=lowtohigh(f,d);
num1=0; %用来记录被判x类的次数
num2=0; %用来记录被判y类的次数
num3=0;
for i=1:k
for j=1:d
if (c(i)==f(j))
if j<=numel(A) %如果选中的欧距出自x类
num1=num1+1;
elseif j>numel(g) %如果选中的欧距出自y类
num3=num3+1;
else
num2=num2+1;
end
end
j=j+1;
end
i=i+1;
end
if(num1>num2&num1>num3)
w=0;
elseif(num2>num1&num2>num3)
w=1;
elseif(num3>num1&num3>num2)
w=2;
end
end
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.