annotate try_eventdetection.m @ 1:3ea8ed09af0f tip

additional clarifications
author Dimitrios Giannoulis
date Wed, 13 Mar 2013 11:57:24 +0000
parents 22b10c5b72e8
children
rev   line source
Dimitrios@0 1 function [] = try_eventdetection(inputFile,outputFile)
Dimitrios@0 2 % Perform event detection and produce collective results
Dimitrios@0 3 % for all different configurations
Dimitrios@0 4
Dimitrios@0 5 % Suggested name for outputFile: 'Outputs_(sid/bdm)/XX/scriptXX.txt'
Dimitrios@0 6
Dimitrios@0 7 % This script assumes that the system outputs are text files saved in a
Dimitrios@0 8 % preexisting folder "Outputs_<annotator>" and their names are of the form:
Dimitrios@0 9 % 'Outputs_(bdm/sid)/XX/scriptXX<...>.txt
Dimitrios@0 10 % where <...> is: _Bases_X-XX_thres_XXXX_filt_X
Dimitrios@0 11
Dimitrios@0 12 % All possible runs:
Dimitrios@0 13 %{
Dimitrios@0 14 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_sid/01/script01.txt');
Dimitrios@0 15 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_sid/02/script02.txt');
Dimitrios@0 16 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_sid/03/script03.txt');
Dimitrios@0 17 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_bdm/01/script01.txt');
Dimitrios@0 18 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_bdm/02/script02.txt');
Dimitrios@0 19 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_bdm/03/script03.txt');
Dimitrios@0 20 %}
Dimitrios@0 21
Dimitrios@0 22 % If normalised use thresholds: [200:50:900] and let line 53 on
Dimitrios@0 23 % If unnormalised use thresholds: [0:0.1:2.4] and comment out line 53
Dimitrios@0 24
Dimitrios@0 25 %Choose Annotation
Dimitrios@0 26 Annotators = {'_bdm', '_sid'};
Dimitrios@0 27 if isequal(outputFile(8:11),Annotators{1})
Dimitrios@0 28 ANOT_FLAG = 1;
Dimitrios@0 29 elseif isequal(outputFile(8:11),Annotators{2})
Dimitrios@0 30 ANOT_FLAG = 2;
Dimitrios@0 31 else
Dimitrios@0 32 error('Incorrect outputFile, please see description again.');
Dimitrios@0 33 end
Dimitrios@0 34
Dimitrios@0 35
Dimitrios@0 36 % Different Combinations
Dimitrios@0 37 AllnumBases = [ 5 8 10 12 15 20 20]; % Last number(20) corresponds to Dict20individual
Dimitrios@0 38 AllFiltering = [ 1 3 5 ];
Dimitrios@0 39 AllThres = [200:50:900];
Dimitrios@0 40
Dimitrios@0 41 for i = 1 : length(AllnumBases)
Dimitrios@0 42 % Initialize
Dimitrios@0 43 if (i == length(AllnumBases))
Dimitrios@0 44 loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict20individual' '.mat'];
Dimitrios@0 45 else
Dimitrios@0 46 loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict' num2str(AllnumBases(i)) '.mat'];
Dimitrios@0 47 end
Dimitrios@0 48 load(loadfile);
Dimitrios@0 49 Classes = {'alert','clearthroat','cough','doorslam','drawer','keyboard','keyes',...
Dimitrios@0 50 'knock','laughter','mouse','pageturn','pendrop','phone','printer',...
Dimitrios@0 51 'speech','switch'};
Dimitrios@0 52
Dimitrios@0 53
Dimitrios@0 54 % Read the audio for the Event, making sure no overflow occurs
Dimitrios@0 55 [x,fs] = wavread(inputFile);
Dimitrios@0 56
Dimitrios@0 57
Dimitrios@0 58 % Normalize wav files
Dimitrios@0 59 xnow = sum(x,2)/2;
Dimitrios@0 60 % If choosing not to normalize, the thershold parameter above has to be
Dimitrios@0 61 % adjusted: i.e. [0:0.1:2.2];
Dimitrios@0 62 xnow = xnow./std(xnow);
Dimitrios@0 63
Dimitrios@0 64
Dimitrios@0 65 % Calculate CQT
Dimitrios@0 66 [intCQT] = computeCQT(xnow);
Dimitrios@0 67 cqt_rep = intCQT(:,round(1:7.1128:size(intCQT,2)));
Dimitrios@0 68
Dimitrios@0 69
Dimitrios@0 70 % Perform NMF
Dimitrios@0 71 [W,H,errs,vout] = nmf_beta(cqt_rep,size(Dict,2),'beta',1,'W',Dict,'W0',Dict);
Dimitrios@0 72
Dimitrios@0 73
Dimitrios@0 74 % Reshape H
Dimitrios@0 75 Hnew = reshape(H,AllnumBases(i),16,size(H,2));
Dimitrios@0 76 Hnew2 = squeeze(sum(Hnew,1));
Dimitrios@0 77
Dimitrios@0 78 for j = 1 : length(AllThres)
Dimitrios@0 79 for k = 1 : length(AllFiltering)
Dimitrios@0 80 % Perform thresolding on Hnew2
Dimitrios@0 81 thr = AllThres(j);
Dimitrios@0 82 Hnew2 = medfilt1(Hnew2',AllFiltering(k))';
Dimitrios@0 83 eventRoll = double(Hnew2 > thr);
Dimitrios@0 84
Dimitrios@0 85
Dimitrios@0 86 % Create matrix of events (onset-offset-classNum)
Dimitrios@0 87 auxEventRoll = diff([zeros(1,16); eventRoll'; zeros(1,16);],1); p=0;
Dimitrios@0 88 nmat=[];
Dimitrios@0 89 for m=1:16
Dimitrios@0 90 onsets = find(auxEventRoll(:,m)==1);
Dimitrios@0 91 offsets = find(auxEventRoll(:,m)==-1);
Dimitrios@0 92 for n=1:length(onsets)
Dimitrios@0 93 if((offsets(n)/100-0.01) - (onsets(n)/100) > 0.05) % not output really short events
Dimitrios@0 94 p=p+1;
Dimitrios@0 95 nmat(p,1) = onsets(n)/100;
Dimitrios@0 96 nmat(p,2) = offsets(n)/100-0.01;
Dimitrios@0 97 nmat(p,3) = m;
Dimitrios@0 98 end;
Dimitrios@0 99 end;
Dimitrios@0 100 end;
Dimitrios@0 101 nmat = sortrows(nmat,1);
Dimitrios@0 102
Dimitrios@0 103
Dimitrios@0 104 % Print output
Dimitrios@0 105 if (i == length(AllnumBases))
Dimitrios@0 106 outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ...
Dimitrios@0 107 'individual_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
Dimitrios@0 108 else
Dimitrios@0 109 outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ...
Dimitrios@0 110 '_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
Dimitrios@0 111 end
Dimitrios@0 112 fid=fopen(outputFileName,'w');
Dimitrios@0 113 for m=1:size(nmat,1)
Dimitrios@0 114 fprintf(fid,'%.2f\t%.2f\t%s\n',nmat(m,1),nmat(m,2),Classes{nmat(m,3)});
Dimitrios@0 115 end;
Dimitrios@0 116 fclose(fid);
Dimitrios@0 117
Dimitrios@0 118 end
Dimitrios@0 119 end
Dimitrios@0 120
Dimitrios@0 121 end
Dimitrios@0 122