function [locksig, pitch_th, mag_th] = makelock(sig1,sig2,sig3,sig4,sig5)
%
% [locksignal,pitch_thresh,mag_thresh] = makelock(sig1,sig2,sig3,sig4,sig5)
%
% makelock - Takes in 5 signals of the same person and returns one of the 5
% to be used as the "key" (the one that matches best with the others) and it
% also returns thresholds for pitch and magnitude to be used when matching
% signals. The thresholds are capped at a 95% match.
%
% ELEC 301 Project - "Mars Lander the Theologian", aka, "Speaker Verification"
% Sara MacAlpine, Aamir Virani, Nipul Bharani, JP Slavinsky
% WRC (OCEE) Class of 2001 - Fall '99
% Make a signal vector for easy reference
sig = [ sig1 sig2 sig3 sig4 sig5 ];
% Possible pairs of signals to evaluate
grid = [ 1 1 1 1 2 2 2 3 3 4;
2 3 4 5 3 4 5 4 5 5];
% Generate all possible pairwise correlations for pitch and magnitude
for i = 1:10,
pitchcorr(i) = pitchmaster(sig(:,grid(1,i)),sig(:,grid(2,i)));
magcorr(i) = magmaster(sig(:,grid(1,i)),sig(:,grid(2,i)));
end
% Develop Thresholds
pitch_th = findthreshold(pitchcorr);
mag_th = findthreshold(magcorr);
% Pick key signal
locksig = sig(:,findlocksig(pitchcorr,magcorr,grid));
%--------------------------------------%
function key_index = findlocksig(pcorr,mcorr,grid)
% Put correlation for each signal into a matrix where each column
% corresponds to all matches with that signal (col 2 = sig2)
for i = 1:5,
elements = (grid(1,:) == i | grid(2,:) == i);
mcorrmat(:,i) = mcorr(elements)';
pcorrmat(:,i) = pcorr(elements)';
end
% Column-wise averages
mavgs = mean(mcorrmat);
pavgs = mean(pcorrmat);
% 2x5 matrix of each signals mag and pitch averages
all_avgs = [mavgs; pavgs];
% Averages of each signals mag and pitch averages
avgs_of_avgs = mean(all_avgs);
% Find the index of the biggest of these averages -- represents the signal
% that matches best (on average) with the others.
[big_val, big_index] = max(avgs_of_avgs);
% Return this index
key_index = big_index;
%--------------------------------------%
function th = findthreshold(corr)
% Remove matches below .9 = 90% in order to make lock harder to pick.
corr = corr(corr>.9);
% Compute mean and standard deviation of the correlations
avg = mean(corr);
dev = std(corr);
% Produce a threshold that's a little less than the mean
th = avg-dev;
% If threshold is above 95%, we'll cap it down to 95%
if th > .95
th = .95;
end