annotate testdata/evaluation/computeNoteLevelAccuracy.m @ 116:91bb029a847a
timing
Reorder the calculations to match the series of vector operations in the most recent bqvec code, just in case it's the order of vector calculations that is saving the time rather than the avoidance of std::vector
author |
Chris Cannam |
date |
Wed, 07 May 2014 09:57:19 +0100 |
parents |
ce64d11ef336 |
children |
|
rev |
line source |
emmanouil@71
|
1 function [Pre,Rec,F,Acc,PreOff,RecOff,FOff,AccOff] = computeNoteLevelAccuracy(nmat1,nmat2)
|
emmanouil@71
|
2
|
emmanouil@71
|
3 % Compute note-level onset-only and onset-offset accuracy (Bay09)
|
emmanouil@71
|
4
|
emmanouil@71
|
5
|
emmanouil@71
|
6 % Initialize
|
emmanouil@71
|
7 if (isempty(nmat1)) Pre=0; Rec=0; F=0; Acc=0; return; end;
|
emmanouil@71
|
8
|
emmanouil@71
|
9 % Total number of transcribed notes
|
emmanouil@71
|
10 Ntot = size(nmat1,1);
|
emmanouil@71
|
11
|
emmanouil@71
|
12 % Number of reference notes
|
emmanouil@71
|
13 Nref = size(nmat2,1);
|
emmanouil@71
|
14
|
emmanouil@71
|
15 % Number of correctly transcribed notes, onset within a +/-50 ms range
|
emmanouil@71
|
16 Ncorr = 0;
|
emmanouil@71
|
17 NcorrOff = 0;
|
emmanouil@71
|
18 for j=1:size(nmat2,1)
|
emmanouil@71
|
19 for i=1:size(nmat1,1)
|
emmanouil@71
|
20 if( (nmat1(i,3) == nmat2(j,3)) && (abs(nmat2(j,1)-nmat1(i,1))<=0.05) )
|
emmanouil@71
|
21 Ncorr = Ncorr+1;
|
emmanouil@71
|
22
|
emmanouil@71
|
23 % If offset within a +/-50 ms range or within 20% of ground-truth note's duration
|
emmanouil@71
|
24 if abs(nmat2(j,2) - nmat1(i,2)) <= max(0.05, 0.2 * (nmat2(j,2) - nmat2(j,1)))
|
emmanouil@71
|
25 NcorrOff = NcorrOff +1;
|
emmanouil@71
|
26 end;
|
emmanouil@71
|
27
|
emmanouil@71
|
28 break; % In order to consider duplicates as false alarms
|
emmanouil@71
|
29
|
emmanouil@71
|
30 end;
|
emmanouil@71
|
31 end;
|
emmanouil@71
|
32 end;
|
emmanouil@71
|
33
|
emmanouil@71
|
34 % Number of onset-only P-R-F-Acc
|
emmanouil@71
|
35 Nfp = Ntot-Ncorr;
|
emmanouil@71
|
36 Nfn = Nref-Ncorr;
|
emmanouil@71
|
37 Rec = Ncorr/Nref;
|
emmanouil@71
|
38 Pre = Ncorr/Ntot;
|
emmanouil@71
|
39 F = 2*((Pre*Rec)/(Pre+Rec));
|
emmanouil@71
|
40 Acc= Ncorr/(Ncorr+Nfp+Nfn);
|
emmanouil@71
|
41
|
emmanouil@71
|
42 % Number of onset-offset P-R-F-Acc
|
emmanouil@71
|
43 NfpOff = Ntot-NcorrOff;
|
emmanouil@71
|
44 NfnOff = Nref-NcorrOff;
|
emmanouil@71
|
45 RecOff = NcorrOff/Nref;
|
emmanouil@71
|
46 PreOff = NcorrOff/Ntot;
|
emmanouil@71
|
47 FOff = 2*((PreOff*RecOff)/(PreOff+RecOff));
|
emmanouil@71
|
48 AccOff= NcorrOff/(NcorrOff+NfpOff+NfnOff); |