changeset 243:f68277668ad4 subsequence

Fix incorrect initialisation order which left m_secondReferenceFrequency undefined unless explicitly set; use a much lower diagonal weight for the unanchored subsequence match, since we want to encourage roughly-diagonal behaviour
author Chris Cannam
date Fri, 17 Jul 2020 14:28:47 +0100
parents 320efced24c1
children e4715a35f7b0
files src/MatchVampPlugin.cpp src/SubsequenceMatchVampPlugin.cpp src/SubsequenceMatchVampPlugin.h
diffstat 3 files changed, 41 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/MatchVampPlugin.cpp	Fri Jul 17 14:25:36 2020 +0100
+++ b/src/MatchVampPlugin.cpp	Fri Jul 17 14:28:47 2020 +0100
@@ -61,7 +61,7 @@
     m_defaultParams(defaultStepTime),
     m_feParams(inputSampleRate),
     m_defaultFeParams(44100), // parameter descriptors can't depend on samplerate
-    m_secondReferenceFrequency(m_defaultFeParams.referenceFrequency),
+    m_secondReferenceFrequency(m_defaultFeParams.referenceFrequency), // must be declared/initialised after m_defaultFeParams
     m_fcParams(),
     m_defaultFcParams(),
     m_dParams(),
--- a/src/SubsequenceMatchVampPlugin.cpp	Fri Jul 17 14:25:36 2020 +0100
+++ b/src/SubsequenceMatchVampPlugin.cpp	Fri Jul 17 14:28:47 2020 +0100
@@ -36,8 +36,9 @@
 static float sampleRateMin = 5000.f;
 
 static float defaultStepTime = 0.020f;
-
 static int defaultCoarseDownsample = 50;
+static double defaultAnchoredDiagonalWeight = 2.0;
+static double defaultSubsequenceDiagonalWeight = 0.75;
 
 SubsequenceMatchVampPlugin::SubsequenceMatchVampPlugin(float inputSampleRate) :
     Plugin(inputSampleRate),
@@ -47,17 +48,30 @@
     m_coarseDownsample(defaultCoarseDownsample),
     m_serialise(false),
     m_smooth(false),
-    m_secondReferenceFrequency(m_defaultFeParams.referenceFrequency),
     m_channelCount(0),
     m_params(defaultStepTime),
     m_defaultParams(defaultStepTime),
     m_feParams(inputSampleRate),
     m_defaultFeParams(44100), // parameter descriptors can't depend on samplerate
+    m_secondReferenceFrequency(m_defaultFeParams.referenceFrequency), // must be declared/initialised after m_defaultFeParams
     m_fcParams(),
     m_defaultFcParams(),
     m_dParams(),
