Mercurial > hg > svgui
diff layer/SpectrogramLayer.h @ 85:d31c4f5230d7
* Start factoring out the spectrogram's FFT cache into a separate set of
classes that will permit a choice of disk or memory cache strategies
author | Chris Cannam |
---|---|
date | Tue, 02 May 2006 12:27:41 +0000 |
parents | c683705adcbf |
children | 93a7efc75fb7 |
line wrap: on
line diff
--- a/layer/SpectrogramLayer.h Sat Apr 29 19:20:28 2006 +0000 +++ b/layer/SpectrogramLayer.h Tue May 02 12:27:41 2006 +0000 @@ -28,13 +28,12 @@ #include <fftw3.h> -#include <stdint.h> - class View; class QPainter; class QImage; class QPixmap; class QTimer; +class FFTCacheBase; /** * SpectrogramLayer represents waveform data (obtained from a @@ -218,100 +217,9 @@ BinDisplay m_binDisplay; bool m_normalizeColumns; - // We would like to cache magnitude in a way that can have gain - // applied afterwards and can determine whether something is a - // peak or not, and also cache phase rather than only - // phase-adjusted frequency so that we don't have to recalculate - // if switching between phase and magnitude displays. At the same - // time, we don't want to waste too much memory. - - // This implies probably 16 bits for a normalized magnitude (in - // dB?) and at most 16 bits for phase. - - // Each column's magnitudes are expected to be stored normalized - // to [0,1] with respect to the column, so the normalization - // factor should be calculated before all values in a column, and - // set appropriately. - - class Cache { - public: - Cache(); // of size zero, call resize() before using - ~Cache(); - - size_t getWidth() const { return m_width; } - size_t getHeight() const { return m_height; } - - void resize(size_t width, size_t height); - void reset(); // zero-fill or 1-fill as appropriate without changing size - - float getMagnitudeAt(size_t x, size_t y) const { - return getNormalizedMagnitudeAt(x, y) * m_factor[x]; - } - - float getNormalizedMagnitudeAt(size_t x, size_t y) const { - return float(m_magnitude[x][y]) / 65535.0; - } - - float getPhaseAt(size_t x, size_t y) const { - int16_t i = (int16_t)m_phase[x][y]; - return (float(i) / 32767.0) * M_PI; - } - - bool isLocalPeak(size_t x, size_t y) const { - if (y > 0 && m_magnitude[x][y] < m_magnitude[x][y-1]) return false; - if (y < m_height-1 && m_magnitude[x][y] < m_magnitude[x][y+1]) return false; - return true; - } - - bool isOverThreshold(size_t x, size_t y, float threshold) const { - if (threshold == 0.0) return true; - return getMagnitudeAt(x, y) > threshold; - } - - void setNormalizationFactor(size_t x, float factor) { - if (x < m_width) m_factor[x] = factor; - } - - void setMagnitudeAt(size_t x, size_t y, float mag) { - // norm factor must already be set - setNormalizedMagnitudeAt(x, y, mag / m_factor[x]); - } - - void setNormalizedMagnitudeAt(size_t x, size_t y, float norm) { - if (x < m_width && y < m_height) { - m_magnitude[x][y] = uint16_t(norm * 65535.0); - } - } - - void setPhaseAt(size_t x, size_t y, float phase) { - // phase in range -pi -> pi - if (x < m_width && y < m_height) { - m_phase[x][y] = uint16_t(int16_t((phase * 32767) / M_PI)); - } - } - - QColor getColour(unsigned char index) const { - return m_colours[index]; - } - - void setColour(unsigned char index, QColor colour) { - m_colours[index] = colour; - } - - private: - size_t m_width; - size_t m_height; - uint16_t **m_magnitude; - uint16_t **m_phase; - float *m_factor; - QColor m_colours[256]; - - void resize(uint16_t **&, size_t, size_t); - }; - enum { NO_VALUE = 0 }; // colour index for unused pixels - Cache *m_cache; + FFTCacheBase *m_cache; bool m_cacheInvalid; class CacheFillThread : public QThread