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;