[Sv1-commits] SF.net SVN: sv1:[1267] sonic-visualiser/trunk
Brought to you by:
cannam
From: <ca...@us...> - 2008-11-11 13:54:52
|
Revision: 1267 http://sv1.svn.sourceforge.net/sv1/?rev=1267&view=rev Author: cannam Date: 2008-11-11 13:54:47 +0000 (Tue, 11 Nov 2008) Log Message: ----------- * Add use-log-scale estimator. Not quite right yet; the model doesn't actually have any data in it yet at the point where we want to make this decision * Update changelog Modified Paths: -------------- sonic-visualiser/trunk/CHANGELOG sonic-visualiser/trunk/base/LogRange.cpp sonic-visualiser/trunk/base/LogRange.h 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.h sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp Modified: sonic-visualiser/trunk/CHANGELOG =================================================================== --- sonic-visualiser/trunk/CHANGELOG 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/CHANGELOG 2008-11-11 13:54:47 UTC (rev 1267) @@ -1,15 +1,33 @@ +New features in Sonic Visualiser 1.4 since the previous version 1.3: + + - SV now has a Region layer type, used for display of features with + durations. It also supports Vamp v2.0 plugins that provide durations + for features. + + - Layer data can now be imported from RDF described using the Audio + Features Ontology, as well as from the existing text file types. + + - You can search for transforms by text in the new "Find a Transform" + dialog. This searches both installed plugins, and plugins that have + not been installed but that have descriptions available on the + semantic web. + + - You can now zoom and scroll vertically in time-value and note layers. + + - Several crashes and other bugs have been fixed. + Changes in Sonic Visualiser 1.3 since the previous version 1.2: - There is a new spreadsheet-style data viewer and editor for - viewing and editing the data in some types of annotation layer. + viewing and editing the data in some types of annotation layer. - Alignments are now saved to the session file. - The spectrogram layer is usually somewhat faster than it was. - You can now hold Shift while dragging to move an item, in order - to override the initial drag resistance introduced in 1.2. + to override the initial drag resistance introduced in 1.2. - The gross mis-labelling of time lines in the ruler has been fixed. Modified: sonic-visualiser/trunk/base/LogRange.cpp =================================================================== --- sonic-visualiser/trunk/base/LogRange.cpp 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/base/LogRange.cpp 2008-11-11 13:54:47 UTC (rev 1267) @@ -72,3 +72,45 @@ { return powf(10.0, value); } + +static float +sd(const std::vector<float> &values, size_t start, size_t n) +{ + float sum = 0.f, mean = 0.f, variance = 0.f; + for (size_t i = 0; i < n; ++i) { + sum += values[start + i]; + } + mean = sum / n; + for (size_t i = 0; i < n; ++i) { + float diff = values[start + i] - mean; + variance += diff * diff; + } + variance = variance / n; + return sqrtf(variance); +} + +bool +LogRange::useLogScale(std::vector<float> values) +{ + // Principle: Partition the data into two sets around the median; + // calculate the standard deviation of each set; if the two SDs + // are very different, it's likely that a log scale would be good. + + if (values.size() < 4) return false; + std::sort(values.begin(), values.end()); + size_t mi = values.size() / 2; + + float sd0 = sd(values, 0, mi); + float sd1 = sd(values, mi, values.size() - mi); + + std::cerr << "LogRange::useLogScale: sd0 = " + << sd0 << ", sd1 = " << sd1 << std::endl; + + if (sd0 == 0 || sd1 == 0) return false; + + // I wonder what method of determining "one sd much bigger than + // the other" would be appropriate here... + if (std::max(sd0, sd1) / std::min(sd0, sd1) > 10.f) return true; + else return false; +} + Modified: sonic-visualiser/trunk/base/LogRange.h =================================================================== --- sonic-visualiser/trunk/base/LogRange.h 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/base/LogRange.h 2008-11-11 13:54:47 UTC (rev 1267) @@ -16,6 +16,8 @@ #ifndef _LOG_RANGE_H_ #define _LOG_RANGE_H_ +#include <vector> + class LogRange { public: @@ -39,6 +41,14 @@ * means taking the value'th power of ten. */ static float unmap(float value); + + /** + * Estimate whether a set of values would be more properly shown + * using a logarithmic than a linear scale. This is only ever + * going to be a rough guess. + */ + static bool useLogScale(std::vector<float> values); + }; #endif Modified: sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h =================================================================== --- sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/data/model/DenseThreeDimensionalModel.h 2008-11-11 13:54:47 UTC (rev 1267) @@ -80,6 +80,12 @@ virtual QString getBinName(size_t n) const = 0; /** + * Estimate whether a logarithmic scale might be appropriate for + * the value scale. + */ + virtual bool shouldUseLogValueScale() const = 0; + + /** * Utility function to query whether a given bin is greater than * its (vertical) neighbours. */ Modified: sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp =================================================================== --- sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.cpp 2008-11-11 13:54:47 UTC (rev 1267) @@ -15,8 +15,9 @@ #include "EditableDenseThreeDimensionalModel.h" +#include "base/LogRange.h" + #include <QTextStream> - #include <QStringList> #include <iostream> @@ -247,6 +248,35 @@ emit modelChanged(); } +bool +EditableDenseThreeDimensionalModel::shouldUseLogValueScale() const +{ + std::vector<float> sample; + std::vector<int> n; + + for (int i = 0; i < 10; ++i) { + size_t index = i * 10; + if (index < m_data.size()) { + const Column &c = m_data[index]; + while (c.size() > sample.size()) { + sample.push_back(0.f); + n.push_back(0); + } + for (int j = 0; j < c.size(); ++j) { + sample[j] += c[j]; + ++n[j]; + } + } + } + + if (sample.empty()) return false; + for (int j = 0; j < sample.size(); ++j) { + if (n[j]) sample[j] /= n[j]; + } + + return LogRange::useLogScale(sample); +} + void EditableDenseThreeDimensionalModel::setCompletion(int completion, bool update) { Modified: sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h =================================================================== --- sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/data/model/EditableDenseThreeDimensionalModel.h 2008-11-11 13:54:47 UTC (rev 1267) @@ -106,6 +106,8 @@ virtual void setBinName(size_t n, QString); virtual void setBinNames(std::vector<QString> names); + bool shouldUseLogValueScale() const; + virtual void setCompletion(int completion, bool update = true); virtual int getCompletion() const { return m_completion; } Modified: sonic-visualiser/trunk/data/model/FFTModel.h =================================================================== --- sonic-visualiser/trunk/data/model/FFTModel.h 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/data/model/FFTModel.h 2008-11-11 13:54:47 UTC (rev 1267) @@ -139,6 +139,10 @@ virtual void getColumn(size_t x, Column &result) const; virtual QString getBinName(size_t n) const; + virtual bool shouldUseLogValueScale() const { + return true; // Although obviously it's up to the user... + } + /** * Calculate an estimated frequency for a stable signal in this * bin, using phase unwrapping. This will be completely wrong if Modified: sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp =================================================================== --- sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp 2008-11-11 09:41:45 UTC (rev 1266) +++ sonic-visualiser/trunk/layer/Colour3DPlotLayer.cpp 2008-11-11 13:54:47 UTC (rev 1267) @@ -572,6 +572,11 @@ void Colour3DPlotLayer::paint(View *v, QPainter &paint, QRect rect) const { +/*!!! + if (m_model) { + std::cerr << "Colour3DPlotLayer::paint: model says shouldUseLogValueScale = " << m_model->shouldUseLogValueScale() << std::endl; + } +*/ // Profiler profiler("Colour3DPlotLayer::paint"); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT std::cerr << "Colour3DPlotLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << std::endl; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |