Code covered by the BSD License  

Highlights from
Robust Landmark-Based Audio Fingerprinting

image thumbnail
from Robust Landmark-Based Audio Fingerprinting by Dan Ellis
A landmark-based Shazam-like audio fingerprinting system.

match_query(D,SR)
function [R,L] = match_query(D,SR)
% [R,L] = match_query(D,SR)
%     Match landmarks from an audio query against the database.
%     Rows of R are potential maxes, in format
%      songID  modalDTcount modalDT
%     i.e. there were <modalDTcount> occurrences of hashes 
%     that occurred in the query and reference with a difference of 
%     <modalDT> frames.
%     L returns the actual landmarks that this implies.
% 2008-12-29 Dan Ellis dpwe@ee.columbia.edu

%Rt = get_hash_hits(landmark2hash(find_landmarks(D,SR)));
Lq = find_landmarks(D,SR);
%Lq = fuzzify_landmarks(Lq);
% Augment with landmarks calculated half-a-window advanced too
landmarks_hopt = 0.032;
%Lq = [Lq;find_landmarks(D(round(landmarks_hopt/4*SR):end),SR)];
Lq = [Lq;find_landmarks(D(round(landmarks_hopt/2*SR):end),SR)];
%Lq = [Lq;find_landmarks(D(round(3*landmarks_hopt/4*SR):end),SR)];
% add in quarter-hop offsets too for even better recall

Hq = landmark2hash(Lq);
Rt = get_hash_hits(Hq);
nr = size(Rt,1);

if nr > 0

  % Find all the unique tracks referenced
  [utrks,xx] = unique(sort(Rt(:,1)));
  utrkcounts = diff(xx,nr);

  nutrks = length(utrks);

  R = zeros(nutrks,3);

  for i = 1:nutrks
    tkR = Rt(Rt(:,1)==utrks(i),:);
    % Find the most popular time offset
    [dts,xx] = unique(sort(tkR(:,2)),'first');
    dtcounts = 1+diff([xx',size(tkR,1)]);
    [vv,xx] = max(dtcounts);
    R(i,:) = [utrks(i),vv,dts(xx)];
  end

  % Sort by descending match count
  [vv,xx] = sort(R(:,2),'descend');
  R = R(xx,:);

  % Extract the actual landmarks
  H = Rt((Rt(:,1)==R(1,1)) & (Rt(:,2)==R(1,3)),:);
  % Restore the original times
  for i = 1:size(H,1)
    hix = find(Hq(:,3)==H(i,3));
    hix = hix(1);  % if more than one...
    H(i,2) = H(i,2)+Hq(hix,2);
    L(i,:) = hash2landmark(H(i,:));
  end


  % Return no more than 10 hits, and only down to half the #hits in
  % most popular
  if size(R,1) > 10
    R = R(1:10,:);
  end
  maxhits = R(1,2);
  nuffhits = R(:,2)>(maxhits/2);
  %R = R(nuffhits,:);

else
  R = [];
  disp('*** NO HITS FOUND ***');
end

Contact us at files@mathworks.com