def interval_histogram_comb(activations, alpha, min_tau=1, max_tau=None): """ Compute the interval histogram of the given (beat) activation function via a bank of resonating comb filters as in [1]_. Parameters ---------- activations : numpy array Beat activation function. alpha : float or numpy array Scaling factor for the comb filter; if only a single value is given, the same scaling factor for all delays is assumed. min_tau : int, optional Minimal delay for the comb filter [frames]. max_tau : int, optional Maximal delta for comb filter [frames]. Returns ------- histogram_bins : numpy array Bins of the tempo histogram. histogram_delays : numpy array Corresponding delays [frames]. References ---------- .. [1] Sebastian Böck, Florian Krebs and Gerhard Widmer, "Accurate Tempo Estimation based on Recurrent Neural Networks and Resonating Comb Filters", Proceedings of the 16th International Society for Music Information Retrieval Conference (ISMIR), 2015. """ # import comb filter from madmom.audio.comb_filters import CombFilterbankProcessor # set the maximum delay if max_tau is None: max_tau = len(activations) - min_tau # get the range of taus taus = np.arange(min_tau, max_tau + 1) # create a comb filter bank instance cfb = CombFilterbankProcessor('backward', taus, alpha) if activations.ndim in (1, 2): # apply a bank of comb filters act = cfb.process(activations) # determine the tau with the highest value for each time step act_max = act == np.max(act, axis=-1)[..., np.newaxis] # sum up these maxima weighted by the activation value to yield the # histogram bin values histogram_bins = np.sum(act * act_max, axis=0) else: raise NotImplementedError('too many dimensions for comb filter ' 'interval histogram calculation.') # return the histogram return histogram_bins, taus
def interval_histogram_comb(activations, alpha, min_tau=1, max_tau=None): """ Compute the interval histogram of the given activation function via a bank of comb filters. :param activations: the activation function :param alpha: scaling factor for the comb filter :param min_tau: minimal delta for correlation function [frames] :param max_tau: maximal delta for correlation function [frames] :return: histogram "Accurate Tempo Estimation based on Recurrent Neural Networks and Resonating Comb Filters" Sebastian Böck, Florian Krebs and Gerhard Widmer Proceedings of the 16th International Society for Music Information Retrieval Conference (ISMIR), 2015. """ # import comb filter from madmom.audio.comb_filters import CombFilterbankProcessor # set the maximum delay if max_tau is None: max_tau = len(activations) - min_tau # get the range of taus taus = np.arange(min_tau, max_tau + 1) # create a comb filter bank instance cfb = CombFilterbankProcessor('backward', taus, alpha) # activations = np.minimum(0.9, activations) if activations.ndim == 1: # apply a bank of comb filters act = cfb.process(activations) # determine the tau with the highest value for each time step # sum up the maxima to yield the histogram bin values histogram_bins = np.sum(act * (act == np.max(act, axis=0)), axis=1) elif activations.ndim == 2: histogram_bins = np.zeros_like(taus) # do the same as above for all bands for i in range(activations.shape[1]): # apply a bank of comb filters act = cfb.process(activations[:, i]) # determine the tau with the highest value for each time step # sum up the maxima to yield the histogram bin values histogram_bins += np.sum(act * (act == np.max(act, axis=0)), axis=1) else: raise NotImplementedError('too many dimensions for comb filter tempo ' 'detection.') # return the histogram return histogram_bins, taus