librosa.util.sync¶
-
librosa.util.
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)
Notes
This function caches at level 40.
Examples
Beat-synchronous CQT spectra
>>> y, sr = librosa.load(librosa.util.example_audio_file()) >>> tempo, beats = librosa.beat.beat_track(y=y, sr=sr, trim=False) >>> cqt = librosa.cqt(y=y, sr=sr) >>> beats = librosa.util.fix_frames(beats, x_max=cqt.shape[1])
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) >>> sub_beats = librosa.util.fix_frames(sub_beats, x_max=cqt.shape[1]) >>> cqt_med_sub = librosa.util.sync(cqt, sub_beats, aggregate=np.median)
Plot the results
>>> import matplotlib.pyplot as plt >>> beat_t = librosa.frames_to_time(beats, sr=sr) >>> subbeat_t = librosa.frames_to_time(sub_beats, sr=sr) >>> plt.figure() >>> plt.subplot(3, 1, 1) >>> librosa.display.specshow(librosa.amplitude_to_db(cqt, ... ref=np.max), ... x_axis='time') >>> plt.title('CQT power, shape={}'.format(cqt.shape)) >>> plt.subplot(3, 1, 2) >>> librosa.display.specshow(librosa.amplitude_to_db(cqt_med, ... ref=np.max), ... x_coords=beat_t, x_axis='time') >>> plt.title('Beat synchronous CQT power, ' ... 'shape={}'.format(cqt_med.shape)) >>> plt.subplot(3, 1, 3) >>> librosa.display.specshow(librosa.amplitude_to_db(cqt_med_sub, ... ref=np.max), ... x_coords=subbeat_t, x_axis='time') >>> plt.title('Sub-beat synchronous CQT power, ' ... 'shape={}'.format(cqt_med_sub.shape)) >>> plt.tight_layout()