Mercurial > hg > svcore
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 {