librosa.feature.sync

librosa.feature.sync(data, idx, aggregate=None, pad=True, axis=-1)[source]

Synchronous aggregation of a multi-dimensional array between boundaries

Note

In order to ensure total coverage, boundary points may be added to idx.

If synchronizing a feature matrix against beat tracker output, ensure that frame index numbers are properly aligned and use the same hop length.

Parameters:

data : np.ndarray

multi-dimensional array of features

idx : iterable of ints or slices

Either an ordered array of boundary indices, or an iterable collection of slice objects.

aggregate : function

aggregation function (default: np.mean)

pad : boolean

If True, idx is padded to span the full range [0, data.shape[axis]]

axis : int

The axis along which to aggregate data

Returns:

data_sync : ndarray

data_sync will have the same dimension as data, except that the axis coordinate will be reduced according to idx.

For example, a 2-dimensional data with axis=-1 should satisfy

data_sync[:, i] = aggregate(data[:, idx[i-1]:idx[i]], axis=-1)

Raises:

ParameterError

If the index set is not of consistent type (all slices or all integers)

Examples

Beat-synchronous CQT spectra

>>> y, sr = librosa.load(librosa.util.example_audio_file())
>>> tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
>>> cqt = librosa.cqt(y=y, sr=sr)

By default, use mean aggregation

>>> cqt_avg = librosa.util.sync(cqt, beats)

Use median-aggregation instead of mean

>>> cqt_med = librosa.util.sync(cqt, beats,
...                                aggregate=np.median)

Or sub-beat synchronization

>>> sub_beats = librosa.segment.subsegment(cqt, beats)
>>> cqt_med_sub = librosa.util.sync(cqt, sub_beats, aggregate=np.median)

Plot the results

>>> import matplotlib.pyplot as plt
>>> plt.figure()
>>> plt.subplot(3, 1, 1)
>>> librosa.display.specshow(librosa.logamplitude(cqt**2,
...                                               ref_power=np.max),
...                          x_axis='time')
>>> plt.colorbar(format='%+2.0f dB')
>>> plt.title('CQT power, shape={}'.format(cqt.shape))
>>> plt.subplot(3, 1, 2)
>>> librosa.display.specshow(librosa.logamplitude(cqt_med**2,
...                                               ref_power=np.max))
>>> plt.colorbar(format='%+2.0f dB')
>>> plt.title('Beat synchronous CQT power, '
...           'shape={}'.format(cqt_med.shape))
>>> plt.subplot(3, 1, 3)
>>> librosa.display.specshow(librosa.logamplitude(cqt_med_sub**2,
...                                               ref_power=np.max))
>>> plt.colorbar(format='%+2.0f dB')
>>> plt.title('Sub-beat synchronous CQT power, '
...           'shape={}'.format(cqt_med_sub.shape))
>>> plt.tight_layout()

(Source code)

../_images/librosa-feature-sync-1.png