changeset 1379:b6cca362bbf4 spectrogramparam

Experimental oversampling param
author Chris Cannam
date Tue, 06 Nov 2018 13:36:04 +0000
parents f08a3b8cdb9d
children 2f4476993ae6
files layer/SpectrogramLayer.cpp layer/SpectrogramLayer.h
diffstat 2 files changed, 92 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/layer/SpectrogramLayer.cpp	Tue Nov 06 13:35:47 2018 +0000
+++ b/layer/SpectrogramLayer.cpp	Tue Nov 06 13:36:04 2018 +0000
@@ -61,6 +61,7 @@
     m_windowSize(1024),
     m_windowType(HanningWindow),
     m_windowHopLevel(2),
+    m_oversampling(1),
     m_gain(1.0),
     m_initialGain(1.0),
     m_threshold(1.0e-8f),
@@ -236,6 +237,7 @@
     list.push_back("Colour Scale");
     list.push_back("Window Size");
     list.push_back("Window Increment");
+    list.push_back("Oversampling");
     list.push_back("Normalization");
     list.push_back("Bin Display");
     list.push_back("Threshold");
@@ -254,6 +256,7 @@
     if (name == "Colour Scale") return tr("Colour Scale");
     if (name == "Window Size") return tr("Window Size");
     if (name == "Window Increment") return tr("Window Overlap");
+    if (name == "Oversampling") return tr("Oversampling");
     if (name == "Normalization") return tr("Normalization");
     if (name == "Bin Display") return tr("Bin Display");
     if (name == "Threshold") return tr("Threshold");
@@ -287,7 +290,8 @@
     if (name == "Bin Display" ||
         name == "Frequency Scale") return tr("Bins");
     if (name == "Window Size" ||
-        name == "Window Increment") return tr("Window");
+        name == "Window Increment" ||
+        name == "Oversampling") return tr("Window");
     if (name == "Colour" ||
         name == "Threshold" ||
         name == "Colour Rotation") return tr("Colour");
@@ -376,7 +380,17 @@
         *deflt = 2;
 
         val = m_windowHopLevel;
-    
+
+    } else if (name == "Oversampling") {
+
+        *min = 0;
+        *max = 3;
+        *deflt = 0;
+
+        val = 0;
+        int ov = m_oversampling;
+        while (ov > 1) { ov >>= 1; val ++; }
+        
     } else if (name == "Min Frequency") {
 
         *min = 0;
@@ -485,6 +499,15 @@
         case 5: return tr("93.75 %");
         }
     }
+    if (name == "Oversampling") {
+        switch (value) {
+        default:
+        case 0: return tr("1x");
+        case 1: return tr("2x");
+        case 2: return tr("4x");
+        case 3: return tr("8x");
+        }
+    }
     if (name == "Min Frequency") {
         switch (value) {
         default:
@@ -578,6 +601,8 @@
         setWindowSize(32 << value);
     } else if (name == "Window Increment") {
         setWindowHopLevel(value);
+    } else if (name == "Oversampling") {
+        setOversampling(1 << value);
     } else if (name == "Min Frequency") {
         switch (value) {
         default:
@@ -707,8 +732,66 @@
 }
 
 int
-SpectrogramLayer::getFFTOversampling() const
+SpectrogramLayer::getFFTSize() const
 {
+    return m_windowSize * m_oversampling;
+}
+
+void
+SpectrogramLayer::setWindowSize(int ws)
+{
+    if (m_windowSize == ws) return;
+
+    invalidateRenderers();
+    
+    m_windowSize = ws;
+    
+    recreateFFTModel();
+
+    emit layerParametersChanged();
+}
+
+int
+SpectrogramLayer::getWindowSize() const
+{
+    return m_windowSize;
+}
+
+void
+SpectrogramLayer::setWindowHopLevel(int v)
+{
+    if (m_windowHopLevel == v) return;
+
+    invalidateRenderers();
+    
+    m_windowHopLevel = v;
+    
+    recreateFFTModel();
+
+    emit layerParametersChanged();
+}
+
+int
+SpectrogramLayer::getWindowHopLevel() const
+{
+    return m_windowHopLevel;
+}
+
+void
+SpectrogramLayer::setOversampling(int oversampling)
+{
+    if (m_oversampling == oversampling) return;
+    invalidateRenderers();
+    m_oversampling = oversampling;
+    recreateFFTModel();
+    emit layerParametersChanged();
+}
+
+int
+SpectrogramLayer::getOversampling() const
+{
+    return m_oversampling;
+    /*!!!
     if (m_binDisplay != BinDisplay::AllBins) {
         return 1;
     }
@@ -722,52 +805,7 @@
     }
 
     return 4;
-}
-
-int
-SpectrogramLayer::getFFTSize() const
-{
-    return m_windowSize * getFFTOversampling();
-}
-
-void
-SpectrogramLayer::setWindowSize(int ws)
-{
-    if (m_windowSize == ws) return;
-
-    invalidateRenderers();
-    
-    m_windowSize = ws;
-    
-    recreateFFTModel();
-
-    emit layerParametersChanged();
-}
-
-int
-SpectrogramLayer::getWindowSize() const
-{
-    return m_windowSize;
-}
-
-void
-SpectrogramLayer::setWindowHopLevel(int v)
-{
-    if (m_windowHopLevel == v) return;
-
-    invalidateRenderers();
-    
-    m_windowHopLevel = v;
-    
-    recreateFFTModel();
-
-    emit layerParametersChanged();
-}
-
-int
-SpectrogramLayer::getWindowHopLevel() const
-{
-    return m_windowHopLevel;
+    */
 }
 
 void
--- a/layer/SpectrogramLayer.h	Tue Nov 06 13:35:47 2018 +0000
+++ b/layer/SpectrogramLayer.h	Tue Nov 06 13:36:04 2018 +0000
@@ -111,6 +111,9 @@
     void setWindowHopLevel(int level);
     int getWindowHopLevel() const;
 
+    void setOversampling(int oversampling);
+    int getOversampling() const;
+    
     void setWindowType(WindowType type);
     WindowType getWindowType() const;
 
@@ -246,6 +249,7 @@
     int                 m_windowSize;
     WindowType          m_windowType;
     int                 m_windowHopLevel;
+    int                 m_oversampling;
     float               m_gain;
     float               m_initialGain;
     float               m_threshold;
@@ -300,8 +304,7 @@
         else return m_windowSize / (1 << (m_windowHopLevel - 1));
     }
 
-    int getFFTOversampling() const;
-    int getFFTSize() const; // m_windowSize * getFFTOversampling()
+    int getFFTSize() const; // m_windowSize * getOversampling()
 
     FFTModel *m_fftModel;
     FFTModel *getFFTModel() const { return m_fftModel; }