annotate data/model/DenseThreeDimensionalModel.h @ 1091:bdebff3265ae simple-fft-model

Simplest naive FFTModel implementation (+ fill in tests)
author Chris Cannam
date Fri, 12 Jun 2015 18:08:57 +0100
parents cc27f35aa75c
children aa588c391d1a fa1bec83441e
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 17 #define _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 18
Chris@150 19 #include "Model.h"
Chris@500 20 #include "TabularModel.h"
Chris@147 21 #include "base/ZoomConstraint.h"
Chris@500 22 #include "base/RealTime.h"
Chris@147 23
Chris@147 24 #include <QMutex>
Chris@533 25 #include <QVector>
Chris@147 26
Chris@500 27 class DenseThreeDimensionalModel : public Model,
Chris@500 28 public TabularModel
Chris@147 29 {
Chris@147 30 Q_OBJECT
Chris@147 31
Chris@147 32 public:
Chris@147 33 /**
Chris@182 34 * Return the number of sample frames covered by each column of bins.
Chris@147 35 */
Chris@929 36 virtual int getResolution() const = 0;
Chris@147 37
Chris@147 38 /**
Chris@182 39 * Return the number of columns of bins in the model.
Chris@147 40 */
Chris@929 41 virtual int getWidth() const = 0;
Chris@147 42
Chris@147 43 /**
Chris@182 44 * Return the number of bins in each column.
Chris@182 45 */
Chris@929 46 virtual int getHeight() const = 0;
Chris@182 47
Chris@182 48 /**
Chris@182 49 * Return the minimum permissible value in each bin.
Chris@147 50 */
Chris@152 51 virtual float getMinimumLevel() const = 0;
Chris@147 52
Chris@147 53 /**
Chris@182 54 * Return the maximum permissible value in each bin.
Chris@147 55 */
Chris@152 56 virtual float getMaximumLevel() const = 0;
Chris@147 57
Chris@182 58 /**
Chris@182 59 * Return true if there are data available for the given column.
Chris@223 60 * This should return true only if getColumn(column) would not
Chris@223 61 * have to do any substantial work to calculate its return values.
Chris@223 62 * If this function returns false, it may still be possible to
Chris@223 63 * retrieve the column, but its values may have to be calculated.
Chris@182 64 */
Chris@929 65 virtual bool isColumnAvailable(int column) const = 0;
Chris@182 66
Chris@533 67 typedef QVector<float> Column;
Chris@147 68
Chris@147 69 /**
Chris@182 70 * Get data from the given column of bin values.
Chris@147 71 */
Chris@929 72 virtual Column getColumn(int column) const = 0;
Chris@147 73
Chris@147 74 /**
Chris@182 75 * Get the single data point from the n'th bin of the given column.
Chris@147 76 */
Chris@929 77 virtual float getValueAt(int column, int n) const = 0;
Chris@147 78
Chris@182 79 /**
Chris@182 80 * Get the name of a given bin (i.e. a label to associate with
Chris@182 81 * that bin across all columns).
Chris@182 82 */
Chris@929 83 virtual QString getBinName(int n) const = 0;
Chris@147 84
Chris@182 85 /**
Chris@887 86 * Return true if the bins have values as well as names. If this
Chris@887 87 * returns true, getBinValue() may be used to retrieve the values.
Chris@887 88 */
Chris@887 89 virtual bool hasBinValues() const { return false; }
Chris@887 90
Chris@887 91 /**
Chris@887 92 * Return the value of bin n, if any. This is a "vertical scale"
Chris@887 93 * value which does not vary from one column to the next. This is
Chris@887 94 * only meaningful if hasBinValues() returns true.
Chris@887 95 */
Chris@1038 96 virtual float getBinValue(int n) const { return float(n); }
Chris@887 97
Chris@887 98 /**
Chris@887 99 * Obtain the name of the unit of the values returned from
Chris@887 100 * getBinValue(), if any.
Chris@887 101 */
Chris@887 102 virtual QString getBinValueUnit() const { return ""; }
Chris@887 103
Chris@887 104 /**
Chris@478 105 * Estimate whether a logarithmic scale might be appropriate for
Chris@478 106 * the value scale.
Chris@478 107 */
Chris@478 108 virtual bool shouldUseLogValueScale() const = 0;
Chris@478 109
Chris@478 110 /**
Chris@182 111 * Utility function to query whether a given bin is greater than
Chris@182 112 * its (vertical) neighbours.
Chris@182 113 */
Chris@929 114 bool isLocalPeak(int x, int y) {
Chris@182 115 float value = getValueAt(x, y);
Chris@182 116 if (y > 0 && value < getValueAt(x, y - 1)) return false;
Chris@182 117 if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false;
Chris@182 118 return true;
Chris@182 119 }
Chris@182 120
Chris@182 121 /**
Chris@182 122 * Utility function to query whether a given bin is greater than a
Chris@182 123 * certain threshold.
Chris@182 124 */
Chris@929 125 bool isOverThreshold(int x, int y, float threshold) {
Chris@182 126 return getValueAt(x, y) > threshold;
Chris@182 127 }
Chris@182 128
Chris@345 129 QString getTypeName() const { return tr("Dense 3-D"); }
Chris@345 130
Chris@152 131 virtual int getCompletion() const = 0;
Chris@147 132
Chris@500 133 /*
Chris@500 134 TabularModel methods.
Chris@500 135 This class is non-editable -- subclasses may be editable.
Chris@500 136 Row and column are transposed for the tabular view (which is
Chris@500 137 "on its side").
Chris@500 138 */
Chris@500 139
Chris@500 140 virtual int getRowCount() const { return getWidth(); }
Chris@500 141 virtual int getColumnCount() const { return getHeight() + 2; }
Chris@500 142
Chris@500 143 virtual QString getHeading(int column) const
Chris@500 144 {
Chris@500 145 switch (column) {
Chris@500 146 case 0: return tr("Time");
Chris@500 147 case 1: return tr("Frame");
Chris@500 148 default: return getBinName(column - 2);
Chris@500 149 }
Chris@500 150 }
Chris@500 151
Chris@568 152 virtual QVariant getData(int row, int column, int) const
Chris@500 153 {
Chris@500 154 switch (column) {
Chris@500 155 case 0: {
Chris@500 156 RealTime rt = RealTime::frame2RealTime(row * getResolution(),
Chris@500 157 getSampleRate());
Chris@500 158 return rt.toText().c_str();
Chris@500 159 }
Chris@500 160 case 1:
Chris@500 161 return int(row * getResolution());
Chris@500 162 default:
Chris@500 163 return getValueAt(row, column - 2);
Chris@500 164 }
Chris@500 165 }
Chris@500 166
Chris@500 167 virtual bool isColumnTimeValue(int col) const {
Chris@500 168 return col < 2;
Chris@500 169 }
Chris@568 170 virtual SortType getSortType(int) const {
Chris@500 171 return SortNumeric;
Chris@500 172 }
Chris@500 173
Chris@1038 174 virtual sv_frame_t getFrameForRow(int row) const {
Chris@1038 175 return sv_frame_t(row) * getResolution();
Chris@500 176 }
Chris@1038 177 virtual int getRowForFrame(sv_frame_t frame) const {
Chris@1038 178 return int(frame / getResolution());
Chris@500 179 }
Chris@500 180
Chris@147 181 protected:
Chris@152 182 DenseThreeDimensionalModel() { }
Chris@147 183 };
Chris@147 184
Chris@147 185 #endif