annotate layer/SpectrumLayer.h @ 1403:10e768adaee5

Retain consistent min freq (rather than min bin no) when changing fft parameters in spectrum; scale ffts by window size rather than fft size in case of oversampling, to avoid fading out because of scale factor including zero padding
author Chris Cannam
date Thu, 15 Nov 2018 15:08:08 +0000
parents 900bed394f5a
children a18e78b9c78b
rev   line source
Chris@133 1
Chris@133 2 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@133 3
Chris@133 4 /*
Chris@133 5 Sonic Visualiser
Chris@133 6 An audio file viewer and annotation editor.
Chris@133 7 Centre for Digital Music, Queen Mary, University of London.
Chris@182 8 This file copyright 2006 QMUL.
Chris@133 9
Chris@133 10 This program is free software; you can redistribute it and/or
Chris@133 11 modify it under the terms of the GNU General Public License as
Chris@133 12 published by the Free Software Foundation; either version 2 of the
Chris@133 13 License, or (at your option) any later version. See the file
Chris@133 14 COPYING included with this distribution for more information.
Chris@133 15 */
Chris@133 16
Chris@1238 17 #ifndef SV_SPECTRUM_LAYER_H
Chris@1238 18 #define SV_SPECTRUM_LAYER_H
Chris@133 19
Chris@193 20 #include "SliceLayer.h"
Chris@133 21
Chris@153 22 #include "base/Window.h"
Chris@153 23
Chris@133 24 #include "data/model/DenseTimeValueModel.h"
Chris@133 25
Chris@1276 26 #include "HorizontalScaleProvider.h"
Chris@1238 27
Chris@133 28 #include <QColor>
Chris@349 29 #include <QMutex>
Chris@133 30
Chris@1238 31 class SpectrumLayer : public SliceLayer,
Chris@1276 32 public HorizontalScaleProvider
Chris@133 33 {
Chris@133 34 Q_OBJECT
Chris@133 35
Chris@133 36 public:
Chris@133 37 SpectrumLayer();
Chris@133 38 ~SpectrumLayer();
Chris@133 39
Chris@133 40 void setModel(DenseTimeValueModel *model);
cannam@1241 41 virtual const Model *getModel() const override { return m_originModel; }
Chris@133 42
Chris@918 43 virtual bool getCrosshairExtents(LayerGeometryProvider *, QPainter &, QPoint cursorPos,
cannam@1241 44 std::vector<QRect> &extents) const override;
cannam@1241 45 virtual void paintCrosshairs(LayerGeometryProvider *, QPainter &, QPoint) const override;
Chris@254 46
Chris@1383 47 virtual int getHorizontalScaleHeight(LayerGeometryProvider *, QPainter &) const override;
Chris@1281 48 virtual void paintHorizontalScale(LayerGeometryProvider *, QPainter &, int xorigin) const;
Chris@1281 49
cannam@1241 50 virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const override;
Chris@199 51
cannam@1241 52 virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const override;
Chris@275 53
cannam@1241 54 virtual VerticalPosition getPreferredFrameCountPosition() const override {
Chris@1266 55 return PositionTop;
Chris@277 56 }
Chris@277 57
cannam@1241 58 virtual PropertyList getProperties() const override;
cannam@1241 59 virtual QString getPropertyLabel(const PropertyName &) const override;
cannam@1241 60 virtual QString getPropertyIconName(const PropertyName &) const override;
cannam@1241 61 virtual PropertyType getPropertyType(const PropertyName &) const override;
cannam@1241 62 virtual QString getPropertyGroupName(const PropertyName &) const override;
Chris@153 63 virtual int getPropertyRangeAndValue(const PropertyName &,
cannam@1241 64 int *min, int *max, int *deflt) const override;
Chris@153 65 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@1266 66 int value) const override;
cannam@1241 67 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const override;
cannam@1241 68 virtual void setProperty(const PropertyName &, int value) override;
cannam@1241 69 virtual void setProperties(const QXmlAttributes &) override;
Chris@133 70
Chris@1403 71 virtual bool setDisplayExtents(double min, double max) override;
Chris@1403 72
Chris@918 73 virtual bool getXScaleValue(const LayerGeometryProvider *v, int x,
cannam@1241 74 double &value, QString &unit) const override;
Chris@260 75
Chris@918 76 virtual bool getYScaleValue(const LayerGeometryProvider *, int y,
cannam@1241 77 double &value, QString &unit) const override;
Chris@274 78
Chris@918 79 virtual bool getYScaleDifference(const LayerGeometryProvider *, int y0, int y1,
cannam@1241 80 double &diff, QString &unit) const override;
Chris@274 81
cannam@1241 82 virtual bool isLayerScrollable(const LayerGeometryProvider *) const override { return false; }
Chris@133 83
Chris@153 84 void setChannel(int);
Chris@153 85 int getChannel() const { return m_channel; }
Chris@153 86
Chris@805 87 void setWindowSize(int);
Chris@805 88 int getWindowSize() const { return m_windowSize; }
Chris@153 89
Chris@805 90 void setWindowHopLevel(int level);
Chris@805 91 int getWindowHopLevel() const { return m_windowHopLevel; }
Chris@153 92
Chris@1382 93 void setOversampling(int oversampling);
Chris@1382 94 int getOversampling() const;
Chris@1382 95
Chris@1382 96 int getFFTSize() const { return getWindowSize() * getOversampling(); }
Chris@1382 97
Chris@153 98 void setWindowType(WindowType type);
Chris@153 99 WindowType getWindowType() const { return m_windowType; }
Chris@1382 100
Chris@284 101 void setShowPeaks(bool);
Chris@284 102 bool getShowPeaks() const { return m_showPeaks; }
Chris@284 103
Chris@1392 104 virtual bool needsTextLabelHeight() const { return true; }
Chris@1392 105
Chris@316 106 virtual void toXml(QTextStream &stream, QString indent = "",
cannam@1241 107 QString extraAttributes = "") const override;
Chris@153 108
Chris@1281 109 virtual double getFrequencyForX(const LayerGeometryProvider *, double x)
Chris@1281 110 const override;
Chris@1281 111 virtual double getXForFrequency(const LayerGeometryProvider *, double freq)
Chris@1281 112 const override;
Chris@1238 113
Chris@153 114 protected slots:
Chris@153 115 void preferenceChanged(PropertyContainer::PropertyName name);
Chris@133 116
Chris@133 117 protected:
Chris@193 118 DenseTimeValueModel *m_originModel;
Chris@153 119 int m_channel;
Chris@153 120 bool m_channelSet;
Chris@1362 121 int m_windowSize;
Chris@153 122 WindowType m_windowType;
Chris@1362 123 int m_windowHopLevel;
Chris@1382 124 int m_oversampling;
Chris@284 125 bool m_showPeaks;
Chris@275 126 mutable bool m_newFFTNeeded;
Chris@153 127
Chris@1403 128 double m_freqOfMinBin; // used to ensure accurate
Chris@1403 129 // alignment when changing
Chris@1403 130 // fft size
Chris@1403 131
Chris@349 132 mutable QMutex m_fftMutex;
Chris@349 133
Chris@193 134 void setupFFT();
Chris@153 135
Chris@1386 136 virtual double getBinForFrequency(double freq) const;
Chris@1386 137 virtual double getFrequencyForBin(double bin) const;
Chris@1386 138
Chris@1386 139 virtual double getXForBin(const LayerGeometryProvider *, double bin)
Chris@1386 140 const override;
Chris@1386 141 virtual double getBinForX(const LayerGeometryProvider *, double x)
Chris@1386 142 const override;
Chris@1386 143
cannam@1241 144 virtual void getBiasCurve(BiasCurve &) const override;
Chris@254 145 BiasCurve m_biasCurve;
Chris@254 146
Chris@805 147 int getWindowIncrement() const {
Chris@153 148 if (m_windowHopLevel == 0) return m_windowSize;
Chris@153 149 else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4;
Chris@153 150 else return m_windowSize / (1 << (m_windowHopLevel - 1));
Chris@153 151 }
Chris@133 152 };
Chris@133 153
Chris@133 154 #endif