Mercurial > hg > svcore
comparison data/fft/FFTMemoryCache.h @ 936:0c1d6de8f44b
Merge from branch warnfix_no_size_t
| author | Chris Cannam | 
|---|---|
| date | Wed, 18 Jun 2014 13:51:16 +0100 | 
| parents | 59e7fe1b1003 | 
| children | cc27f35aa75c | 
   comparison
  equal
  deleted
  inserted
  replaced
| 917:49618f39ff09 | 936:0c1d6de8f44b | 
|---|---|
| 45 | 45 | 
| 46 class FFTMemoryCache : public FFTCacheReader, public FFTCacheWriter | 46 class FFTMemoryCache : public FFTCacheReader, public FFTCacheWriter | 
| 47 { | 47 { | 
| 48 public: | 48 public: | 
| 49 FFTMemoryCache(FFTCache::StorageType storageType, | 49 FFTMemoryCache(FFTCache::StorageType storageType, | 
| 50 size_t width, size_t height); | 50 int width, int height); | 
| 51 ~FFTMemoryCache(); | 51 ~FFTMemoryCache(); | 
| 52 | 52 | 
| 53 size_t getWidth() const { return m_width; } | 53 int getWidth() const { return m_width; } | 
| 54 size_t getHeight() const { return m_height; } | 54 int getHeight() const { return m_height; } | 
| 55 | 55 | 
| 56 float getMagnitudeAt(size_t x, size_t y) const { | 56 float getMagnitudeAt(int x, int y) const { | 
| 57 if (m_storageType == FFTCache::Rectangular) { | 57 if (m_storageType == FFTCache::Rectangular) { | 
| 58 Profiler profiler("FFTMemoryCache::getMagnitudeAt: cart to polar"); | 58 Profiler profiler("FFTMemoryCache::getMagnitudeAt: cart to polar"); | 
| 59 return sqrtf(m_freal[x][y] * m_freal[x][y] + | 59 return sqrtf(m_freal[x][y] * m_freal[x][y] + | 
| 60 m_fimag[x][y] * m_fimag[x][y]); | 60 m_fimag[x][y] * m_fimag[x][y]); | 
| 61 } else { | 61 } else { | 
| 62 return getNormalizedMagnitudeAt(x, y) * m_factor[x]; | 62 return getNormalizedMagnitudeAt(x, y) * m_factor[x]; | 
| 63 } | 63 } | 
| 64 } | 64 } | 
| 65 | 65 | 
| 66 float getNormalizedMagnitudeAt(size_t x, size_t y) const { | 66 float getNormalizedMagnitudeAt(int x, int y) const { | 
| 67 if (m_storageType == FFTCache::Rectangular) return getMagnitudeAt(x, y) / m_factor[x]; | 67 if (m_storageType == FFTCache::Rectangular) return getMagnitudeAt(x, y) / m_factor[x]; | 
| 68 else if (m_storageType == FFTCache::Polar) return m_fmagnitude[x][y]; | 68 else if (m_storageType == FFTCache::Polar) return m_fmagnitude[x][y]; | 
| 69 else return float(m_magnitude[x][y]) / 65535.0; | 69 else return float(m_magnitude[x][y]) / 65535.0; | 
| 70 } | 70 } | 
| 71 | 71 | 
| 72 float getMaximumMagnitudeAt(size_t x) const { | 72 float getMaximumMagnitudeAt(int x) const { | 
| 73 return m_factor[x]; | 73 return m_factor[x]; | 
| 74 } | 74 } | 
| 75 | 75 | 
| 76 float getPhaseAt(size_t x, size_t y) const { | 76 float getPhaseAt(int x, int y) const { | 
| 77 if (m_storageType == FFTCache::Rectangular) { | 77 if (m_storageType == FFTCache::Rectangular) { | 
| 78 Profiler profiler("FFTMemoryCache::getValuesAt: cart to polar"); | 78 Profiler profiler("FFTMemoryCache::getValuesAt: cart to polar"); | 
| 79 return atan2f(m_fimag[x][y], m_freal[x][y]); | 79 return atan2f(m_fimag[x][y], m_freal[x][y]); | 
| 80 } else if (m_storageType == FFTCache::Polar) { | 80 } else if (m_storageType == FFTCache::Polar) { | 
| 81 return m_fphase[x][y]; | 81 return m_fphase[x][y]; | 
| 83 int16_t i = (int16_t)m_phase[x][y]; | 83 int16_t i = (int16_t)m_phase[x][y]; | 
| 84 return (float(i) / 32767.0) * M_PI; | 84 return (float(i) / 32767.0) * M_PI; | 
| 85 } | 85 } | 
| 86 } | 86 } | 
| 87 | 87 | 
| 88 void getValuesAt(size_t x, size_t y, float &real, float &imag) const { | 88 void getValuesAt(int x, int y, float &real, float &imag) const { | 
| 89 if (m_storageType == FFTCache::Rectangular) { | 89 if (m_storageType == FFTCache::Rectangular) { | 
| 90 real = m_freal[x][y]; | 90 real = m_freal[x][y]; | 
| 91 imag = m_fimag[x][y]; | 91 imag = m_fimag[x][y]; | 
| 92 } else { | 92 } else { | 
| 93 Profiler profiler("FFTMemoryCache::getValuesAt: polar to cart"); | 93 Profiler profiler("FFTMemoryCache::getValuesAt: polar to cart"); | 
| 96 real = mag * cosf(phase); | 96 real = mag * cosf(phase); | 
| 97 imag = mag * sinf(phase); | 97 imag = mag * sinf(phase); | 
| 98 } | 98 } | 
| 99 } | 99 } | 
| 100 | 100 | 
| 101 void getMagnitudesAt(size_t x, float *values, size_t minbin, size_t count, size_t step) const | 101 void getMagnitudesAt(int x, float *values, int minbin, int count, int step) const | 
| 102 { | 102 { | 
| 103 if (m_storageType == FFTCache::Rectangular) { | 103 if (m_storageType == FFTCache::Rectangular) { | 
| 104 for (size_t i = 0; i < count; ++i) { | 104 for (int i = 0; i < count; ++i) { | 
| 105 size_t y = i * step + minbin; | 105 int y = i * step + minbin; | 
| 106 values[i] = sqrtf(m_freal[x][y] * m_freal[x][y] + | 106 values[i] = sqrtf(m_freal[x][y] * m_freal[x][y] + | 
| 107 m_fimag[x][y] * m_fimag[x][y]); | 107 m_fimag[x][y] * m_fimag[x][y]); | 
| 108 } | 108 } | 
| 109 } else if (m_storageType == FFTCache::Polar) { | 109 } else if (m_storageType == FFTCache::Polar) { | 
| 110 for (size_t i = 0; i < count; ++i) { | 110 for (int i = 0; i < count; ++i) { | 
| 111 size_t y = i * step + minbin; | 111 int y = i * step + minbin; | 
| 112 values[i] = m_fmagnitude[x][y] * m_factor[x]; | 112 values[i] = m_fmagnitude[x][y] * m_factor[x]; | 
| 113 } | 113 } | 
| 114 } else { | 114 } else { | 
| 115 for (size_t i = 0; i < count; ++i) { | 115 for (int i = 0; i < count; ++i) { | 
| 116 size_t y = i * step + minbin; | 116 int y = i * step + minbin; | 
| 117 values[i] = (float(m_magnitude[x][y]) * m_factor[x]) / 65535.0; | 117 values[i] = (float(m_magnitude[x][y]) * m_factor[x]) / 65535.0; | 
| 118 } | 118 } | 
| 119 } | 119 } | 
| 120 } | 120 } | 
| 121 | 121 | 
| 122 bool haveSetColumnAt(size_t x) const { | 122 bool haveSetColumnAt(int x) const { | 
| 123 m_colsetLock.lockForRead(); | 123 m_colsetLock.lockForRead(); | 
| 124 bool have = m_colset.get(x); | 124 bool have = m_colset.get(x); | 
| 125 m_colsetLock.unlock(); | 125 m_colsetLock.unlock(); | 
| 126 return have; | 126 return have; | 
| 127 } | 127 } | 
| 128 | 128 | 
| 129 void setColumnAt(size_t x, float *mags, float *phases, float factor); | 129 void setColumnAt(int x, float *mags, float *phases, float factor); | 
| 130 | 130 | 
| 131 void setColumnAt(size_t x, float *reals, float *imags); | 131 void setColumnAt(int x, float *reals, float *imags); | 
| 132 | 132 | 
| 133 void allColumnsWritten() { } | 133 void allColumnsWritten() { } | 
| 134 | 134 | 
| 135 static size_t getCacheSize(size_t width, size_t height, | 135 static int getCacheSize(int width, int height, | 
| 136 FFTCache::StorageType type); | 136 FFTCache::StorageType type); | 
| 137 | 137 | 
| 138 FFTCache::StorageType getStorageType() const { return m_storageType; } | 138 FFTCache::StorageType getStorageType() const { return m_storageType; } | 
| 139 | 139 | 
| 140 private: | 140 private: | 
| 141 size_t m_width; | 141 int m_width; | 
| 142 size_t m_height; | 142 int m_height; | 
| 143 uint16_t **m_magnitude; | 143 uint16_t **m_magnitude; | 
| 144 uint16_t **m_phase; | 144 uint16_t **m_phase; | 
| 145 float **m_fmagnitude; | 145 float **m_fmagnitude; | 
| 146 float **m_fphase; | 146 float **m_fphase; | 
| 147 float **m_freal; | 147 float **m_freal; | 
| 151 ResizeableBitset m_colset; | 151 ResizeableBitset m_colset; | 
| 152 mutable QReadWriteLock m_colsetLock; | 152 mutable QReadWriteLock m_colsetLock; | 
| 153 | 153 | 
| 154 void initialise(); | 154 void initialise(); | 
| 155 | 155 | 
| 156 void setNormalizationFactor(size_t x, float factor) { | 156 void setNormalizationFactor(int x, float factor) { | 
| 157 if (x < m_width) m_factor[x] = factor; | 157 if (x < m_width) m_factor[x] = factor; | 
| 158 } | 158 } | 
| 159 | 159 | 
| 160 void setMagnitudeAt(size_t x, size_t y, float mag) { | 160 void setMagnitudeAt(int x, int y, float mag) { | 
| 161 // norm factor must already be set | 161 // norm factor must already be set | 
| 162 setNormalizedMagnitudeAt(x, y, mag / m_factor[x]); | 162 setNormalizedMagnitudeAt(x, y, mag / m_factor[x]); | 
| 163 } | 163 } | 
| 164 | 164 | 
| 165 void setNormalizedMagnitudeAt(size_t x, size_t y, float norm) { | 165 void setNormalizedMagnitudeAt(int x, int y, float norm) { | 
| 166 if (x < m_width && y < m_height) { | 166 if (x < m_width && y < m_height) { | 
| 167 if (m_storageType == FFTCache::Polar) m_fmagnitude[x][y] = norm; | 167 if (m_storageType == FFTCache::Polar) m_fmagnitude[x][y] = norm; | 
| 168 else m_magnitude[x][y] = uint16_t(norm * 65535.0); | 168 else m_magnitude[x][y] = uint16_t(norm * 65535.0); | 
| 169 } | 169 } | 
| 170 } | 170 } | 
| 171 | 171 | 
| 172 void setPhaseAt(size_t x, size_t y, float phase) { | 172 void setPhaseAt(int x, int y, float phase) { | 
| 173 // phase in range -pi -> pi | 173 // phase in range -pi -> pi | 
| 174 if (x < m_width && y < m_height) { | 174 if (x < m_width && y < m_height) { | 
| 175 if (m_storageType == FFTCache::Polar) m_fphase[x][y] = phase; | 175 if (m_storageType == FFTCache::Polar) m_fphase[x][y] = phase; | 
| 176 else m_phase[x][y] = uint16_t(int16_t((phase * 32767) / M_PI)); | 176 else m_phase[x][y] = uint16_t(int16_t((phase * 32767) / M_PI)); | 
| 177 } | 177 } | 
