def peak_pick(x, pre_max, post_max, pre_avg, post_avg, delta, wait):
if pre_max < <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if pre_avg < <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if delta < <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if wait < <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if post_max <= <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if post_avg <= <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>if x.ndim != <NUM_LIT:1>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>pre_max = valid_int(pre_max, cast=np.ceil)<EOL>post_max = valid_int(post_max, cast=np.ceil)<EOL>pre_avg = valid_int(pre_avg, cast=np.ceil)<EOL>post_avg = valid_int(post_avg, cast=np.ceil)<EOL>wait = valid_int(wait, cast=np.ceil)<EOL>max_length = pre_max + post_max<EOL>max_origin = np.ceil(<NUM_LIT:0.5> * (pre_max - post_max))<EOL>mov_max = scipy.ndimage.filters.maximum_filter1d(x, int(max_length),<EOL>mode='<STR_LIT>',<EOL>origin=int(max_origin),<EOL>cval=x.min())<EOL>avg_length = pre_avg + post_avg<EOL>avg_origin = np.ceil(<NUM_LIT:0.5> * (pre_avg - post_avg))<EOL>mov_avg = scipy.ndimage.filters.uniform_filter1d(x, int(avg_length),<EOL>mode='<STR_LIT>',<EOL>origin=int(avg_origin))<EOL>n = <NUM_LIT:0><EOL>while n - pre_avg < <NUM_LIT:0> and n < x.shape[<NUM_LIT:0>]:<EOL><INDENT>start = n - pre_avg<EOL>start = start if start > <NUM_LIT:0> else <NUM_LIT:0><EOL>mov_avg[n] = np.mean(x[start:n + post_avg])<EOL>n += <NUM_LIT:1><EOL><DEDENT>n = x.shape[<NUM_LIT:0>] - post_avg<EOL>n = n if n > <NUM_LIT:0> else <NUM_LIT:0><EOL>while n < x.shape[<NUM_LIT:0>]:<EOL><INDENT>start = n - pre_avg<EOL>start = start if start > <NUM_LIT:0> else <NUM_LIT:0><EOL>mov_avg[n] = np.mean(x[start:n + post_avg])<EOL>n += <NUM_LIT:1><EOL><DEDENT>detections = x * (x == mov_max)<EOL>detections = detections * (detections >= (mov_avg + delta))<EOL>peaks = []<EOL>last_onset = -np.inf<EOL>for i in np.nonzero(detections)[<NUM_LIT:0>]:<EOL><INDENT>if i > last_onset + wait:<EOL><INDENT>peaks.append(i)<EOL>last_onset = i<EOL><DEDENT><DEDENT>return np.array(peaks)<EOL>
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()