Mercurial > hg > camir-aes2014
diff core/magnatagatune/DistMeasureNNet.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/magnatagatune/DistMeasureNNet.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,179 @@ +% --- +% The DistMeasureMahal class states a wrapper for +% special Mahalanobis similarity distance, and is compatible with the +% DistMeasure class +% --- +classdef DistMeasureNNet < handle + + properties (SetAccess = private) + + net; + + featX; + + ids; + ret_ids; + end + + methods + + % --- + % constructor + % --- + function m = DistMeasureNNet(clips, net, featX) + + if size(featX, 2) ~= numel(clips) + error 'wrong input format' + end + + % fill index and generate matrix; + m.ids = [clips.id]; + + % reverse index + m.ret_ids = sparse(numel(m.ids),1); + m.ret_ids(m.ids) = 1:numel(m.ids); + + % --- + % save neural net and lazy-copy features + % --- + m.net = net; + + m.featX = featX; + + end + + + % --- + % this function returns the + % similarity of two clip indices + % --- + function out = mat(m, idxa, idxb) + + if nargin == 1 + idxa = 1:numel(m.ids); + idxb = 1:numel(m.ids); + end + + % cycle through all index combinations + out = zeros(numel(idxa), numel(idxb)); + for i = 1:numel(idxa) + for j = 1:numel(idxb) + + % calculate distance vector + deltas = m.featX(:,idxa(i)) - m.featX(:,idxb(j)); + + % return distance from net + out(i,j) = m.net.calcValue(deltas); + end + end + + end + + % --- + % returns the distance for the two input clips + % --- + function out = distance(m, clipa, clipb) + posa = m.get_clip_pos(clipa); + posb = m.get_clip_pos(clipb); + + out = m.mat(posa, posb); + end + + % --- + % returns a list of n (default = 10) clips most + % similar to the input + % --- + function [clips, dist] = get_nearest(m, clip, n) + % list = get_nearest(m, clip, n) + % + % returns a list of n (default = 10) clips most + % similar to the input + + % default number of results + if nargin == 2 + + n = 10; + end + + % return all clips in case n = 0 + if n == 0; n = numel(m.ids); end + + % get clip positions + pos = m.get_clip_pos(clip); + + % sort according to distance + [sc, idx] = sort( m.mat(pos, 1:numel(m.ids)), 'ascend'); + + % we only output relevant data + idx = idx(sc < inf); + + if numel(idx) > 0 + % create clips form best ids + clips = MTTClip( m.ids( idx(1:min(n, end)))); + dist = m.mat(pos, idx(1:min(n, end))); + + else + clips = []; + dist = []; + end + end + + + + function [clips, dist] = present_nearest(m, clip, n) + % plays and shows the n best hits for a given clip + + % default number of results + if nargin == 2 + + n = 3; + end + + % get best list + [clips, dist] = get_nearest(m, clip, n); + + clip.audio_features_basicsm.visualise(); + for i = 1:numel(clips) + fprintf('\n\n\n- Rank %d, distance: %1.4f \n\n',i, dist(i)); + + clips(i).audio_features_basicsm.visualise(); + h = gcf(); + t = clips(i).play(20); + pause(t); + close(h); + end + end + + function a = visualise(m) + + figure; + + % plot data + + imagesc(m.mat); + + a = gca; + set(a,'YTick',[1:numel(m.ids)], 'YTickLabel',m.ids); + set(a,'XTick',[1:numel(m.ids)], 'XTickLabel', m.ids); + + axis xy; + colormap(hot); + end + + % end methods + end + + % --- + % private methods + % --- + methods(Access = private) + + function out = get_clip_pos(m, clip) + % returns position in mat for given clip + + out = m.ret_ids(clip.id); + end + + end + +end \ No newline at end of file