view try_eventdetection.m @ 1:3ea8ed09af0f tip

additional clarifications
author Dimitrios Giannoulis
date Wed, 13 Mar 2013 11:57:24 +0000
parents 22b10c5b72e8
children
line wrap: on
line source
function [] = try_eventdetection(inputFile,outputFile)
% Perform event detection and produce collective results
% for all different configurations

% Suggested name for outputFile: 'Outputs_(sid/bdm)/XX/scriptXX.txt'

% This script assumes that the system outputs are text files saved in a 
% preexisting folder "Outputs_<annotator>" and their names are of the form:
% 'Outputs_(bdm/sid)/XX/scriptXX<...>.txt
% where <...> is: _Bases_X-XX_thres_XXXX_filt_X

% All possible runs:
%{
 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_sid/01/script01.txt');
 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_sid/02/script02.txt');
 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_sid/03/script03.txt');
 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_bdm/01/script01.txt');
 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_bdm/02/script02.txt');
 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_bdm/03/script03.txt');
%}

% If normalised use thresholds: [200:50:900] and let line 53 on
% If unnormalised use thresholds: [0:0.1:2.4] and comment out line 53

%Choose Annotation
Annotators = {'_bdm', '_sid'};
if isequal(outputFile(8:11),Annotators{1})
ANOT_FLAG = 1;
elseif isequal(outputFile(8:11),Annotators{2})
ANOT_FLAG = 2;
else
    error('Incorrect outputFile, please see description again.');
end


% Different Combinations
AllnumBases = [ 5 8 10 12 15 20 20]; % Last number(20) corresponds to Dict20individual
AllFiltering = [ 1 3 5 ];
AllThres = [200:50:900];  

for i = 1 : length(AllnumBases)
    % Initialize
    if (i == length(AllnumBases))
        loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict20individual' '.mat'];
    else
        loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict' num2str(AllnumBases(i)) '.mat'];
    end
    load(loadfile);
    Classes = {'alert','clearthroat','cough','doorslam','drawer','keyboard','keyes',...
        'knock','laughter','mouse','pageturn','pendrop','phone','printer',...
        'speech','switch'};
    
    
    % Read the audio for the Event, making sure no overflow occurs
    [x,fs] = wavread(inputFile);
    
    
    % Normalize wav files
    xnow = sum(x,2)/2;
    % If choosing not to normalize, the thershold parameter above has to be
    % adjusted: i.e. [0:0.1:2.2];
    xnow = xnow./std(xnow); 
    
    
    % Calculate CQT
    [intCQT] = computeCQT(xnow);
    cqt_rep = intCQT(:,round(1:7.1128:size(intCQT,2)));
    
    
    % Perform NMF
    [W,H,errs,vout] = nmf_beta(cqt_rep,size(Dict,2),'beta',1,'W',Dict,'W0',Dict);
    
    
    % Reshape H
    Hnew = reshape(H,AllnumBases(i),16,size(H,2));
    Hnew2 = squeeze(sum(Hnew,1));
    
    for j = 1 : length(AllThres)
        for k = 1 : length(AllFiltering)
            % Perform thresolding on Hnew2
            thr = AllThres(j);
            Hnew2 = medfilt1(Hnew2',AllFiltering(k))';
            eventRoll = double(Hnew2 > thr);
            
            
            % Create matrix of events (onset-offset-classNum)
            auxEventRoll = diff([zeros(1,16); eventRoll'; zeros(1,16);],1); p=0;
            nmat=[];
            for m=1:16
                onsets = find(auxEventRoll(:,m)==1);
                offsets = find(auxEventRoll(:,m)==-1);
                for n=1:length(onsets)
                    if((offsets(n)/100-0.01) - (onsets(n)/100) > 0.05) % not output really short events
                        p=p+1;
                        nmat(p,1) = onsets(n)/100;
                        nmat(p,2) = offsets(n)/100-0.01;
                        nmat(p,3) = m;
                    end;
                end;
            end;
            nmat = sortrows(nmat,1);
            
            
            % Print output
            if (i == length(AllnumBases))
            	outputFileName = [outputFile(1:end-4) '_Bases_'  num2str(AllnumBases(i)) ...
                'individual_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
            else
                outputFileName = [outputFile(1:end-4) '_Bases_'  num2str(AllnumBases(i)) ...
                '_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
            end	    
            fid=fopen(outputFileName,'w');
            for m=1:size(nmat,1)
                fprintf(fid,'%.2f\t%.2f\t%s\n',nmat(m,1),nmat(m,2),Classes{nmat(m,3)});
            end;
            fclose(fid);
            
        end
    end
    
end