[Sv1-commits] SF.net SVN: sv1: [385] sonic-visualiser/trunk
Brought to you by:
cannam
From: <ca...@us...> - 2006-10-09 10:50:00
|
Revision: 385 http://svn.sourceforge.net/sv1/?rev=385&view=rev Author: cannam Date: 2006-10-09 03:49:46 -0700 (Mon, 09 Oct 2006) Log Message: ----------- * Some dull work to continue unifying the fft model and editable dense 3d model interfaces Modified Paths: -------------- sonic-visualiser/trunk/data/fileio/CSVFileReader.cpp sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h sonic-visualiser/trunk/data/model/FFTModel.cpp sonic-visualiser/trunk/data/model/FFTModel.h sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp sonic-visualiser/trunk/layer/SpectrogramLayer.cpp sonic-visualiser/trunk/sv/document/SVFileReader.cpp sonic-visualiser/trunk/sv/transform/FeatureExtractionPluginTransform.cpp Modified: sonic-visualiser/trunk/data/fileio/CSVFileReader.cpp =================================================================== --- sonic-visualiser/trunk/data/fileio/CSVFileReader.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/fileio/CSVFileReader.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -227,7 +227,7 @@ } else if (modelType == CSVFormatDialog::ThreeDimensionalModel) { - DenseThreeDimensionalModel::BinValueSet values; + DenseThreeDimensionalModel::Column values; for (int i = 0; i < tidyList.size(); ++i) { @@ -254,7 +254,7 @@ std::cerr << "Setting bin values for count " << lineno << ", frame " << frameNo << ", time " << RealTime::frame2RealTime(frameNo, sampleRate) << std::endl; - model3->setBinValues(frameNo, values); + model3->setColumn(frameNo / model3->getResolution(), values); } ++lineno; Modified: sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h =================================================================== --- sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h 2006-10-09 10:49:46 UTC (rev 385) @@ -28,41 +28,77 @@ public: /** - * Return the number of sample frames covered by each set of bins. + * Return the number of sample frames covered by each column of bins. */ virtual size_t getResolution() const = 0; /** - * Return the number of bins in each set of bins. + * Return the number of columns of bins in the model. */ - virtual size_t getYBinCount() const = 0; + virtual size_t getWidth() const = 0; /** - * Return the minimum value of the value in each bin. + * Return the number of bins in each column. */ + virtual size_t getHeight() const = 0; + + /** + * Return the minimum permissible value in each bin. + */ virtual float getMinimumLevel() const = 0; /** - * Return the maximum value of the value in each bin. + * Return the maximum permissible value in each bin. */ virtual float getMaximumLevel() const = 0; - typedef std::vector<float> BinValueSet; + /** + * Return true if there are data available for the given column. + * This should return true only if getBinValues(windowStartFrame) + * would not have to do any substantial work to calculate its + * return values. If this function returns false, it may still be + * possible to get the bin values for that column, but they may + * have to be calculated. + */ + virtual bool isColumnAvailable(size_t column) const = 0; + typedef std::vector<float> Column; + /** - * Get the set of bin values at the given sample frame (i.e. the - * windowStartFrame/getWindowSize()'th set of bins). + * Get data from the given column of bin values. */ - virtual void getBinValues(long windowStartFrame, BinValueSet &result) const = 0; + virtual void getColumn(size_t column, Column &result) const = 0; /** - * Get a single value, the one at the n'th bin of the set of bins - * starting at the given sample frame. + * Get the single data point from the n'th bin of the given column. */ - virtual float getBinValue(long windowStartFrame, size_t n) const = 0; + virtual float getValueAt(size_t column, size_t n) const = 0; + /** + * Get the name of a given bin (i.e. a label to associate with + * that bin across all columns). + */ virtual QString getBinName(size_t n) const = 0; + /** + * Utility function to query whether a given bin is greater than + * its (vertical) neighbours. + */ + bool isLocalPeak(size_t x, size_t y) { + float value = getValueAt(x, y); + if (y > 0 && value < getValueAt(x, y - 1)) return false; + if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false; + return true; + } + + /** + * Utility function to query whether a given bin is greater than a + * certain threshold. + */ + bool isOverThreshold(size_t x, size_t y, float threshold) { + return getValueAt(x, y) > threshold; + } + virtual int getCompletion() const = 0; protected: Modified: sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp =================================================================== --- sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -70,7 +70,7 @@ model->m_maximum = m_maximum; for (size_t i = 0; i < m_data.size(); ++i) { - model->setBinValues(i * m_resolution, m_data[i]); + model->setColumn(i, m_data[i]); } return model; @@ -89,13 +89,19 @@ } size_t -EditableDenseThreeDimensionalModel::getYBinCount() const +EditableDenseThreeDimensionalModel::getWidth() const { + return m_data.size(); +} + +size_t +EditableDenseThreeDimensionalModel::getHeight() const +{ return m_yBinCount; } void -EditableDenseThreeDimensionalModel::setYBinCount(size_t sz) +EditableDenseThreeDimensionalModel::setHeight(size_t sz) { m_yBinCount = sz; } @@ -125,14 +131,12 @@ } void -EditableDenseThreeDimensionalModel::getBinValues(long windowStart, - BinValueSet &result) const +EditableDenseThreeDimensionalModel::getColumn(size_t index, + Column &result) const { QMutexLocker locker(&m_mutex); - - long index = windowStart / m_resolution; - if (index >= 0 && index < long(m_data.size())) { + if (index < m_data.size()) { result = m_data[index]; } else { result.clear(); @@ -142,15 +146,12 @@ } float -EditableDenseThreeDimensionalModel::getBinValue(long windowStart, - size_t n) const +EditableDenseThreeDimensionalModel::getValueAt(size_t index, size_t n) const { QMutexLocker locker(&m_mutex); - - long index = windowStart / m_resolution; - if (index >= 0 && index < long(m_data.size())) { - const BinValueSet &s = m_data[index]; + if (index < m_data.size()) { + const Column &s = m_data[index]; std::cerr << "index " << index << ", n " << n << ", res " << m_resolution << ", size " << s.size() << std::endl; if (n < s.size()) return s[n]; @@ -160,15 +161,13 @@ } void -EditableDenseThreeDimensionalModel::setBinValues(long windowStart, - const BinValueSet &values) +EditableDenseThreeDimensionalModel::setColumn(size_t index, + const Column &values) { QMutexLocker locker(&m_mutex); - long index = windowStart / m_resolution; - - while (index >= long(m_data.size())) { - m_data.push_back(BinValueSet()); + while (index >= m_data.size()) { + m_data.push_back(Column()); } bool newExtents = (m_data.empty() && (m_minimum == m_maximum)); @@ -187,6 +186,9 @@ m_data[index] = values; + long windowStart = index; + windowStart *= m_resolution; + if (m_notifyOnAdd) { if (allChange) { emit modelChanged(); Modified: sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h =================================================================== --- sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h 2006-10-09 10:49:46 UTC (rev 385) @@ -48,14 +48,19 @@ virtual void setResolution(size_t sz); /** + * Return the number of columns. + */ + virtual size_t getWidth() const; + + /** * Return the number of bins in each set of bins. */ - virtual size_t getYBinCount() const; + virtual size_t getHeight() const; /** * Set the number of bins in each set of bins. */ - virtual void setYBinCount(size_t sz); + virtual void setHeight(size_t sz); /** * Return the minimum value of the value in each bin. @@ -77,24 +82,25 @@ */ virtual void setMaximumLevel(float sz); - typedef std::vector<float> BinValueSet; + /** + * Return true if there are data available for the given column. + */ + virtual bool isColumnAvailable(size_t x) const { return x < getWidth(); } /** - * Get the set of bin values at the given sample frame (i.e. the - * windowStartFrame/getResolution()'th set of bins). + * Get the set of bin values at the given column. */ - virtual void getBinValues(long windowStartFrame, BinValueSet &result) const; + virtual void getColumn(size_t x, Column &) const; /** - * Get a single value, the one at the n'th bin of the set of bins - * starting at the given sample frame. + * Get a single value, from the n'th bin of the given column. */ - virtual float getBinValue(long windowStartFrame, size_t n) const; + virtual float getValueAt(size_t x, size_t n) const; /** - * Set the entire set of bin values at the given sample frame. + * Set the entire set of bin values at the given column. */ - virtual void setBinValues(long windowStartFrame, const BinValueSet &values); + virtual void setColumn(size_t x, const Column &values); virtual QString getBinName(size_t n) const; virtual void setBinName(size_t n, QString); @@ -111,7 +117,7 @@ QString extraAttributes = "") const; protected: - typedef std::vector<BinValueSet> ValueMatrix; + typedef std::vector<Column> ValueMatrix; ValueMatrix m_data; std::vector<QString> m_binNames; Modified: sonic-visualiser/trunk/data/model/FFTModel.cpp =================================================================== --- sonic-visualiser/trunk/data/model/FFTModel.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/model/FFTModel.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -79,10 +79,8 @@ } void -FFTModel::getBinValues(long windowStartFrame, BinValueSet &result) const +FFTModel::getColumn(size_t x, Column &result) const { - if (windowStartFrame < 0) windowStartFrame = 0; - size_t x = windowStartFrame / getResolution(); result.clear(); size_t height(getHeight()); for (size_t y = 0; y < height; ++y) { @@ -90,14 +88,6 @@ } } -float -FFTModel::getBinValue(long windowStartFrame, size_t n) const -{ - if (windowStartFrame < 0) windowStartFrame = 0; - size_t x = windowStartFrame / getResolution(); - return const_cast<FFTModel *>(this)->getMagnitudeAt(x, n); -} - QString FFTModel::getBinName(size_t n) const { Modified: sonic-visualiser/trunk/data/model/FFTModel.h =================================================================== --- sonic-visualiser/trunk/data/model/FFTModel.h 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/data/model/FFTModel.h 2006-10-09 10:49:46 UTC (rev 385) @@ -32,12 +32,6 @@ size_t fillFromColumn = 0); ~FFTModel(); - size_t getWidth() const { - return m_server->getWidth() >> m_xshift; - } - size_t getHeight() const { - return m_server->getHeight() >> m_yshift; - } float getMagnitudeAt(size_t x, size_t y) { return m_server->getMagnitudeAt(x << m_xshift, y << m_yshift); } @@ -53,23 +47,23 @@ void getValuesAt(size_t x, size_t y, float &real, float &imaginary) { m_server->getValuesAt(x << m_xshift, y << m_yshift, real, imaginary); } - bool isColumnReady(size_t x) { + bool isColumnAvailable(size_t x) const { return m_server->isColumnReady(x << m_xshift); } - bool isLocalPeak(size_t x, size_t y) { - float mag = getMagnitudeAt(x, y); - if (y > 0 && mag < getMagnitudeAt(x, y - 1)) return false; - if (y < getHeight() - 1 && mag < getMagnitudeAt(x, y + 1)) return false; - return true; - } - bool isOverThreshold(size_t x, size_t y, float threshold) { - return getMagnitudeAt(x, y) > threshold; - } size_t getFillExtent() const { return m_server->getFillExtent(); } // DenseThreeDimensionalModel and Model methods: // + virtual size_t getWidth() const { + return m_server->getWidth() >> m_xshift; + } + virtual size_t getHeight() const { + return m_server->getHeight() >> m_yshift; + } + virtual float getValueAt(size_t x, size_t y) const { + return const_cast<FFTModel *>(this)->getMagnitudeAt(x, y); + } virtual bool isOK() const { return m_server && m_server->getModel(); } @@ -92,8 +86,7 @@ virtual float getMaximumLevel() const { return 1.f; // Can't provide } - virtual void getBinValues(long windowStartFrame, BinValueSet &result) const; - virtual float getBinValue(long windowStartFrame, size_t n) const; + virtual void getColumn(size_t x, Column &result) const; virtual QString getBinName(size_t n) const; virtual int getCompletion() const { return m_server->getFillCompletion(); } Modified: sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp =================================================================== --- sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -187,14 +187,16 @@ float(v->getViewManager()->getMainModelSampleRate()) / float(m_model->getSampleRate()); - int sx0 = modelResolution * - int((v->getFrameForX(x) / srRatio - long(modelStart)) / long(modelResolution)); - int sx1 = sx0 + modelResolution; + int sx0 = int((v->getFrameForX(x) / srRatio - long(modelStart)) / + long(modelResolution)); - float binHeight = float(v->height()) / m_model->getYBinCount(); + int f0 = sx0 * modelResolution; + int f1 = f0 + modelResolution; + + float binHeight = float(v->height()) / m_model->getHeight(); int sy = (v->height() - y) / binHeight; - float value = m_model->getBinValue(sx0, sy); + float value = m_model->getValueAt(sx0, sy); // std::cerr << "bin value (" << sx0 << "," << sy << ") is " << value << std::endl; @@ -203,9 +205,9 @@ else binName = QString("%1 [%2]").arg(binName).arg(sy + 1); QString text = tr("Time:\t%1 - %2\nBin:\t%3\nValue:\t%4") - .arg(RealTime::frame2RealTime(sx0, m_model->getSampleRate()) + .arg(RealTime::frame2RealTime(f0, m_model->getSampleRate()) .toText(true).c_str()) - .arg(RealTime::frame2RealTime(sx1, m_model->getSampleRate()) + .arg(RealTime::frame2RealTime(f1, m_model->getSampleRate()) .toText(true).c_str()) .arg(binName) .arg(value); @@ -225,11 +227,11 @@ { if (!m_model) return 0; - QString sampleText = QString("[%1]").arg(m_model->getYBinCount()); + QString sampleText = QString("[%1]").arg(m_model->getHeight()); int tw = paint.fontMetrics().width(sampleText); bool another = false; - for (size_t i = 0; i < m_model->getYBinCount(); ++i) { + for (size_t i = 0; i < m_model->getHeight(); ++i) { if (m_model->getBinName(i).length() > sampleText.length()) { sampleText = m_model->getBinName(i); another = true; @@ -248,7 +250,7 @@ if (!m_model) return; int h = rect.height(), w = rect.width(); - float binHeight = float(v->height()) / m_model->getYBinCount(); + float binHeight = float(v->height()) / m_model->getHeight(); int cw = getColourScaleWidth(paint); @@ -269,10 +271,10 @@ paint.setPen(Qt::black); int count = v->height() / paint.fontMetrics().height(); - int step = m_model->getYBinCount() / count; + int step = m_model->getHeight() / count; if (step == 0) step = 1; - for (size_t i = 0; i < m_model->getYBinCount(); ++i) { + for (size_t i = 0; i < m_model->getHeight(); ++i) { if ((i % step) != 0) continue; @@ -312,7 +314,7 @@ size_t modelResolution = m_model->getResolution(); size_t cacheWidth = (modelEnd - modelStart) / modelResolution + 1; - size_t cacheHeight = m_model->getYBinCount(); + size_t cacheHeight = m_model->getHeight(); if (m_cache && (m_cache->width() != cacheWidth || @@ -329,7 +331,7 @@ std::cerr << "Cache size " << cacheWidth << "x" << cacheHeight << std::endl; m_cache->setNumColors(256); - DenseThreeDimensionalModel::BinValueSet values; + DenseThreeDimensionalModel::Column values; float min = m_model->getMinimumLevel(); float max = m_model->getMaximumLevel(); @@ -377,9 +379,9 @@ for (size_t f = modelStart; f <= modelEnd; f += modelResolution) { values.clear(); - m_model->getBinValues(f, values); + m_model->getColumn(f / modelResolution, values); - for (size_t y = 0; y < m_model->getYBinCount(); ++y) { + for (size_t y = 0; y < m_model->getHeight(); ++y) { float value = min; if (y < values.size()) { @@ -398,7 +400,7 @@ } } - if (m_model->getYBinCount() >= v->height() || + if (m_model->getHeight() >= v->height() || modelResolution < v->getZoomLevel() / 2) { paintDense(v, paint, rect); return; @@ -425,7 +427,7 @@ int sx0 = int((v->getFrameForX(x0) / srRatio - long(modelStart)) / long(modelResolution)); int sx1 = int((v->getFrameForX(x1) / srRatio - long(modelStart)) / long(modelResolution)); - int sh = m_model->getYBinCount(); + int sh = m_model->getHeight(); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT std::cerr << "Colour3DPlotLayer::paint: w " << w << ", h " << h << ", sx0 " << sx0 << ", sx1 " << sx1 << ", sw " << sw << ", sh " << sh << std::endl; @@ -497,7 +499,7 @@ if (showLabel) { if (sx >= 0 && sx < m_cache->width() && sy >= 0 && sy < m_cache->height()) { - float value = m_model->getBinValue(fx, sy); + float value = m_model->getValueAt(sx, sy); sprintf(labelbuf, "%06f", value); QString text(labelbuf); paint.setPen(Qt::white); @@ -529,7 +531,7 @@ int w = x1 - x0; int h = v->height(); - int sh = m_model->getYBinCount(); + int sh = m_model->getHeight(); QImage img(w, h, QImage::Format_RGB32); Modified: sonic-visualiser/trunk/layer/SpectrogramLayer.cpp =================================================================== --- sonic-visualiser/trunk/layer/SpectrogramLayer.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/layer/SpectrogramLayer.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -21,7 +21,6 @@ #include "base/Window.h" #include "base/Pitch.h" #include "base/Preferences.h" -#include "data/fft/FFTDataServer.h" #include <QPainter> #include <QImage> @@ -1410,7 +1409,7 @@ for (int s = s0i; s <= s1i; ++s) { - if (!fft->isColumnReady(s)) continue; + if (!fft->isColumnAvailable(s)) continue; float binfreq = (sr * q) / m_windowSize; if (q == q0i) freqMin = binfreq; @@ -1488,7 +1487,7 @@ for (int s = s0i; s <= s1i; ++s) { if (s >= 0 && q >= 0 && s < cw && q < ch) { - if (!fft->isColumnReady(s)) continue; + if (!fft->isColumnAvailable(s)) continue; float value; @@ -1992,7 +1991,7 @@ for (int s = s0i; s <= s1i; ++s) { - if (!fft->isColumnReady(s)) continue; + if (!fft->isColumnAvailable(s)) continue; MagnitudeRange mag; for (size_t q = minbin; q < bins; ++q) { Modified: sonic-visualiser/trunk/sv/document/SVFileReader.cpp =================================================================== --- sonic-visualiser/trunk/sv/document/SVFileReader.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/sv/document/SVFileReader.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -843,11 +843,11 @@ if (dtdm) { QStringList data = text.split(m_datasetSeparator); - DenseThreeDimensionalModel::BinValueSet values; + DenseThreeDimensionalModel::Column values; for (QStringList::iterator i = data.begin(); i != data.end(); ++i) { - if (values.size() == dtdm->getYBinCount()) { + if (values.size() == dtdm->getHeight()) { if (!warned) { std::cerr << "WARNING: SV-XML: Too many y-bins in 3-D dataset row " << m_rowNumber << std::endl; @@ -866,9 +866,7 @@ } } - size_t windowStartFrame = m_rowNumber * dtdm->getResolution(); - - dtdm->setBinValues(windowStartFrame, values); + dtdm->setColumn(m_rowNumber, values); return true; } Modified: sonic-visualiser/trunk/sv/transform/FeatureExtractionPluginTransform.cpp =================================================================== --- sonic-visualiser/trunk/sv/transform/FeatureExtractionPluginTransform.cpp 2006-10-06 16:53:25 UTC (rev 384) +++ sonic-visualiser/trunk/sv/transform/FeatureExtractionPluginTransform.cpp 2006-10-09 10:49:46 UTC (rev 385) @@ -445,13 +445,13 @@ } else { - DenseThreeDimensionalModel::BinValueSet values = feature.values; + DenseThreeDimensionalModel::Column values = feature.values; EditableDenseThreeDimensionalModel *model = getOutput<EditableDenseThreeDimensionalModel>(); if (!model) return; - model->setBinValues(frame, values); + model->setColumn(frame / model->getResolution(), values); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |