Mercurial > hg > audiodb
changeset 149:12fee2a993bf powertable
Maybe implement silence thresholding for the sequence query (without an
explicit threshold radius). Not yet tested.
author | mas01cr |
---|---|
date | Wed, 31 Oct 2007 14:37:55 +0000 |
parents | 8c1c6a5c1cc3 |
children | b1cbd2b78a18 |
files | audioDB.cpp |
diffstat | 1 files changed, 59 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/audioDB.cpp Wed Oct 31 13:08:21 2007 +0000 +++ b/audioDB.cpp Wed Oct 31 14:37:55 2007 +0000 @@ -1664,9 +1664,25 @@ memcpy(sNorm, l2normTable, dbVectors*sizeof(double)); double* qnPtr = qNorm; double* snPtr = sNorm; + + double *sPower = 0, *qPower; + double *spPtr = 0, *qpPtr = 0; + + if (usingPower) { + if (!(dbH->flags & O2_FLAG_POWER)) { + error("database not power-enabled", dbName); + } + sPower = new double[dbVectors]; + spPtr = sPower; + memcpy(sPower, powerTable, dbVectors * sizeof(double)); + } + for(i=0; i<dbH->numFiles; i++){ if(trackTable[i]>=sequenceLength) { sequence_sum(snPtr, trackTable[i], sequenceLength); + if (usingPower) { + sequence_sum(spPtr, trackTable[i], sequenceLength); + } ps = snPtr; w=trackTable[i]-sequenceLength+1; @@ -1674,8 +1690,20 @@ *ps=sqrt(*ps); ps++; } + + if (usingPower) { + ps = spPtr; + w = trackTable[i] - sequenceLength + 1; + while(w--) { + *ps = *ps / sequenceLength; + ps++; + } + } } - snPtr+=trackTable[i]; + snPtr += trackTable[i]; + if (usingPower) { + spPtr += trackTable[i]; + } } double* pn = sMeanL2; @@ -1711,6 +1739,28 @@ } sequence_sum(qnPtr, numVectors, sequenceLength); + if (usingPower) { + qPower = new double[numVectors]; + qpPtr = qPower; + if (lseek(powerfd, sizeof(int), SEEK_SET) == (off_t) -1) { + error("error seeking to data", powerFileName, "lseek"); + } + int count = read(powerfd, qPower, numVectors * sizeof(double)); + if (count == -1) { + error("error reading data", powerFileName, "read"); + } + if ((unsigned) count != numVectors * sizeof(double)) { + error("short read", powerFileName); + } + + sequence_sum(qpPtr, numVectors, sequenceLength); + ps = qpPtr; + w = trackTable[i] - sequenceLength + 1; + while(w--) { + *ps = *ps / sequenceLength; + ps++; + } + } ps = qnPtr; qMeanL2 = 0; @@ -1950,6 +2000,13 @@ // diffL2 = fabs(qnPtr[j] - sNorm[trackIndexOffset+k]); // Power test + if (usingPower) { + if (!(powers_acceptable(qpPtr[j], sPower[trackIndexOffset + k]))) { + thisDist = 1000000.0; + } + } + + /* if(!USE_THRESH || // Threshold on mean L2 of Q and S sequences (USE_THRESH && qnPtr[j]>SILENCE_THRESH && sNorm[trackIndexOffset+k]>SILENCE_THRESH && @@ -1958,6 +2015,7 @@ thisDist=thisDist; // Computed above else thisDist=1000000.0; + */ // k-NN match algorithm m=pointNN;