librosa.core.dtw

librosa.core.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:
X : np.ndarray [shape=(K, N)]

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

Y : np.ndarray [shape=(K, M)]

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

C : np.ndarray [shape=(N, M)]

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

metric : str

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

step_sizes_sigma : np.ndarray [shape=[n, 2]]

Specifies allowed step sizes as used by the dtw.

weights_add : np.ndarray [shape=[n, ]]

Additive weights to penalize certain step sizes.

weights_mul : np.ndarray [shape=[n, ]]

Multiplicative weights to penalize certain step sizes.

subseq : binary

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

backtrack : binary

Enable backtracking in accumulated cost matrix.

global_constraints : binary

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

band_rad : float

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

Returns:
D : np.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.

wp : np.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.

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.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()

(Source code)

../_images/librosa-core-dtw-1.png