librosa.util.peak_pick

librosa.util.peak_pick(x, pre_max, post_max, pre_avg, post_avg, delta, wait)[source]

Uses a flexible heuristic to pick peaks in a signal.

A sample n is selected as an peak if the corresponding x[n] fulfills the following three conditions:

  1. x[n] == max(x[n - pre_max:n + post_max])
  2. x[n] >= mean(x[n - pre_avg:n + post_avg]) + delta
  3. n - previous_n > wait

where previous_n is the last sample picked as a peak (greedily).

This implementation is based on [1] and [2].

[1]Boeck, Sebastian, Florian Krebs, and Markus Schedl. “Evaluating the Online Capabilities of Onset Detection Methods.” ISMIR. 2012.
[2]https://github.com/CPJKU/onset_detection/blob/master/onset_program.py
Parameters:
x : np.ndarray [shape=(n,)]

input signal to peak picks from

pre_max : int >= 0 [scalar]

number of samples before n over which max is computed

post_max : int >= 1 [scalar]

number of samples after n over which max is computed

pre_avg : int >= 0 [scalar]

number of samples before n over which mean is computed

post_avg : int >= 1 [scalar]

number of samples after n over which mean is computed

delta : float >= 0 [scalar]

threshold offset for mean

wait : int >= 0 [scalar]

number of samples to wait after picking a peak

Returns:
peaks : np.ndarray [shape=(n_peaks,), dtype=int]

indices of peaks in x

Raises:
ParameterError

If any input lies outside its defined range

Examples

>>> y, sr = librosa.load(librosa.util.example_audio_file(), duration=15)
>>> onset_env = librosa.onset.onset_strength(y=y, sr=sr,
...                                          hop_length=512,
...                                          aggregate=np.median)
>>> peaks = librosa.util.peak_pick(onset_env, 3, 3, 3, 5, 0.5, 10)
>>> peaks
array([  4,  23,  73, 102, 142, 162, 182, 211, 261, 301, 320,
       331, 348, 368, 382, 396, 411, 431, 446, 461, 476, 491,
       510, 525, 536, 555, 570, 590, 609, 625, 639])
>>> import matplotlib.pyplot as plt
>>> times = librosa.frames_to_time(np.arange(len(onset_env)),
...                                sr=sr, hop_length=512)
>>> plt.figure()
>>> ax = plt.subplot(2, 1, 2)
>>> D = librosa.stft(y)
>>> librosa.display.specshow(librosa.amplitude_to_db(D, ref=np.max),
...                          y_axis='log', x_axis='time')
>>> plt.subplot(2, 1, 1, sharex=ax)
>>> plt.plot(times, onset_env, alpha=0.8, label='Onset strength')
>>> plt.vlines(times[peaks], 0,
...            onset_env.max(), color='r', alpha=0.8,
...            label='Selected peaks')
>>> plt.legend(frameon=True, framealpha=0.8)
>>> plt.axis('tight')
>>> plt.tight_layout()

(Source code)

../_images/librosa-util-peak_pick-1.png