Caution

You're reading an old version of this documentation. If you want up-to-date information, please have a look at 0.9.1.

librosa.sequence.dtw

librosa.sequence.dtw(X=None, Y=None, C=None, metric='euclidean', step_sizes_sigma=None, weights_add=None, weights_mul=None, subseq=False, backtrack=True, global_constraints=False, band_rad=0.25)[source]

Dynamic time warping (DTW).

This function performs a DTW and path backtracking on two sequences. We follow the nomenclature and algorithmic approach as described in [1].

1

Meinard Mueller Fundamentals of Music Processing — Audio, Analysis, Algorithms, Applications Springer Verlag, ISBN: 978-3-319-21944-8, 2015.

Parameters
Xnp.ndarray [shape=(K, N)]

audio feature matrix (e.g., chroma features)

Ynp.ndarray [shape=(K, M)]

audio feature matrix (e.g., chroma features)

Cnp.ndarray [shape=(N, M)]

Precomputed distance matrix. If supplied, X and Y must not be supplied and metric will be ignored.

metricstr

Identifier for the cost-function as documented in scipy.spatial.distance.cdist()

step_sizes_sigmanp.ndarray [shape=[n, 2]]

Specifies allowed step sizes as used by the dtw.

weights_addnp.ndarray [shape=[n, ]]

Additive weights to penalize certain step sizes.

weights_mulnp.ndarray [shape=[n, ]]

Multiplicative weights to penalize certain step sizes.

subseqbinary

Enable subsequence DTW, e.g., for retrieval tasks.

backtrackbinary

Enable backtracking in accumulated cost matrix.

global_constraintsbinary

Applies global constraints to the cost matrix C (Sakoe-Chiba band).

band_radfloat

The Sakoe-Chiba band radius (1/2 of the width) will be int(radius*min(C.shape)).

Returns
Dnp.ndarray [shape=(N,M)]

accumulated cost matrix. D[N,M] is the total alignment cost. When doing subsequence DTW, D[N,:] indicates a matching function.

wpnp.ndarray [shape=(N,2)]

Warping path with index pairs. Each row of the array contains an index pair n,m). Only returned when backtrack is True.

Raises
ParameterError

If you are doing diagonal matching and Y is shorter than X or if an incompatible combination of X, Y, and C are supplied.

If your input dimensions are incompatible.

If the cost matrix has NaN values.

Examples

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> y, sr = librosa.load(librosa.util.example_audio_file(), offset=10, duration=15)
>>> X = librosa.feature.chroma_cens(y=y, sr=sr)
>>> noise = np.random.rand(X.shape[0], 200)
>>> Y = np.concatenate((noise, noise, X, noise), axis=1)
>>> D, wp = librosa.sequence.dtw(X, Y, subseq=True)
>>> plt.subplot(2, 1, 1)
>>> librosa.display.specshow(D, x_axis='frames', y_axis='frames')
>>> plt.title('Database excerpt')
>>> plt.plot(wp[:, 1], wp[:, 0], label='Optimal path', color='y')
>>> plt.legend()
>>> plt.subplot(2, 1, 2)
>>> plt.plot(D[-1, :] / wp.shape[0])
>>> plt.xlim([0, Y.shape[1]])
>>> plt.ylim([0, 2])
>>> plt.title('Matching cost function')
>>> plt.tight_layout()
>>> plt.show()
../_images/librosa-sequence-dtw-1.png