changeset 30:ff5a09e45209

* add support for adaptive whitening
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 09 Aug 2007 16:35:37 +0000
parents 56fe3bd9de6e
children 5cd7e3069553
files plugins/BeatTrack.cpp plugins/BeatTrack.h plugins/ConstantQSpectrogram.cpp plugins/OnsetDetect.cpp plugins/OnsetDetect.h
diffstat 5 files changed, 68 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/BeatTrack.cpp	Fri Jun 01 15:07:55 2007 +0000
+++ b/plugins/BeatTrack.cpp	Thu Aug 09 16:35:37 2007 +0000
@@ -44,7 +44,8 @@
 BeatTracker::BeatTracker(float inputSampleRate) :
     Vamp::Plugin(inputSampleRate),
     m_d(0),
-    m_dfType(DF_COMPLEXSD)
+    m_dfType(DF_COMPLEXSD),
+    m_whiten(false)
 {
 }
 
@@ -110,6 +111,18 @@
     desc.valueNames.push_back("Broadband Energy Rise");
     list.push_back(desc);
 
+    desc.identifier = "whiten";
+    desc.name = "Adaptive Whitening";
+    desc.description = "Normalize frequency bin magnitudes relative to recent peak levels";
+    desc.minValue = 0;
+    desc.maxValue = 1;
+    desc.defaultValue = 0;
+    desc.isQuantized = true;
+    desc.quantizeStep = 1;
+    desc.unit = "";
+    desc.valueNames.clear();
+    list.push_back(desc);
+
     return list;
 }
 
@@ -123,7 +136,10 @@
         case DF_PHASEDEV: return 2;
         default: case DF_COMPLEXSD: return 3;
         case DF_BROADBAND: return 4;
+        case DF_POWER: return 5;
         }
+    } else if (name == "whiten") {
+        return m_whiten ? 1.0 : 0.0; 
     }
     return 0.0;
 }
@@ -138,7 +154,10 @@
         case 2: m_dfType = DF_PHASEDEV; break;
         default: case 3: m_dfType = DF_COMPLEXSD; break;
         case 4: m_dfType = DF_BROADBAND; break;
+        case 5: m_dfType = DF_POWER; break;
         }
+    } else if (name == "whiten") {
+        m_whiten = (value > 0.5);
     }
 }
 
@@ -175,6 +194,9 @@
     dfConfig.stepSize = stepSize;
     dfConfig.frameLength = blockSize;
     dfConfig.dbRise = 3;
+    dfConfig.adaptiveWhitening = m_whiten;
+    dfConfig.whiteningRelaxCoeff = -1;
+    dfConfig.whiteningFloor = -1;
     
     m_d = new BeatTrackerData(dfConfig);
     return true;
--- a/plugins/BeatTrack.h	Fri Jun 01 15:07:55 2007 +0000
+++ b/plugins/BeatTrack.h	Thu Aug 09 16:35:37 2007 +0000
@@ -49,6 +49,7 @@
 protected:
     BeatTrackerData *m_d;
     int m_dfType;
+    bool m_whiten;
     static float m_stepSecs;
 };
 
--- a/plugins/ConstantQSpectrogram.cpp	Fri Jun 01 15:07:55 2007 +0000
+++ b/plugins/ConstantQSpectrogram.cpp	Thu Aug 09 16:35:37 2007 +0000
@@ -269,7 +269,7 @@
     d.hasFixedBinCount = true;
     d.binCount = m_bins;
 
-    std::cerr << "Bin count " << d.binCount << std::endl;
+//    std::cerr << "Bin count " << d.binCount << std::endl;
     
     const char *names[] =
 	{ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
--- a/plugins/OnsetDetect.cpp	Fri Jun 01 15:07:55 2007 +0000
+++ b/plugins/OnsetDetect.cpp	Thu Aug 09 16:35:37 2007 +0000
@@ -45,7 +45,8 @@
     Vamp::Plugin(inputSampleRate),
     m_d(0),
     m_dfType(DF_COMPLEXSD),
-    m_sensitivity(50)
+    m_sensitivity(50),
+    m_whiten(false)
 {
 }
 
@@ -109,6 +110,7 @@
     desc.valueNames.push_back("Phase Deviation");
     desc.valueNames.push_back("Complex Domain");
     desc.valueNames.push_back("Broadband Energy Rise");
+    desc.valueNames.push_back("Spectral Magnitude");
     list.push_back(desc);
 
     desc.identifier = "sensitivity";
@@ -123,6 +125,17 @@
     desc.valueNames.clear();
     list.push_back(desc);
 
+    desc.identifier = "whiten";
+    desc.name = "Adaptive Whitening";
+    desc.description = "Normalize frequency bin magnitudes relative to recent peak levels";
+    desc.minValue = 0;
+    desc.maxValue = 1;
+    desc.defaultValue = 0;
+    desc.isQuantized = true;
+    desc.quantizeStep = 1;
+    desc.unit = "";
+    list.push_back(desc);
+
     return list;
 }
 
