@cache(level=<NUM_LIT:30>)<EOL>def tempo(y=None, sr=<NUM_LIT>, onset_envelope=None, hop_length=<NUM_LIT>, start_bpm=<NUM_LIT>,<EOL>std_bpm=<NUM_LIT:1.0>, ac_size=<NUM_LIT>, max_tempo=<NUM_LIT>, aggregate=np.mean):
if start_bpm <= <NUM_LIT:0>:<EOL><INDENT>raise ParameterError('<STR_LIT>')<EOL><DEDENT>win_length = np.asscalar(core.time_to_frames(ac_size, sr=sr,<EOL>hop_length=hop_length))<EOL>tg = tempogram(y=y, sr=sr,<EOL>onset_envelope=onset_envelope,<EOL>hop_length=hop_length,<EOL>win_length=win_length)<EOL>if aggregate is not None:<EOL><INDENT>tg = aggregate(tg, axis=<NUM_LIT:1>, keepdims=True)<EOL><DEDENT>bpms = core.tempo_frequencies(tg.shape[<NUM_LIT:0>], hop_length=hop_length, sr=sr)<EOL>prior = np.exp(-<NUM_LIT:0.5> * ((np.log2(bpms) - np.log2(start_bpm)) / std_bpm)**<NUM_LIT:2>)<EOL>if max_tempo is not None:<EOL><INDENT>max_idx = np.argmax(bpms < max_tempo)<EOL>prior[:max_idx] = <NUM_LIT:0><EOL><DEDENT>best_period = np.argmax(tg * prior[:, np.newaxis], axis=<NUM_LIT:0>)<EOL>tempi = bpms[best_period]<EOL>tempi[best_period == <NUM_LIT:0>] = start_bpm<EOL>return tempi<EOL>
Estimate the tempo (beats per minute)

    Parameters
    ----------
    y : np.ndarray [shape=(n,)] or None
        audio time series

    sr : number > 0 [scalar]
        sampling rate of the time series

    onset_envelope    : np.ndarray [shape=(n,)]
        pre-computed onset strength envelope

    hop_length : int > 0 [scalar]
        hop length of the time series

    start_bpm : float [scalar]
        initial guess of the BPM

    std_bpm : float > 0 [scalar]
        standard deviation of tempo distribution

    ac_size : float > 0 [scalar]
        length (in seconds) of the auto-correlation window

    max_tempo : float > 0 [scalar, optional]
        If provided, only estimate tempo below this threshold

    aggregate : callable [optional]
        Aggregation function for estimating global tempo.
        If `None`, then tempo is estimated independently for each frame.

    Returns
    -------
    tempo : np.ndarray [scalar]
        estimated tempo (beats per minute)

    See Also
    --------
    librosa.onset.onset_strength
    librosa.feature.tempogram

    Notes
    -----
    This function caches at level 30.

    Examples
    --------
    >>> # Estimate a static tempo
    >>> y, sr = librosa.load(librosa.util.example_audio_file())
    >>> onset_env = librosa.onset.onset_strength(y, sr=sr)
    >>> tempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)
    >>> tempo
    array([129.199])

    >>> # Or a dynamic tempo
    >>> dtempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr,
    ...                             aggregate=None)
    >>> dtempo
    array([ 143.555,  143.555,  143.555, ...,  161.499,  161.499,
            172.266])


    Plot the estimated tempo against the onset autocorrelation

    >>> import matplotlib.pyplot as plt
    >>> # Convert to scalar
    >>> tempo = np.asscalar(tempo)
    >>> # Compute 2-second windowed autocorrelation
    >>> hop_length = 512
    >>> ac = librosa.autocorrelate(onset_env, 2 * sr // hop_length)
    >>> freqs = librosa.tempo_frequencies(len(ac), sr=sr,
    ...                                   hop_length=hop_length)
    >>> # Plot on a BPM axis.  We skip the first (0-lag) bin.
    >>> plt.figure(figsize=(8,4))
    >>> plt.semilogx(freqs[1:], librosa.util.normalize(ac)[1:],
    ...              label='Onset autocorrelation', basex=2)
    >>> plt.axvline(tempo, 0, 1, color='r', alpha=0.75, linestyle='--',
    ...            label='Tempo: {:.2f} BPM'.format(tempo))
    >>> plt.xlabel('Tempo (BPM)')
    >>> plt.grid()
    >>> plt.title('Static tempo estimation')
    >>> plt.legend(frameon=True)
    >>> plt.axis('tight')

    Plot dynamic tempo estimates over a tempogram

    >>> plt.figure()
    >>> tg = librosa.feature.tempogram(onset_envelope=onset_env, sr=sr,
    ...                                hop_length=hop_length)
    >>> librosa.display.specshow(tg, x_axis='time', y_axis='tempo')
    >>> plt.plot(librosa.frames_to_time(np.arange(len(dtempo))), dtempo,
    ...          color='w', linewidth=1.5, label='Tempo estimate')
    >>> plt.title('Dynamic tempo estimation')
    >>> plt.legend(frameon=True, framealpha=0.75)