-    m_defaultDParams()
+    m_defaultDParams(),
+    m_fdParams(defaultStepTime),
+    m_defaultFdParams(defaultStepTime)
 {
+    // for the coarse subsequence span aligner:
+    m_fdParams.diagonalWeight = m_defaultFdParams.diagonalWeight =
+        defaultSubsequenceDiagonalWeight;
+
+    // for the MATCH phase following subsequence span identification:
+    m_params.diagonalWeight = m_defaultParams.diagonalWeight =
+        defaultAnchoredDiagonalWeight;
+
+    // and of course
+    m_fdParams.subsequence = m_defaultFdParams.subsequence = true;
+
     if (inputSampleRate < sampleRateMin) {
         cerr << "SubsequenceMatchVampPlugin::SubsequenceMatchVampPlugin: input sample rate "
              << inputSampleRate << " < min supported rate "
@@ -287,14 +301,24 @@
     list.push_back(desc);
 
     desc.identifier = "diagonalweight";
-    desc.name = "Diagonal weight";
-    desc.description = "Weight applied to cost of diagonal step relative to horizontal or vertical step. The default of 2.0 is good for gross tracking of quite different performances; closer to 1.0 produces a smoother path for performances more similar in tempo";
-    desc.minValue = 1.0;
+    desc.name = "Diagonal weight, anchored";
+    desc.description = "Weight applied to cost of diagonal step relative to horizontal or vertical step, during the anchored (non-subsequence) alignment step";
+    desc.minValue = 0.5;
     desc.maxValue = 2.0;
     desc.defaultValue = float(m_defaultParams.diagonalWeight);
     desc.isQuantized = false;
     desc.unit = "";
     list.push_back(desc);
+
+    desc.identifier = "diagonalweightsubsequence";
+    desc.name = "Diagonal weight, subsequence";
+    desc.description = "Weight applied to cost of diagonal step relative to horizontal or vertical step, during the coarse subsequence alignment step";
+    desc.minValue = 0.5;
+    desc.maxValue = 2.0;
+    desc.defaultValue = float(m_defaultFdParams.diagonalWeight);
+    desc.isQuantized = false;
+    desc.unit = "";
+    list.push_back(desc);
     
     desc.identifier = "smooth";
     desc.name = "Use path smoothing";
@@ -337,6 +361,8 @@
         return float(m_params.maxRunCount);
     } else if (name == "diagonalweight") {
         return float(m_params.diagonalWeight);
+    } else if (name == "diagonalweightsubsequence") {
+        return float(m_fdParams.diagonalWeight);
     } else if (name == "zonewidth") {
         return float(m_params.blockTime);
     } else if (name == "smooth") {
@@ -381,6 +407,8 @@
         m_params.maxRunCount = int(value + 0.1);
     } else if (name == "diagonalweight") {
         m_params.diagonalWeight = value;
+    } else if (name == "diagonalweightsubsequence") {
+        m_fdParams.diagonalWeight = value;
     } else if (name == "zonewidth") {
         m_params.blockTime = value;
     } else if (name == "smooth") {
@@ -640,10 +668,7 @@
 
     cerr << "SubsequenceMatchVampPlugin: reference downsampled sequence length = " << downsampledRef.size() << endl;
     
-    FullDTW::Parameters dtwParams(m_stepTime);
-    dtwParams.diagonalWeight = m_params.diagonalWeight;
-    dtwParams.subsequence = true;
-    FullDTW dtw(dtwParams, m_dParams);
+    FullDTW dtw(m_fdParams, m_dParams);
     
     FeatureSet returnFeatures;
     int featureSize = m_featureExtractors[0].getFeatureSize();
--- a/src/SubsequenceMatchVampPlugin.h	Fri Jul 17 14:25:36 2020 +0100
+++ b/src/SubsequenceMatchVampPlugin.h	Fri Jul 17 14:28:47 2020 +0100
@@ -30,6 +30,7 @@
 #include "FeatureExtractor.h"
 #include "FeatureConditioner.h"
 #include "DistanceMetric.h"
+#include "FullDTW.h"
 
 class SubsequenceMatchVampPlugin : public Vamp::Plugin
 {
@@ -73,7 +74,6 @@
     int m_coarseDownsample;
     bool m_serialise;
     bool m_smooth;
-    double m_secondReferenceFrequency;
 
     size_t m_channelCount;
     Vamp::RealTime m_startTime;
@@ -83,6 +83,7 @@
 
     FeatureExtractor::Parameters m_feParams;
     FeatureExtractor::Parameters m_defaultFeParams;
+    double m_secondReferenceFrequency;
 
     FeatureConditioner::Parameters m_fcParams;
     FeatureConditioner::Parameters m_defaultFcParams;
@@ -90,6 +91,9 @@
     DistanceMetric::Parameters m_dParams;
     DistanceMetric::Parameters m_defaultDParams;
 
+    FullDTW::Parameters m_fdParams;
+    FullDTW::Parameters m_defaultFdParams;
+    
     std::vector<FeatureExtractor> m_featureExtractors;
     std::vector<featureseq_t> m_features; // unconditioned features