%测试代码,以两次为例进行测试
clc,clear,close all,warning off,feature jit off
tic
disp('Calculating reference template parameters~~~')
% Rt = 0; %准确率参数
formatSpec1 = 'H:\\DSP\\sound2\\a_%d\\strawberry_%d.wav';
formatSpec2 = 'H:\\DSP\\sound2\\strawberry%d.wav';
% global constlen
global Num
count = 0; %计算匹配成功率用
Num = 17;
FrameInc = 80; %帧移为80
for i = 1:Num
ref(i).mfcc = Fofeveryone(i);
end
%第一个人第一次的语音长度
% fname1 = sprintf(formatSpec1,1,1);
% [x,Fs] = audioread(fname1); % Fs = 48000
% x = x(:,1);
% [x1, x2] = vad(x);
% count = x2-x1;
% constlen = sum(count(:)); %所有元素个数
% y = [];
% for i=1:length(x1)
% y = [y; x(x1(i)*FrameInc +1 :x2(i)*FrameInc)];
% end
% m = mfcc(y);
% ref(1).mfcc = m;
% %第一个人后9次的语音
% for Qt=2:10
% fname1 = sprintf(formatSpec1,1,Qt);
% x = audioread(fname1);
% x = x(:,1);
% %figure()
% [x1, x2] = vad(x);
% count = x2-x1;
% count1 = sum(count(:));
% y = [];
% for i=1:length(x1)
% y = [y; x(x1(i)*FrameInc+1:x2(i)*FrameInc)]; %存在1的差距
% end
% x = resample(y,constlen,count1); % 除法运算存在误差(不能除尽的bug)
% if length(x) > constlen*FrameInc %消除误差
% x(length(x))=[];
% end
% if length(x) < constlen*FrameInc
% x(length(x)+1)=x(length(x));
% end
% m = mfcc(x);
% %m = m(x1-2:x2-2,:);
% ref(1).mfcc = ref(1).mfcc+m;
% end
% ref(1).mfcc = ref(1).mfcc/10;
%后四个人的语音信号
% for i=2:2 %五个人
%
% for Qt=1:10 %次数
% fname1 = sprintf(formatSpec1,i,Qt);
% x = audioread(fname1);
% x = x(:,1);
% %figure()
% [x1, x2] = vad(x);
% count = x2-x1;
% count1 = sum(count(:));
% y = [];
% for j=1:length(x1) %此处不能使用i,不然导致ref(i)超出矩阵维度
% y = [y; x(x1(j)*FrameInc +1 :x2(j)*FrameInc)];
% end
% x = resample(y,constlen,count1);
%
% if length(x) > constlen*FrameInc
% x(length(x))=[];
% end
% if length(x) < constlen*FrameInc
% x(length(x)+1)=x(length(x));
% end
%
% m = mfcc(x);
% %m = m(x1-2:x2-2,:);
% if Qt==1
% ref(i).mfcc = m;
% else
% ref(i).mfcc = ref(i).mfcc+m; %报错,错误使用 + 矩阵维度必须一致。 结构体了解一下
%
% end
% end
% ref(i).mfcc = ref(i).mfcc/10; %五个人各自的特征向量
% end
disp('Calculating test template parameters~~~')
for j=1:Num
test(j).mfcc = tFofeveryone( j );
end
% disp('正在进行模板匹配...')
% dist = zeros(Num,1);
% for i=1:Num
% for j=1:Num
% % dist(i,j) = dtw2(test(j).mfcc, ref(i).mfcc);
% % dist(i,j) = disteu(test(i).mfcc, ref(j).mfcc);
% temp = abs(test(i).mfcc-ref(j).mfcc);
% dist(i,j) = sum(temp(:));
% end
% end
% disp('正在计算匹配结果...')
% for j=1:Num
% [M,i] = min(dist(:,j)); %查找在第几行i
% if i == j
% i
% count = count+1;
% end
% end
% fprintf('测试模板的识别成功率为:%d\n', (count/Num));
for k = 1:Num % read test sound file of each speaker
distmin = inf;
k1 = 0;
for l = 1:Num % each trained codebook, compute distortion计算其与每一个码本的距离(失真度)
d = disteu(test(k).mfcc, ref(l).mfcc);
dist = sum(min(d,[],2)) / size(d,1);
if dist < distmin
distmin = dist;
k1 = l;
end
end
if k == k1
count = count + 1;
msg = sprintf('Speaker %d matches with speaker %d--------Successful identification', k, k1);
else
msg = sprintf('Speaker %d matches with speaker %d--------failed',k,k1);
end
disp(msg);
end
msg = sprintf('识别率:%d',count/Num);
disp(msg);
toc