@@ -136,9 +149,12 @@
         case DF_PHASEDEV: return 2;
         default: case DF_COMPLEXSD: return 3;
         case DF_BROADBAND: return 4;
+        case DF_POWER: return 5;
         }
     } else if (name == "sensitivity") {
         return m_sensitivity;
+    } else if (name == "whiten") {
+        return m_whiten ? 1.0 : 0.0; 
     }
     return 0.0;
 }
@@ -147,15 +163,26 @@
 OnsetDetector::setParameter(std::string name, float value)
 {
     if (name == "dftype") {
+        int dfType = m_dfType;
         switch (lrintf(value)) {
-        case 0: m_dfType = DF_HFC; break;
-        case 1: m_dfType = DF_SPECDIFF; break;
-        case 2: m_dfType = DF_PHASEDEV; break;
-        default: case 3: m_dfType = DF_COMPLEXSD; break;
-        case 4: m_dfType = DF_BROADBAND; break;
+        case 0: dfType = DF_HFC; break;
+        case 1: dfType = DF_SPECDIFF; break;
+        case 2: dfType = DF_PHASEDEV; break;
+        default: case 3: dfType = DF_COMPLEXSD; break;
+        case 4: dfType = DF_BROADBAND; break;
+        case 5: dfType = DF_POWER; break;
         }
+        if (dfType == m_dfType) return;
+        m_dfType = dfType;
+        m_program = "";
     } else if (name == "sensitivity") {
+        if (m_sensitivity == value) return;
         m_sensitivity = value;
+        m_program = "";
+    } else if (name == "whiten") {
+        if (m_whiten == (value > 0.5)) return;
+        m_whiten = (value > 0.5);
+        m_program = "";
     }
 }
 
@@ -163,6 +190,7 @@
 OnsetDetector::getPrograms() const
 {
     ProgramList programs;
+    programs.push_back("");
     programs.push_back("General purpose");
     programs.push_back("Soft onsets");
     programs.push_back("Percussive onsets");
@@ -172,7 +200,7 @@
 std::string
 OnsetDetector::getCurrentProgram() const
 {
-    if (m_program == "") return "General purpose";
+    if (m_program == "") return "";
     else return m_program;
 }
 
@@ -182,12 +210,15 @@
     if (program == "General purpose") {
         setParameter("dftype", 3); // complex
         setParameter("sensitivity", 50);
+        setParameter("whiten", 0);
     } else if (program == "Soft onsets") {
         setParameter("dftype", 2); // phase deviation
         setParameter("sensitivity", 70);
+        setParameter("whiten", 0);
     } else if (program == "Percussive onsets") {
         setParameter("dftype", 4); // broadband energy rise
         setParameter("sensitivity", 40);
+        setParameter("whiten", 0);
     } else {
         return;
     }
@@ -227,6 +258,9 @@
     dfConfig.stepSize = stepSize;
     dfConfig.frameLength = blockSize;
     dfConfig.dbRise = 6.0 - m_sensitivity / 16.6667;
+    dfConfig.adaptiveWhitening = m_whiten;
+    dfConfig.whiteningRelaxCoeff = -1;
+    dfConfig.whiteningFloor = -1;
     
     m_d = new OnsetDetectorData(dfConfig);
     return true;
@@ -435,7 +469,7 @@
 	returnFeatures[0].push_back(feature); // onsets are output 0
     }
 
-    for (int i = 0; i < ppParams.length; ++i) {
+    for (unsigned int i = 0; i < ppParams.length; ++i) {
         
         Feature feature;
 //        feature.hasTimestamp = false;
--- a/plugins/OnsetDetect.h	Fri Jun 01 15:07:55 2007 +0000
+++ b/plugins/OnsetDetect.h	Thu Aug 09 16:35:37 2007 +0000
@@ -54,6 +54,7 @@
     OnsetDetectorData *m_d;
     int m_dfType;
     float m_sensitivity;
+    bool m_whiten;
     std::string m_program;
     static float m_stepSecs;
 };