diff data/fft/FFTFileCache.cpp @ 509:6066bde1c126

* Cut back on the locking and general workload in FFTDataServer::getMagnitudes(). This stuff is far too complicated!
author Chris Cannam
date Mon, 08 Dec 2008 11:15:13 +0000
parents f60360209e5c
children
line wrap: on
line diff
--- a/data/fft/FFTFileCache.cpp	Fri Dec 05 16:18:04 2008 +0000
+++ b/data/fft/FFTFileCache.cpp	Mon Dec 08 11:15:13 2008 +0000
@@ -103,8 +103,8 @@
     switch (m_storageType) {
 
     case Compact:
-        value = (getFromReadBufCompactUnsigned(x, y * 2) / 65535.0)
-            * getNormalizationFactor(x);
+        value = (getFromReadBufCompactUnsigned(x, y * 2, true) / 65535.0)
+            * getNormalizationFactor(x, true);
         break;
 
     case Rectangular:
@@ -116,7 +116,7 @@
     }
 
     case Polar:
-        value = getFromReadBufStandard(x, y * 2);
+        value = getFromReadBufStandard(x, y * 2, true);
         break;
     }
 
@@ -131,13 +131,13 @@
     switch (m_storageType) {
 
     case Compact:
-        value = getFromReadBufCompactUnsigned(x, y * 2) / 65535.0;
+        value = getFromReadBufCompactUnsigned(x, y * 2, true) / 65535.0;
         break;
 
     default:
     {
         float mag = getMagnitudeAt(x, y);
-        float factor = getNormalizationFactor(x);
+        float factor = getNormalizationFactor(x, true);
         if (factor != 0) value = mag / factor;
         else value = 0.f;
         break;
@@ -150,7 +150,7 @@
 float
 FFTFileCache::getMaximumMagnitudeAt(size_t x) const
 {
-    return getNormalizationFactor(x);
+    return getNormalizationFactor(x, true);
 }
 
 float
@@ -161,7 +161,7 @@
     switch (m_storageType) {
 
     case Compact:
-        value = (getFromReadBufCompactSigned(x, y * 2 + 1) / 32767.0) * M_PI;
+        value = (getFromReadBufCompactSigned(x, y * 2 + 1, true) / 32767.0) * M_PI;
         break;
 
     case Rectangular:
@@ -173,7 +173,7 @@
     }
 
     case Polar:
-        value = getFromReadBufStandard(x, y * 2 + 1);
+        value = getFromReadBufStandard(x, y * 2 + 1, true);
         break;
     }
 
@@ -186,8 +186,10 @@
     switch (m_storageType) {
 
     case Rectangular:
-        real = getFromReadBufStandard(x, y * 2);
-        imag = getFromReadBufStandard(x, y * 2 + 1);
+        m_readbufMutex.lock();
+        real = getFromReadBufStandard(x, y * 2, false);
+        imag = getFromReadBufStandard(x, y * 2 + 1, false);
+        m_readbufMutex.unlock();
         return;
 
     default:
@@ -199,6 +201,46 @@
     }
 }
 
+void
+FFTFileCache::getMagnitudesAt(size_t x, float *values, size_t minbin, size_t count, size_t step) const
+{
+    Profiler profiler("FFTFileCache::getMagnitudesAt");
+
+    m_readbufMutex.lock();
+
+    switch (m_storageType) {
+
+    case Compact:
+        for (size_t i = 0; i < count; ++i) {
+            size_t y = minbin + i * step;
+            values[i] = (getFromReadBufCompactUnsigned(x, y * 2, false) / 65535.0)
+                * getNormalizationFactor(x, false);
+        }
+        break;
+
+    case Rectangular:
+    {
+        float real, imag;
+        for (size_t i = 0; i < count; ++i) {
+            size_t y = minbin + i * step;
+            real = getFromReadBufStandard(x, y * 2, false);
+            imag = getFromReadBufStandard(x, y * 2 + 1, false);
+            values[i] = sqrtf(real * real + imag * imag);
+        }
+        break;
+    }
+
+    case Polar:
+        for (size_t i = 0; i < count; ++i) {
+            size_t y = minbin + i * step;
+            values[i] = getFromReadBufStandard(x, y * 2, false);
+        }
+        break;
+    }
+
+    m_readbufMutex.unlock();
+}
+
 bool
 FFTFileCache::haveSetColumnAt(size_t x) const
 {