Mercurial > hg > audiodb
changeset 675:c62041316a44
First implementation of separate query / instance hopsizes
Builds and passes tests. Bindings not yet adjusted, and of course there are
no existing tests of hopsize functionality anyway.
author | mas01cr |
---|---|
date | Fri, 05 Mar 2010 16:01:06 +0000 |
parents | fb85aadab85d |
children | dd6cabd65327 |
files | audioDB.cpp audioDB_API.h query.cpp |
diffstat | 3 files changed, 22 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/audioDB.cpp Fri Mar 05 16:01:02 2010 +0000 +++ b/audioDB.cpp Fri Mar 05 16:01:06 2010 +0000 @@ -833,9 +833,9 @@ qspec.refine.flags |= ADB_REFINE_DURATION_RATIO; qspec.refine.duration_ratio = timesTol; } - /* FIXME: not sure about this any more; maybe it belongs in - query_id? Or maybe we just don't need a flag for it? */ - qspec.refine.hopsize = sequenceHop; + + qspec.refine.qhopsize = sequenceHop; + qspec.refine.ihopsize = sequenceHop; if(sequenceHop != 1) { qspec.refine.flags |= ADB_REFINE_HOP_SIZE; }
--- a/audioDB_API.h Fri Mar 05 16:01:02 2010 +0000 +++ b/audioDB_API.h Fri Mar 05 16:01:06 2010 +0000 @@ -77,7 +77,8 @@ double absolute_threshold; double relative_threshold; double duration_ratio; /* expandfactor */ - uint32_t hopsize; + uint32_t qhopsize; + uint32_t ihopsize; } adb_query_refine_t; #define ADB_ACCUMULATION_DB 1
--- a/query.cpp Fri Mar 05 16:01:02 2010 +0000 +++ b/query.cpp Fri Mar 05 16:01:06 2010 +0000 @@ -109,7 +109,6 @@ unsigned int j, k, l, w; double *dp, *qp, *sp; - const unsigned HOP_SIZE = spec->refine.hopsize; const unsigned wL = spec->qid.sequence_length; for(j = 0; j < numVectors; j++) { @@ -132,8 +131,6 @@ *dp += *qp++ * *sp++; } - // Matched Filter - // HOP SIZE == 1 double* spd; if(!(spec->refine.flags & ADB_REFINE_HOP_SIZE)) { for(w = 0; w < wL; w++) { @@ -146,14 +143,18 @@ } } } else { + uint32_t qhop = spec->refine.qhopsize; + qhop = qhop ? qhop : 1; + uint32_t ihop = spec->refine.ihopsize; + ihop = ihop ? ihop : 1; for(w = 0; w < wL; w++) { - for(j = 0; j < numVectors - w; j += HOP_SIZE) { + for(j = 0; j < numVectors - w; j += qhop) { sp = DD[j]; spd = D[j+w]+w; - for(k = 0; k < (*adb->track_lengths)[track] - w; k += HOP_SIZE) { + for(k = 0; k < (*adb->track_lengths)[track] - w; k += ihop) { *sp += *spd; - sp += HOP_SIZE; - spd += HOP_SIZE; + sp += ihop; + spd += ihop; } } } @@ -526,12 +527,16 @@ D = new double*[qpointers.nvectors]; // pre-allocate DD = new double*[qpointers.nvectors]; - unsigned HOP_SIZE; + unsigned qhop, ihop; if(spec->refine.flags & ADB_REFINE_HOP_SIZE) { - HOP_SIZE = spec->refine.hopsize; + qhop = spec->refine.qhopsize; + qhop = qhop ? qhop : 1; + ihop = spec->refine.ihopsize; + ihop = ihop ? ihop : 1; } else { - HOP_SIZE = 1; + qhop = 1; + ihop = 1; } off_t trackIndexOffset; @@ -567,8 +572,8 @@ fabs(dbpointers.mean_duration[track]-qpointers.mean_duration[0]) < qpointers.mean_duration[0]*spec->refine.duration_ratio) { // Search for minimum distance by shingles (concatenated vectors) - for(j = 0; j <= qpointers.nvectors - wL; j += HOP_SIZE) { - for(k = 0; k <= (*adb->track_lengths)[track] - wL; k += HOP_SIZE) { + for(j = 0; j <= qpointers.nvectors - wL; j += qhop) { + for(k = 0; k <= (*adb->track_lengths)[track] - wL; k += ihop) { double thisDist = 0; double qn = qpointers.l2norm[j]; double sn = dbpointers.l2norm[trackIndexOffset + k];