Mercurial > hg > match-vamp
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