论文总字数:5429字
本次毕业设计中,我对基于K近邻的语音情感识别系统做了研究,并对传统算法进行了一定程度上的改进,下面时我的实验结果以及matlab程序代码
传统K近邻法识别结果
愤怒 | 高兴 | 悲伤 | 识别率 | |
愤怒 | 25 | 5 | 0 | 83.3% |
高兴 | 6 | 23 | 1 | 76.7% |
悲伤 | 1 | 1 | 28 | 93.3% |
改进算法识别结果
愤怒 | 高兴 | 悲伤 | 识别率 | |
愤怒 | 26 | 4 | 0 | 86.7% |
高兴 | 5 | 25 | 0 | 83.3% |
悲伤 | 1 | 1 | 28 | 93.3% |
从实验结果上看,我们能够发现两种辨别方式的识别正确率都比较高。其中悲伤的识别效果最好,主要原因是这种情感的特征较其他两种要更为明显,相比之下有较低基音频率,短时过零率也较低。而高兴和愤怒两种情感由于都有较高的能量和基频特性,所以在识别上会出现一定的误判。
对比两种方法不难看出,改进后的K近邻法较传统算法而言,辨识率有了一定程度的增加。主要原因是改进算法在计算欧式距离时充分考虑了各个参数之间的权重比例,使得识别效果更加突出。
附录
主函数:
close all
clc;
[y,fs]=wavread('D:\下载\recognition\愤怒\31.wav');
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);
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
end
V1=V';
Va=[V1(1) V1(2) V1(3) V1(4)];
Vh=[V1(5) V1(6) V1(7) V1(8)];
Vs=[V1(9) V1(10) V1(11) V1(12)];
A2=oushi2(a,x,Va);
H2=oushi2(h,x,Vh);
S2=oushi2(s,x,Vs);
judge(A2,H2,S2,k);
figure(4);
plot(Aa,'.r');hold on;
plot(Ah,'*b');hold on;
plot(As,'xk');grid on;
xlabel('样本数');
title('三种情感样本的短时平均幅值');
legend('愤怒','高兴','悲伤');
figure(5);
plot(Ea,'.r');hold on;
plot(Eh,'*b');hold on;
plot(Es,'xk');grid on;
xlabel('样本数');
title('三种情感样本的短时平均能量');
legend('愤怒','高兴','悲伤');
figure(6);
plot(Fa,'.r');hold on;
plot(Fh,'*b');hold on;
plot(Fs,'xk');grid on;
xlabel('样本数');
title('三种情感样本的基频均值');
legend('愤怒','高兴','悲伤');
figure(7);
plot(Za,'.r');hold on;
plot(Zh,'*b');hold on;
plot(Zs,'xk');grid on;
xlabel('样本数');
title('三种情感样本的短时平均过零率');
legend('愤怒','高兴','悲伤');
基频提取函数:
function z=FunFre(y,fs)
nn=512;
m=nn/2;
m=m-mod(m,1);%%% m是重叠数,即帧移
x=buffer(y,nn,m);
siz=size(y)/nn 1;
siz=siz-mod(siz,1); %%siz是帧数
N=2048;
R=4;
for i=1:siz
k = 1:R:N/2; K = length(k); %%N是FFT变换点数,R是乘的次数,f是采样频率
X = fft (x(:,i).*hann(length(x)), N); %%%%汉宁窗,
X=abs(X); %%%%对X做绝对值,取到幅度
HPSx = X(k);
for r= R-1:-1:1
HPSx = HPSx.*X (1:r:r*K);
end
[Y,I]=max(HPSx); %%%%取最大值点,Y是幅度值,I是对应下标
z(i)=I/N*fs;
end
figure(3);
plot(z,'.r');grid on;
xlabel('帧数');
title('基频特征');
短时能量,幅度,过零率提取函数:
function[A,E,Z] =TimePara(y)
y_length=length(y); %声音信号的长度
Ny=512; %短时帧长
frame_all=floor((y_length-(Ny/2))/(Ny/2));
y2_sound=y(1:(frame_all 1)*(Ny/2));
y3=reshape(y2_sound,(Ny/2),[]);
y4=[y3(:,1:frame_all);y3(:,2:(frame_all 1))];
%%%%%%加hamming窗
win_h=hamming(Ny); %win_y=y_sound.*win_h;
for i=1:(frame_all)
A_y(i)=sum(abs(y4(:,i).*win_h)); %计算短时幅值
E_y(i)=sum((y4(:,i).*win_h).*(y4(:,i).*win_h)); %计算短时能量
Z_y(i)=sum(abs(sign(y4(2:80,i))-sign(y4(1:79,i))))/2; %计算短时过零率
end
A=mean(A_y);
E=mean(E_y);
Z=mean(Z_y);
figure(1);
plot(y);grid on;
xlabel('样本数');
title('语音信号时域波形');
figure(2);
plot(A_y,'*r');hold on;
plot(Z_y,'^g');hold on;
plot(E_y,'sb');grid on;
xlabel('帧数');
title('短时幅值,过零率,能量');
legend('幅值','过零率','能量');
欧式距离计算函数
function c=oushi(a,a1);
剩余内容已隐藏,请支付后下载全文,论文总字数:5429字
该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;