%% Project of EEL6586 --- LPC clear; %close all; trainData = load('trainTemplate.mat'); trainNames = fieldnames(trainData); N = 10; windowSize = 200; overlap = 100; hamWindow = 0.54 - 0.46*cos(2*pi*(0:windowSize-1)/windowSize); for s = 1 : length(trainNames) %% s is the number of sentences / instructions name = trainNames{s}; data = getfield(trainData,name); figure(s); %% noise reduction for m = 1 : size(data,1) %% m is number of training data for each sentence %% pre-emphasis preData(m,:) = filter([1 -.97], 1, data(m,:)); drvData(m,:) = conv2(preData(m,:), [0.333 0.666 0 -0.666 -0.333], 'same'); winData(m,:) = wiener2(drvData(m,:)); %% use end-point to delete silence Qs = filter(hamWindow,1, winData(m,:).* winData(m,:)*100); [dfoo, rang] = find(Qs >= 0.005); if rang(301) - rang(1) == 300 rang1 = rang(1); else mm = 1; while rang(mm+1) - rang(mm) ==1 & rang(mm+300) - rang(mm) >300 mm=mm+1; end rang1 = rang(mm+300); end if rang(length(rang)) - rang(length(rang)-300) == 300; rang2 = rang(length(rang)); else mm = 0; while rang(length(rang)-mm) - rang(length(rang)-mm-1) ==1 & rang(length(rang)-mm) - rang(length(rang)-mm-300) > 300 mm = mm + 1; end rang2 = rang(length(rang)-mm-1); end trunkData = winData(m,rang1 : rang2); %% add windows to each training data and calculate LPC for each window %LPCtemp = []; LPCtemp = zeros(250,11); for n = 1 : (windowSize-overlap) : floor(length(trunkData) / windowSize-1) * windowSize windowed = trunkData(n : n + windowSize - 1); windowed = windowed .* hamWindow; LPCtemp((n-1) / (windowSize-overlap) + 1,:) = real(lpc(windowed, N)); end LPCtemp(:,1) = []; Qlpc = []; Qlpc(:,1) = filter(hamming(10), 1, LPCtemp(:,3)); %Qlpc(:,1) = sign(Qlpc(:,1)-10)+1; Qlpc(:,2) = filter(hamming(10), 1, LPCtemp(:,4)); %Qlpc(:,2) = sign(Qlpc(:,2)-10)+10; %sumlpc(s,m) = sum(Qlpc(:,2)); %% calculate autocorrelation of each training data's LPC coeff. %R = LPCtemp * LPCtemp'; %for k = 1 : N %% k represents # of LPC autocorrelation % r(s,m,k) = trace(R); % R(1,:) = []; % R(:,N-k+1) = []; %end %subplot(5,6,m); lpc_vector(s,m,:) = LPCtemp(:,4); %plot(LPCtemp(:,3:4)); %hold on; %plot(Qlpc,'k'); %axis tight; %r(s,m,:) = sum (LPCtemp(:,3:4))/ size(LPCtemp,1); end % aMiddle(s,:) = mean(squeeze(r(s,:,:))); % aLeft(s,:) = min(squeeze(r(s,:,:))); % aRight(s,:) = max(squeeze(r(s,:,:))); end %% test each training data %for s = 1 : size(r,1) % for m = 1 : size(r,2) % for ss = 1 : size(aMiddle,1) % for k = 1 : size(r,3) % if r(s,m,k) <= aMiddle(ss,k) & r(s,m,k) >= aLeft(ss,k) % b(ss,k) = (r(s,m,k) - aLeft(ss,k)) / ... % (aMiddle(ss,k) - aLeft(ss,k)) * 0.2 + 0.8; % elseif r(s,m,k) > aMiddle(ss,k) & r(s,m,k) <=aRight(ss,k) % b(ss,k) = (aRight(ss,k) - r(s,m,k)) / ... % (aRight(ss,k) - aMiddle(ss,k)) * 0.2 + 0.8; % else b(ss,k) = 0; % end % end % end % B = sum(b,2); % [foo1,foo2] = max(B); % trainingResult(s,m) = foo2; % end %end %for s = 1 : size(lpc_vector,1) %% =6 % for m = 1 : size(lpc_vector,2) %% =30 % for ss = 1 : size(lpc_vector,1) %% =6 % R = squeeze(lpc_vector(s,m,:))' * squeeze(lpc_vector(ss,:,:))'; %if s == ss R(m) = 0; end %r(ss) = max(R); %if s == ss % r(ss) = sum(R)/29; %else % r(ss) = mean(R); % end % [foo(s,m) result(s,m)] = max(r); % end %end %sum_xcorr = 0; for s = 1 : 6 for m = 1:30 for ss = 1:6 for mm = 1:30 R = xcorr(squeeze(lpc_vector(s,m,:)),squeeze(lpc_vector(ss,mm,:))); [max1 index] = max(R); max2 = max(R(index+15:499)); max3 = max(R(1:index-15)); if max2>max3 difference(mm) = max1 - max2; else difference(mm) = max1 - max3; end %sum_xcorr = sum_xcorr + diff; end pp(ss) = sum(difference); %sum_xcorr = 0; end [foo(s,m) result(s,m)] = max(pp); end end