
    0;ji*                      d Z ddlmZ ddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddl m!Z!m"Z"m#Z# dZ$g dZ%ddddddZ& ed          dd!            Z'dd"dd&Z(dd'Z)dd)Z*dd*dd/Z+dd3Z,dd*dd4Z-ddd5d6dd=Z.ed>d>d>d?ddE            Z/ed>d>dFddI            Z/dddd?ddKZ/ edL          ej0        ddddMddT            Z1ej2        dU             Z3ej2        dV             Z4 ej5        g dWdXd5d5Y          dZ             Z6 ej5        g dWdXd5d5Y          d[             Z7dd*dd\Z8dd*dd]Z9 ej5        g d^d_d5d5`          da             Z:d5ddbddjZ; edL          dkddlddq            Z<dej=        drdduZ>dddd5dvdd|Z? edL          dd5dd}dd            Z@dddddZAddZBddddZCdddddZD ejE        d5d5`          ddddd            ZFdddddZG edeejH        ejI        jJ        f                   ZKed>d>ddd            ZLed>d>ddd            ZLdddddZLdd*ddZMejN        dddZOej=        dddZP ejE        d5d5`          d             ZQdd*ddZR ejE        d5d5`          d             ZSdd*ddZT ejU        ddgd5d5d          dd            ZVeeWdf         ZX edeeXejH        f                   ZYdddZZ ejU        ddgd5d5d          dd            Z[ee\ddf         Z]ed>ddd            Z^ed>ddd            Z^ddddZ^dS )zUtility functions    )annotationsN)
as_strided   )cache   )ParameterError)
Deprecated)	DTypeLike)
AnyCallableListDictOptionalSequenceTupleTypeVarUnionoverload)Literal)_SequenceLike_FloatLike_co_ComplexLike_coi   )MAX_MEM_BLOCKframe
pad_center	expand_to
fix_lengthvalid_audio	valid_intis_positive_intvalid_intervals
fix_frames	axis_sortlocalmaxlocalmin	normalize	peak_picksparsify_rowsshearstackfill_off_diagonalindex_to_slicesyncsoftmaskbuf_to_floattinycyclic_gradient	dtype_r2c	dtype_c2rcount_unique	is_uniqueabs2phasorF)axis	writeablesubokx
np.ndarrayframe_lengthint
hop_lengthr9   r:   boolr;   returnc                  t          j        | d|          } | j        |         |k     r"t          d| j        |         dd|d          |dk     rt          d|d          | j        t          | j        |         g          z   }t          | j                  }||xx         |dz
  z  cc<   t          |          t          |g          z   }t          | ||||          }	|d	k     r|dz
  }
n|dz   }
t          j        |	d
|
          }	t          d          g|	j
        z  }t          d	d|          ||<   |	t          |                   S )a  Slice a data array into (overlapping) frames.

    This implementation uses low-level stride manipulation to avoid
    making a copy of the data.  The resulting frame representation
    is a new view of the same input data.

    For example, a one-dimensional input ``x = [0, 1, 2, 3, 4, 5, 6]``
    can be framed with frame length 3 and hop length 2 in two ways.
    The first (``axis=-1``), results in the array ``x_frames``::

        [[0, 2, 4],
         [1, 3, 5],
         [2, 4, 6]]

    where each column ``x_frames[:, i]`` contains a contiguous slice of
    the input ``x[i * hop_length : i * hop_length + frame_length]``.

    The second way (``axis=0``) results in the array ``x_frames``::

        [[0, 1, 2],
         [2, 3, 4],
         [4, 5, 6]]

    where each row ``x_frames[i]`` contains a contiguous slice of the input.

    This generalizes to higher dimensional inputs, as shown in the examples below.
    In general, the framing operation increments by 1 the number of dimensions,
    adding a new "frame axis" either before the framing axis (if ``axis < 0``)
    or after the framing axis (if ``axis >= 0``).

    Parameters
    ----------
    x : np.ndarray
        Array to frame
    frame_length : int > 0 [scalar]
        Length of the frame
    hop_length : int > 0 [scalar]
        Number of steps to advance between frames
    axis : int
        The axis along which to frame.
    writeable : bool
        If ``False``, then the framed view of ``x`` is read-only.
        If ``True``, then the framed view is read-write.  Note that writing to the framed view
        will also write to the input array ``x`` in this case.
    subok : bool
        If True, sub-classes will be passed-through, otherwise the returned array will be
        forced to be a base-class array (default).

    Returns
    -------
    x_frames : np.ndarray [shape=(..., frame_length, N_FRAMES, ...)]
        A framed view of ``x``, for example with ``axis=-1`` (framing on the last dimension)::

            x_frames[..., j] == x[..., j * hop_length : j * hop_length + frame_length]

        If ``axis=0`` (framing on the first dimension), then::

            x_frames[j] = x[j * hop_length : j * hop_length + frame_length]

    Raises
    ------
    ParameterError
        If ``x.shape[axis] < frame_length``, there is not enough data to fill one frame.

        If ``hop_length < 1``, frames cannot advance.

    See Also
    --------
    numpy.lib.stride_tricks.as_strided

    Examples
    --------
    Extract 2048-sample frames from monophonic signal with a hop of 64 samples per frame

    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> frames = librosa.util.frame(y, frame_length=2048, hop_length=64)
    >>> frames
    array([[-1.407e-03, -2.604e-02, ..., -1.795e-05, -8.108e-06],
           [-4.461e-04, -3.721e-02, ..., -1.573e-05, -1.652e-05],
           ...,
           [ 7.960e-02, -2.335e-01, ..., -6.815e-06,  1.266e-05],
           [ 9.568e-02, -1.252e-01, ...,  7.397e-06, -1.921e-05]],
          dtype=float32)
    >>> y.shape
    (117601,)

    >>> frames.shape
    (2048, 1806)

    Or frame along the first axis instead of the last:

    >>> frames = librosa.util.frame(y, frame_length=2048, hop_length=64, axis=0)
    >>> frames.shape
    (1806, 2048)

    Frame a stereo signal:

    >>> y, sr = librosa.load(librosa.ex('trumpet', hq=True), mono=False)
    >>> y.shape
    (2, 117601)
    >>> frames = librosa.util.frame(y, frame_length=2048, hop_length=64)
    (2, 2048, 1806)

    Carve an STFT into fixed-length patches of 32 frames with 50% overlap

    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> S = np.abs(librosa.stft(y))
    >>> S.shape
    (1025, 230)
    >>> S_patch = librosa.util.frame(S, frame_length=32, hop_length=16)
    >>> S_patch.shape
    (1025, 32, 13)
    >>> # The first patch contains the first 32 frames of S
    >>> np.allclose(S_patch[:, :, 0], S[:, :32])
    True
    >>> # The second patch contains frames 16 to 16+32=48, and so on
    >>> np.allclose(S_patch[:, :, 1], S[:, 16:48])
    True
    F)copyr;   zInput is too short (n=dz) for frame_length=r   zInvalid hop_length: )stridesshaper;   r:   r   r8   N)nparrayrG   r   rF   tuplelistr   moveaxisslicendim)r<   r>   r@   r9   r:   r;   out_stridesx_shape_trimmed	out_shapexwtarget_axisslicess               L/root/voice-cloning/.venv/lib/python3.11/site-packages/librosa/util/utils.pyr   r   G   sz   F 	e,,,Awt}|##YQWT]YYYYYY
 
 	
 A~~BJBBBCCC )eQYt_$5666K 17mmOD\A--o&&~)>)>>I		;iu	
 
 
B axxQhQh	R[	)	)B Dkk]RW$FD*--F4LeFmm       )levelyc                l   t          | t          j                  st          d          t          j        | j        t          j                  st          d          | j        dk    rt          d| j                   t          j	        |           
                                st          d          dS )a  Determine whether a variable contains valid audio data.

    The following conditions must be satisfied:

    - ``type(y)`` is ``np.ndarray``
    - ``y.dtype`` is floating-point
    - ``y.ndim != 0`` (must have at least one dimension)
    - ``np.isfinite(y).all()`` samples must be all finite values

    Parameters
    ----------
    y : np.ndarray
        The input data to validate

    Returns
    -------
    valid : bool
        True if all tests pass

    Raises
    ------
    ParameterError
        In any of the conditions specified above fails

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

    Examples
    --------
    We can make an array that can be interpreted as an audio signal

    >>> y = np.random.randn(5000)
    >>> librosa.util.valid_audio(y)
    True

    If we insert a non-finite sample value somewhere, it will fail

    >>> y[5] = np.nan
    >>> librosa.util.valid_audio(y)
    ...
    ParameterError: Audio buffer is not finite everywhere

    See Also
    --------
    numpy.float32
    z(Audio data must be of type numpy.ndarrayz!Audio data must be floating-pointr   z;Audio data must be at least one-dimensional, given y.shape=z%Audio buffer is not finite everywhereT)
isinstancerH   ndarrayr   
issubdtypedtypefloatingrN   rG   isfiniteall)rY   s    rU   r   r      s    b a$$ IGHHH="+.. B@AAAv{{S!'SS
 
 	
 ;q>> FDEEE4rV   castfloatrc   "Optional[Callable[[float], float]]c                   |t           j        }t          |          st          d          t	           ||                     S )a  Ensure that an input value is integer-typed.
    This is primarily useful for ensuring integrable-valued
    array indices.

    Parameters
    ----------
    x : number
        A scalar value to be cast to int
    cast : function [optional]
        A function to modify ``x`` before casting.
        Default: `np.floor`

    Returns
    -------
    x_int : int
        ``x_int = int(cast(x))``

    Raises
    ------
    ParameterError
        If ``cast`` is provided and is not callable.
    Nzcast parameter must be callable)rH   floorcallabler   r?   )r<   rc   s     rU   r   r   /  sB    . |xD>> @>???ttAww<<rV   c                P    t          | t          t          j        f          o| dk    S )zCheck that x is a positive integer, i.e. 1 or greater.

    Parameters
    ----------
    x : number

    Returns
    -------
    positive : bool
    r   )r[   r?   rH   integerr<   s    rU   r    r    O  s$     a#rz*++7Q7rV   	intervalsc                    | j         dk    s| j        d         dk    rt          d          t          j        | dddf         | dddf         k              rt          d|  d          d	S )
a  Ensure that an array is a valid representation of time intervals:

        - intervals.ndim == 2
        - intervals.shape[1] == 2
        - intervals[i, 0] <= intervals[i, 1] for all i

    Parameters
    ----------
    intervals : np.ndarray [shape=(n, 2)]
        set of time intervals

    Returns
    -------
    valid : bool
        True if ``intervals`` passes validation.
    r   r8   z intervals must have shape (n, 2)Nr   r   z
intervals=z! must have non-negative durationsT)rN   rG   r   rH   any)rl   s    rU   r!   r!   ^  s    " ~iob1Q66?@@@	vi1o	!!!Q$/00 XV)VVVWWW4rV   r9   datasizekwargsr   c                  |                     dd           | j        |         }t          ||z
  dz            }dg| j        z  }|t          ||z
  |z
            f||<   |dk     rt	          d|dd|dd	          t          j        | |fi |S )
a(  Pad an array to a target length along a target axis.

    This differs from `np.pad` by centering the data prior to padding,
    analogous to `str.center`

    Examples
    --------
    >>> # Generate a vector
    >>> data = np.ones(5)
    >>> librosa.util.pad_center(data, size=10, mode='constant')
    array([ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.])

    >>> # Pad a matrix along its first dimension
    >>> data = np.ones((3, 5))
    >>> librosa.util.pad_center(data, size=7, axis=0)
    array([[ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])
    >>> # Or its second dimension
    >>> librosa.util.pad_center(data, size=7, axis=1)
    array([[ 0.,  1.,  1.,  1.,  1.,  1.,  0.],
           [ 0.,  1.,  1.,  1.,  1.,  1.,  0.],
           [ 0.,  1.,  1.,  1.,  1.,  1.,  0.]])

    Parameters
    ----------
    data : np.ndarray
        Vector to be padded and centered
    size : int >= len(data) [scalar]
        Length to pad ``data``
    axis : int
        Axis along which to pad and center the data
    **kwargs : additional keyword arguments
        arguments passed to `np.pad`

    Returns
    -------
    data_padded : np.ndarray
        ``data`` centered and padded to length ``size`` along the
        specified axis

    Raises
    ------
    ParameterError
        If ``size < data.shape[axis]``

    See Also
    --------
    numpy.pad
    modeconstantr   r   r   r   zTarget size (rE   z) must be at least input size ())
setdefaultrG   r?   rN   r   rH   pad)rp   rq   r9   rr   nlpadlengthss          rU   r   r   x  s    r fj)))
4AqQDh"G3tax$//0GDMaxxIDIII1IIII
 
 	
 6$**6***rV   rN   axes1Union[int, slice, Sequence[int], Sequence[slice]]c                  	 t          |          }n # t          $ r t          |g          }Y nw xY wt          |          | j        k    rt	          d| d| j                   || j        k     rt	          d| j         d|           dg|z  }t          |          D ]\  }}| j        |         ||<   |                     |          S )a  Expand the dimensions of an input array with

    Parameters
    ----------
    x : np.ndarray
        The input array
    ndim : int
        The number of dimensions to expand to.  Must be at least ``x.ndim``
    axes : int or slice
        The target axis or axes to preserve from x.
        All other axes will have length 1.

    Returns
    -------
    x_exp : np.ndarray
        The expanded version of ``x``, satisfying the following:
            ``x_exp[axes] == x``
            ``x_exp.ndim == ndim``

    See Also
    --------
    np.expand_dims

    Examples
    --------
    Expand a 1d array into an (n, 1) shape

    >>> x = np.arange(3)
    >>> librosa.util.expand_to(x, ndim=2, axes=0)
    array([[0],
       [1],
       [2]])

    Expand a 1d array into a (1, n) shape

    >>> librosa.util.expand_to(x, ndim=2, axes=1)
    array([[0, 1, 2]])

    Expand a 2d array into (1, n, m, 1) shape

    >>> x = np.vander(np.arange(3))
    >>> librosa.util.expand_to(x, ndim=4, axes=[1,2]).shape
    (1, 3, 3, 1)
    zShape mismatch between axes=z and input x.shape=zCannot expand x.shape=z to fewer dimensions ndim=r   )rJ   	TypeErrorlenrN   r   rG   	enumeratereshape)r<   rN   r}   axes_tuprG   iaxis          rU   r   r     s    b!;; ! ! !$==! 8}}Q8QQQQ
 
 	
 af}}NQWNNNN
 
 	
 sTzEH%%    3WQZc

99Us    //c               4   |                     dd           | j        |         }||k    r@t          d          g| j        z  }t          d|          ||<   | t	          |                   S ||k     r(dg| j        z  }d||z
  f||<   t          j        | |fi |S | S )am  Fix the length an array ``data`` to exactly ``size`` along a target axis.

    If ``data.shape[axis] < n``, pad according to the provided kwargs.
    By default, ``data`` is padded with trailing zeros.

    Examples
    --------
    >>> y = np.arange(7)
    >>> # Default: pad with zeros
    >>> librosa.util.fix_length(y, size=10)
    array([0, 1, 2, 3, 4, 5, 6, 0, 0, 0])
    >>> # Trim to a desired length
    >>> librosa.util.fix_length(y, size=5)
    array([0, 1, 2, 3, 4])
    >>> # Use edge-padding instead of zeros
    >>> librosa.util.fix_length(y, size=10, mode='edge')
    array([0, 1, 2, 3, 4, 5, 6, 6, 6, 6])

    Parameters
    ----------
    data : np.ndarray
        array to be length-adjusted
    size : int >= 0 [scalar]
        desired length of the array
    axis : int, <= data.ndim
        axis along which to fix length
    **kwargs : additional keyword arguments
        Parameters to ``np.pad``

    Returns
    -------
    data_fixed : np.ndarray [shape=data.shape]
        ``data`` either trimmed or padded to length ``size``
        along the specified axis.

    See Also
    --------
    numpy.pad
    rt   ru   Nr   rv   )rx   rG   rM   rN   rJ   rH   ry   )rp   rq   r9   rr   rz   rT   r|   s          rU   r   r   	  s    T fj)))
4A4xx++*Q~~tE&MM""	
T(TY&D1HvdG..v...KrV   Tx_minx_maxry   frames_SequenceLike[int]r   Optional[int]r   ry   c                  t          j        |           } t          j        | dk               rt          d          |r||t          j        | ||          } |rXg }||                    |           ||                    |           t          j        t          j        |          | f          } || | |k             } || | |k             } t          j        |                               t                    }|S )av  Fix a list of frames to lie within [x_min, x_max]

    Examples
    --------
    >>> # Generate a list of frame indices
    >>> frames = np.arange(0, 1000.0, 50)
    >>> frames
    array([   0.,   50.,  100.,  150.,  200.,  250.,  300.,  350.,
            400.,  450.,  500.,  550.,  600.,  650.,  700.,  750.,
            800.,  850.,  900.,  950.])
    >>> # Clip to span at most 250
    >>> librosa.util.fix_frames(frames, x_max=250)
    array([  0,  50, 100, 150, 200, 250])
    >>> # Or pad to span up to 2500
    >>> librosa.util.fix_frames(frames, x_max=2500)
    array([   0,   50,  100,  150,  200,  250,  300,  350,  400,
            450,  500,  550,  600,  650,  700,  750,  800,  850,
            900,  950, 2500])
    >>> librosa.util.fix_frames(frames, x_max=2500, pad=False)
    array([  0,  50, 100, 150, 200, 250, 300, 350, 400, 450, 500,
           550, 600, 650, 700, 750, 800, 850, 900, 950])

    >>> # Or starting away from zero
    >>> frames = np.arange(200, 500, 33)
    >>> frames
    array([200, 233, 266, 299, 332, 365, 398, 431, 464, 497])
    >>> librosa.util.fix_frames(frames)
    array([  0, 200, 233, 266, 299, 332, 365, 398, 431, 464, 497])
    >>> librosa.util.fix_frames(frames, x_max=500)
    array([  0, 200, 233, 266, 299, 332, 365, 398, 431, 464, 497,
           500])

    Parameters
    ----------
    frames : np.ndarray [shape=(n_frames,)]
        List of non-negative frame indices
    x_min : int >= 0 or None
        Minimum allowed frame index
    x_max : int >= 0 or None
        Maximum allowed frame index
    pad : boolean
        If ``True``, then ``frames`` is expanded to span the full range
        ``[x_min, x_max]``

    Returns
    -------
    fixed_frames : np.ndarray [shape=(n_fixed_frames,), dtype=int]
        Fixed frame indices, flattened and sorted

    Raises
    ------
    ParameterError
        If ``frames`` contains negative values
    r   zNegative frame index detected)
rH   asarrayrn   r   clipappendconcatenateuniqueastyper?   )r   r   r   ry   pad_datar   s         rU   r"   r"   D  s   z ZF	vfqj ><===  /!U%6..
 @OOE"""OOE"""H!5!5v >??%(%(6**11#66FMrV   .)r9   indexvalueSr   Literal[False]r   Optional[Callable[..., Any]]c                   d S N r   r9   r   r   s       rU   r#   r#     	     CrV   )r9   r   Literal[True]Tuple[np.ndarray, np.ndarray]c                   d S r   r   r   s       rU   r#   r#     r   rV   0Union[np.ndarray, Tuple[np.ndarray, np.ndarray]]c               `   |t           j        }| j        dk    rt          d           || t          j        d|z
  | j                            }t          j        |          }t          d          g| j        z  }|||<   |r| t          |                   |fS | t          |                   S )a6
  Sort an array along its rows or columns.

    Examples
    --------
    Visualize NMF output for a spectrogram S

    >>> # Sort the columns of W by peak frequency bin
    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> S = np.abs(librosa.stft(y))
    >>> W, H = librosa.decompose.decompose(S, n_components=64)
    >>> W_sort = librosa.util.axis_sort(W)

    Or sort by the lowest frequency bin

    >>> W_sort = librosa.util.axis_sort(W, value=np.argmin)

    Or sort the rows instead of the columns

    >>> W_sort_rows = librosa.util.axis_sort(W, axis=0)

    Get the sorting index also, and use it to permute the rows of H

    >>> W_sort, idx = librosa.util.axis_sort(W, index=True)
    >>> H_sort = H[idx, :]

    >>> import matplotlib.pyplot as plt
    >>> fig, ax = plt.subplots(nrows=2, ncols=2)
    >>> img_w = librosa.display.specshow(librosa.amplitude_to_db(W, ref=np.max),
    ...                                  y_axis='log', ax=ax[0, 0])
    >>> ax[0, 0].set(title='W')
    >>> ax[0, 0].label_outer()
    >>> img_act = librosa.display.specshow(H, x_axis='time', ax=ax[0, 1])
    >>> ax[0, 1].set(title='H')
    >>> ax[0, 1].label_outer()
    >>> librosa.display.specshow(librosa.amplitude_to_db(W_sort,
    ...                                                  ref=np.max),
    ...                          y_axis='log', ax=ax[1, 0])
    >>> ax[1, 0].set(title='W sorted')
    >>> librosa.display.specshow(H_sort, x_axis='time', ax=ax[1, 1])
    >>> ax[1, 1].set(title='H sorted')
    >>> ax[1, 1].label_outer()
    >>> fig.colorbar(img_w, ax=ax[:, 0], orientation='horizontal')
    >>> fig.colorbar(img_act, ax=ax[:, 1], orientation='horizontal')

    Parameters
    ----------
    S : np.ndarray [shape=(d, n)]
        Array to be sorted

    axis : int [scalar]
        The axis along which to compute the sorting values

        - ``axis=0`` to sort rows by peak column index
        - ``axis=1`` to sort columns by peak row index

    index : boolean [scalar]
        If true, returns the index array as well as the permuted data.

    value : function
        function to return the index corresponding to the sort order.
        Default: `np.argmax`.

    Returns
    -------
    S_sort : np.ndarray [shape=(d, n)]
        ``S`` with the columns or rows permuted in sorting order
    idx : np.ndarray (optional) [shape=(d,) or (n,)]
        If ``index == True``, the sorting index used to permute ``S``.
        Length of ``idx`` corresponds to the selected ``axis``.

    Raises
    ------
    ParameterError
        If ``S`` does not have exactly 2 dimensions (``S.ndim != 2``)
    Nr   z'axis_sort is only defined for 2D arraysr   ro   )rH   argmaxrN   r   modargsortrM   rJ   )r   r9   r   r   bin_idxidx
sort_slices          rU   r#   r#     s    d }	v{{FGGGeABF1t8QV44555G
*W

C++'JJt $z""#S((z""##rV   (   )normr9   	thresholdfillr   Optional[float]r   Optional[_FloatLike_co]r   Optional[bool]c                  |t          |           }n|dk    rt          d| d          |dvrt          d| d          t          j        t          j        |                     st          d          t          j        |                               t                    }d	}|| S |t          j        k    rt          j	        ||d
          }n|t          j         k    rt          j
        ||d
          }n|dk    r5|d
u rt          d          t          j        |dk    |d
|j                  }nt          j        t          |          t          j                  rJ|dk    rDt          j        ||z  |d
          d|z  z  }||j        d|z  z  }n3|j        |         d|z  z  }nt          dt%          |                     ||k     }t          j        |           }	|d||<   | |z  |	dd<   nL|r1t          j        ||<   | |z  |	dd<   ||	t          j        |	          <   nt          j        ||<   | |z  |	dd<   |	S )a  Normalize an array along a chosen axis.

    Given a norm (described below) and a target axis, the input
    array is scaled so that::

        norm(S, axis=axis) == 1

    For example, ``axis=0`` normalizes each column of a 2-d array
    by aggregating over the rows (0-axis).
    Similarly, ``axis=1`` normalizes each row of a 2-d array.

    This function also supports thresholding small-norm slices:
    any slice (i.e., row or column) with norm below a specified
    ``threshold`` can be left un-normalized, set to all-zeros, or
    filled with uniform non-zero values that normalize to 1.

    Note: the semantics of this function differ from
    `scipy.linalg.norm` in two ways: multi-dimensional arrays
    are supported, but matrix-norms are not.

    Parameters
    ----------
    S : np.ndarray
        The array to normalize

    norm : {np.inf, -np.inf, 0, float > 0, None}
        - `np.inf`  : maximum absolute value
        - `-np.inf` : minimum absolute value
        - `0`    : number of non-zeros (the support)
        - float  : corresponding l_p norm
            See `scipy.linalg.norm` for details.
        - None : no normalization is performed

    axis : int [scalar]
        Axis along which to compute the norm.

    threshold : number > 0 [optional]
        Only the columns (or rows) with norm at least ``threshold`` are
        normalized.

        By default, the threshold is determined from
        the numerical precision of ``S.dtype``.

    fill : None or bool
        If None, then columns (or rows) with norm below ``threshold``
        are left as is.

        If False, then columns (rows) with norm below ``threshold``
        are set to 0.

        If True, then columns (rows) with norm below ``threshold``
        are filled uniformly such that the corresponding norm is 1.

        .. note:: ``fill=True`` is incompatible with ``norm=0`` because
            no uniform vector exists with l0 "norm" equal to 1.

    Returns
    -------
    S_norm : np.ndarray [shape=S.shape]
        Normalized array

    Raises
    ------
    ParameterError
        If ``norm`` is not among the valid types defined above

        If ``S`` is not finite

        If ``fill=True`` and ``norm=0``

    See Also
    --------
    scipy.linalg.norm

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

    Examples
    --------
    >>> # Construct an example matrix
    >>> S = np.vander(np.arange(-2.0, 2.0))
    >>> S
    array([[-8.,  4., -2.,  1.],
           [-1.,  1., -1.,  1.],
           [ 0.,  0.,  0.,  1.],
           [ 1.,  1.,  1.,  1.]])
    >>> # Max (l-infinity)-normalize the columns
    >>> librosa.util.normalize(S)
    array([[-1.   ,  1.   , -1.   ,  1.   ],
           [-0.125,  0.25 , -0.5  ,  1.   ],
           [ 0.   ,  0.   ,  0.   ,  1.   ],
           [ 0.125,  0.25 ,  0.5  ,  1.   ]])
    >>> # Max (l-infinity)-normalize the rows
    >>> librosa.util.normalize(S, axis=1)
    array([[-1.   ,  0.5  , -0.25 ,  0.125],
           [-1.   ,  1.   , -1.   ,  1.   ],
           [ 0.   ,  0.   ,  0.   ,  1.   ],
           [ 1.   ,  1.   ,  1.   ,  1.   ]])
    >>> # l1-normalize the columns
    >>> librosa.util.normalize(S, norm=1)
    array([[-0.8  ,  0.667, -0.5  ,  0.25 ],
           [-0.1  ,  0.167, -0.25 ,  0.25 ],
           [ 0.   ,  0.   ,  0.   ,  0.25 ],
           [ 0.1  ,  0.167,  0.25 ,  0.25 ]])
    >>> # l2-normalize the columns
    >>> librosa.util.normalize(S, norm=2)
    array([[-0.985,  0.943, -0.816,  0.5  ],
           [-0.123,  0.236, -0.408,  0.5  ],
           [ 0.   ,  0.   ,  0.   ,  0.5  ],
           [ 0.123,  0.236,  0.408,  0.5  ]])

    >>> # Thresholding and filling
    >>> S[:, -1] = 1e-308
    >>> S
    array([[ -8.000e+000,   4.000e+000,  -2.000e+000,
              1.000e-308],
           [ -1.000e+000,   1.000e+000,  -1.000e+000,
              1.000e-308],
           [  0.000e+000,   0.000e+000,   0.000e+000,
              1.000e-308],
           [  1.000e+000,   1.000e+000,   1.000e+000,
              1.000e-308]])

    >>> # By default, small-norm columns are left untouched
    >>> librosa.util.normalize(S)
    array([[ -1.000e+000,   1.000e+000,  -1.000e+000,
              1.000e-308],
           [ -1.250e-001,   2.500e-001,  -5.000e-001,
              1.000e-308],
           [  0.000e+000,   0.000e+000,   0.000e+000,
              1.000e-308],
           [  1.250e-001,   2.500e-001,   5.000e-001,
              1.000e-308]])
    >>> # Small-norm columns can be zeroed out
    >>> librosa.util.normalize(S, fill=False)
    array([[-1.   ,  1.   , -1.   ,  0.   ],
           [-0.125,  0.25 , -0.5  ,  0.   ],
           [ 0.   ,  0.   ,  0.   ,  0.   ],
           [ 0.125,  0.25 ,  0.5  ,  0.   ]])
    >>> # Or set to constant with unit-norm
    >>> librosa.util.normalize(S, fill=True)
    array([[-1.   ,  1.   , -1.   ,  1.   ],
           [-0.125,  0.25 , -0.5  ,  1.   ],
           [ 0.   ,  0.   ,  0.   ,  1.   ],
           [ 0.125,  0.25 ,  0.5  ,  1.   ]])
    >>> # With an l1 norm instead of max-norm
    >>> librosa.util.normalize(S, norm=1, fill=True)
    array([[-0.8  ,  0.667, -0.5  ,  0.25 ],
           [-0.1  ,  0.167, -0.25 ,  0.25 ],
           [ 0.   ,  0.   ,  0.   ,  0.25 ],
           [ 0.1  ,  0.167,  0.25 ,  0.25 ]])
    Nr   z
threshold=z must be strictly positive)NFTzfill=z must be None or booleanzInput must be finiter   Tr9   keepdimsz*Cannot normalize with norm=0 and fill=True)r9   r   r^         ?g      zUnsupported norm: )r0   r   rH   ra   r`   absr   rd   infmaxminsumr^   r]   typenumberrq   rG   repr
empty_likenanisnan)
r   r   r9   r   r   mag	fill_normlength	small_idxSnorms
             rU   r&   r&     sr   F GG			aO)OOOPPP&&&CTCCCDDD6"+a..!! 53444 &))

5
!
!C I|	$666	"&$666	4<< !MNNNadTKKK	tDzz29	-	- 	@$((T	t<<<tL<TD[1II	$D4K8II >$t**>>??? "IM!E|yv:aaa	  Fyv:aaa!*bhuoo Fyv:aaaLrV   c                L    | d         | d         k    | d         | d         k    z  S )z*Numba stencil for local maxima computationr   r8   r   r   rk   s    rU   _localmax_stenr     '     aD1R5LQqTQqT\**rV   c                L    | d         | d         k     | d         | d         k    z  S )z*Numba stencil for local minima computationr   r8   r   r   rk   s    rU   _localmin_stenr     r   rV   )zvoid(int16[:], bool_[:])zvoid(int32[:], bool_[:])zvoid(int64[:], bool_[:])zvoid(float32[:], bool_[:])zvoid(float64[:], bool_[:])z(n)->(n))r   nopythonc                .    t          |           |dd<   dS )z+Vectorized wrapper for the localmax stencilN)r   r<   rY   s     rU   	_localmaxr          !AaaaDDDrV   c                .    t          |           |dd<   dS )z+Vectorized wrapper for the localmin stencilN)r   r   s     rU   	_localminr     r   rV   c                   |                      d|          }t          j        | t                    }|                     d|          }t	          ||           |d         |d         k    |d<   |S )a  Find local maxima in an array

    An element ``x[i]`` is considered a local maximum if the following
    conditions are met:

    - ``x[i] > x[i-1]``
    - ``x[i] >= x[i+1]``

    Note that the first condition is strict, and that the first element
    ``x[0]`` will never be considered as a local maximum.

    Examples
    --------
    >>> x = np.array([1, 0, 1, 2, -1, 0, -2, 1])
    >>> librosa.util.localmax(x)
    array([False, False, False,  True, False,  True, False,  True], dtype=bool)

    >>> # Two-dimensional example
    >>> x = np.array([[1,0,1], [2, -1, 0], [2, 1, 3]])
    >>> librosa.util.localmax(x, axis=0)
    array([[False, False, False],
           [ True, False, False],
           [False,  True,  True]], dtype=bool)
    >>> librosa.util.localmax(x, axis=1)
    array([[False, False,  True],
           [False, False,  True],
           [False, False,  True]], dtype=bool)

    Parameters
    ----------
    x : np.ndarray [shape=(d1,d2,...)]
        input vector or array
    axis : int
        axis along which to compute local maximality

    Returns
    -------
    m : np.ndarray [shape=x.shape, dtype=bool]
        indicator array of local maximality along ``axis``

    See Also
    --------
    localmin
    r8   r^   .r8   .)swapaxesrH   r   rA   r   )r<   r9   xilmaxlmaxis        rU   r$   r$   -  sp    \ 
B		B =$'''DMM"d##E b% [2g;.E'NKrV   c                   |                      d|          }t          j        | t                    }|                     d|          }t	          ||           |d         |d         k     |d<   |S )a  Find local minima in an array

    An element ``x[i]`` is considered a local minimum if the following
    conditions are met:

    - ``x[i] < x[i-1]``
    - ``x[i] <= x[i+1]``

    Note that the first condition is strict, and that the first element
    ``x[0]`` will never be considered as a local minimum.

    Examples
    --------
    >>> x = np.array([1, 0, 1, 2, -1, 0, -2, 1])
    >>> librosa.util.localmin(x)
    array([False,  True, False, False,  True, False,  True, False])

    >>> # Two-dimensional example
    >>> x = np.array([[1,0,1], [2, -1, 0], [2, 1, 3]])
    >>> librosa.util.localmin(x, axis=0)
    array([[False, False, False],
           [False,  True,  True],
           [False, False, False]])

    >>> librosa.util.localmin(x, axis=1)
    array([[False,  True, False],
           [False,  True, False],
           [False,  True, False]])

    Parameters
    ----------
    x : np.ndarray [shape=(d1,d2,...)]
        input vector or array
    axis : int
        axis along which to compute local minimality

    Returns
    -------
    m : np.ndarray [shape=x.shape, dtype=bool]
        indicator array of local minimality along ``axis``

    See Also
    --------
    localmax
    r8   r   r   r   )r   rH   r   rA   r   )r<   r9   r   lminlminis        rU   r%   r%   j  sp    ^ 
B		B =$'''DMM"d##E b% [2g;.E'NKrV   )zKvoid(float32[:], uint32, uint32, uint32, uint32, float32, uint32, bool_[:])zKvoid(float64[:], uint32, uint32, uint32, uint32, float32, uint32, bool_[:])zIvoid(int32[:], uint32, uint32, uint32, uint32, float32, uint32, bool_[:])zIvoid(int64[:], uint32, uint32, uint32, uint32, float32, uint32, bool_[:])z(n),(),(),(),(),(),()->(n))r   r   c                V   | d         t          j        | dt          || j        d                                      k    |d<   |dxx         | d         t          j        | dt          || j        d                                      |z   k    z  cc<   |d         r|dz   }nd}|| j        d         k     rt          j        | t          d||z
            t          ||z   | j        d                                      }	| |         |	k    ||<   ||         s|dz  }wt          j        | t          d||z
            t          ||z   | j        d                                      }
||xx         | |         |
|z   k    z  cc<   ||         s|dz  }||dz   z  }|| j        d         k     dS dS )z&Vectorized wrapper for the peak-pickerr   Nr   )rH   r   r   rG   mean)r<   pre_maxpost_maxpre_avgpost_avgdeltawaitpeaksrz   maxnavgns              rU   __peak_pickr     s    !q!;#h
";";!;<===E!H	!HHH1#=C!'!*$=$=#=!>??%GGHHHHQx 1H
agaj..vqQ'	**3qz171:+F+FFGHH aDDLaQx 	FAwqQ'	**3qz171:+F+FFGHHaQqTTE\)*Qx 	FA 	
TAX% agaj......rV   )sparser9   r   r   r   r   r   r   r   c               8   |dk     rt          d          |dk     rt          d          |dk     rt          d          |dk     rt          d          |dk    rt          d          |dk    rt          d          |r#| j        dk    rt          d	| j         d
          t          |t          j                  }t          |t          j                  }t          |t          j                  }t          |t          j                  }t          |t          j                  }t          j        | t                    }	t          |                     |d          |||||||	                    |d                     |rt          j	        |	          S |	S )a  Use 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 [#]_ and [#]_.

    .. [#] Boeck, Sebastian, Florian Krebs, and Markus Schedl.
        "Evaluating the Online Capabilities of Onset Detection Methods." ISMIR.
        2012.

    .. [#] https://github.com/CPJKU/onset_detection/blob/master/onset_program.py

    Parameters
    ----------
    x : np.ndarray
        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
    sparse : bool [scalar]
        If `True`, the output are indices of detected peaks.
        If `False`, the output is a dense boolean array of the same
        shape as ``x``.
    axis : int [scalar]
        the axis over which to detect peaks.

    Returns
    -------
    peaks : np.ndarray [shape=(n_peaks,) or shape=x.shape, dtype=int or bool]
        indices of peaks in ``x`` (sparse=True)
        or a boolean array where `peaks[..., n]` indicates a peak at frame index `n` (sparse=False)

    Raises
    ------
    ParameterError
        If any input lies outside its defined range

    Examples
    --------
    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> onset_env = librosa.onset.onset_strength(y=y, sr=sr,
    ...                                          hop_length=512,
    ...                                          aggregate=np.median)
    >>> peaks = librosa.util.peak_pick(onset_env, pre_max=3, post_max=3, pre_avg=3, post_avg=5, delta=0.5, wait=10)
    >>> peaks
    array([  3,  27,  40,  61,  72,  88, 103])

    Using dense output to make a boolean array of peak indicators
    >>> librosa.util.peak_pick(onset_env, pre_max=3, post_max=3, pre_avg=3, post_avg=5,
    ...                        delta=0.5, wait=10, sparse=False)
    array([False, False, ..., False, False])

    >>> import matplotlib.pyplot as plt
    >>> times = librosa.times_like(onset_env, sr=sr, hop_length=512)
    >>> fig, ax = plt.subplots(nrows=2, sharex=True)
    >>> D = np.abs(librosa.stft(y))
    >>> librosa.display.specshow(librosa.amplitude_to_db(D, ref=np.max),
    ...                          y_axis='log', x_axis='time', ax=ax[1])
    >>> ax[0].plot(times, onset_env, alpha=0.8, label='Onset strength')
    >>> ax[0].vlines(times[peaks], 0,
    ...              onset_env.max(), color='r', alpha=0.8,
    ...              label='Selected peaks')
    >>> ax[0].legend(frameon=True, framealpha=0.8)
    >>> ax[0].label_outer()
    r   zpre_max must be non-negativezpre_avg must be non-negativezdelta must be non-negativezwait must be non-negativezpost_max must be positivezpost_avg must be positiver   z'sparse=True (default) does not support zU-dimensional inputs. Either set sparse=False or process each dimension independently.rb   r   r8   )
r   rN   r   rH   ceil
zeros_likerA   r   r   flatnonzero)
r<   r   r   r   r   r   r   r   r9   r   s
             rU   r'   r'     s   z {{;<<<{{;<<<qyy9:::axx89991}}89991}}8999 U!&A++ T6T T T U U 	U
 bg...G000Hbg...G000HT(((DM!4(((E

4$$gx(ESWY^YgYghlnpYqYqrrr %~e$$$LrV   g{Gz?)quantiler^   r   r^   Optional[DTypeLike]scipy.sparse.csr_matrixc                  | j         dk    r|                     d          } n#| j         dk    rt          d| j         d          d|cxk    rdk     sn t          d|d          || j        }t
          j                            | j        |
          }t          j	        |           }t          j
        |dd          }t          j        |d          }t          j        ||z  d          }t          j        ||k     d          }t          |          D ]:\  }	}
t          j        ||	         ||	|
f         k              }| |	|f         ||	|f<   ;|                                S )a~	  Return a row-sparse matrix approximating the input

    Parameters
    ----------
    x : np.ndarray [ndim <= 2]
        The input matrix to sparsify.
    quantile : float in [0, 1.0)
        Percentage of magnitude to discard in each row of ``x``
    dtype : np.dtype, optional
        The dtype of the output array.
        If not provided, then ``x.dtype`` will be used.

    Returns
    -------
    x_sparse : ``scipy.sparse.csr_matrix`` [shape=x.shape]
        Row-sparsified approximation of ``x``

        If ``x.ndim == 1``, then ``x`` is interpreted as a row vector,
        and ``x_sparse.shape == (1, len(x))``.

    Raises
    ------
    ParameterError
        If ``x.ndim > 2``

        If ``quantile`` lies outside ``[0, 1.0)``

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

    Examples
    --------
    >>> # Construct a Hann window to sparsify
    >>> x = scipy.signal.hann(32)
    >>> x
    array([ 0.   ,  0.01 ,  0.041,  0.09 ,  0.156,  0.236,  0.326,
            0.424,  0.525,  0.625,  0.72 ,  0.806,  0.879,  0.937,
            0.977,  0.997,  0.997,  0.977,  0.937,  0.879,  0.806,
            0.72 ,  0.625,  0.525,  0.424,  0.326,  0.236,  0.156,
            0.09 ,  0.041,  0.01 ,  0.   ])
    >>> # Discard the bottom percentile
    >>> x_sparse = librosa.util.sparsify_rows(x, quantile=0.01)
    >>> x_sparse
    <1x32 sparse matrix of type '<type 'numpy.float64'>'
        with 26 stored elements in Compressed Sparse Row format>
    >>> x_sparse.todense()
    matrix([[ 0.   ,  0.   ,  0.   ,  0.09 ,  0.156,  0.236,  0.326,
              0.424,  0.525,  0.625,  0.72 ,  0.806,  0.879,  0.937,
              0.977,  0.997,  0.997,  0.977,  0.937,  0.879,  0.806,
              0.72 ,  0.625,  0.525,  0.424,  0.326,  0.236,  0.156,
              0.09 ,  0.   ,  0.   ,  0.   ]])
    >>> # Discard up to the bottom 10th percentile
    >>> x_sparse = librosa.util.sparsify_rows(x, quantile=0.1)
    >>> x_sparse
    <1x32 sparse matrix of type '<type 'numpy.float64'>'
        with 20 stored elements in Compressed Sparse Row format>
    >>> x_sparse.todense()
    matrix([[ 0.   ,  0.   ,  0.   ,  0.   ,  0.   ,  0.   ,  0.326,
              0.424,  0.525,  0.625,  0.72 ,  0.806,  0.879,  0.937,
              0.977,  0.997,  0.997,  0.977,  0.937,  0.879,  0.806,
              0.72 ,  0.625,  0.525,  0.424,  0.326,  0.   ,  0.   ,
              0.   ,  0.   ,  0.   ,  0.   ]])
    r   )r   r8   r   z8Input must have 2 or fewer dimensions. Provided x.shape=.        zInvalid quantile z.2fNr   Tr   ro   )rN   r   r   rG   r^   scipyr   
lil_matrixrH   r   r   sortcumsumargminr   wheretocsr)r<   r   r^   x_sparsemagsnormsmag_sortcumulative_magthreshold_idxr   jr   s               rU   r(   r(   P  s   H 	v{{IIg	
!QqwQQQ
 
 	
 (Q????@@@}|&&qwe&<<H6!99DF4a$///Ewt!$$$HYx%/a888NInx7a@@@M-(( % %1htAw(1a4.011QV9C>>rV   )n_bytesr^   r  r
   c                   dt          dd|z  dz
  z            z  }d|d}|t          j        | |                              |          z  S )a  Convert an integer buffer to floating point values.
    This is primarily useful when loading integer-valued wav data
    into numpy arrays.

    Parameters
    ----------
    x : np.ndarray [dtype=int]
        The integer-valued data buffer
    n_bytes : int [1, 2, 4]
        The number of bytes per sample in ``x``
    dtype : numeric type
        The target output type (default: 32-bit float)

    Returns
    -------
    x_float : np.ndarray [dtype=float]
        The input data buffer cast to floating point
    r   r      z<irE   )rd   rH   
frombufferr   )r<   r  r^   scalefmts        rU   r/   r/     s]    , %q7{a/0111E w


C 2=C((//6666rV   )idx_minidx_maxstepry   r   r	  r
  r  List[slice]c               r    t          | |||          }fdt          ||dd                   D             S )aK  Generate a slice array from an index array.

    Parameters
    ----------
    idx : list-like
        Array of index boundaries
    idx_min, idx_max : None or int
        Minimum and maximum allowed indices
    step : None or int
        Step size for each slice.  If `None`, then the default
        step of 1 is used.
    pad : boolean
        If `True`, pad ``idx`` to span the range ``idx_min:idx_max``.

    Returns
    -------
    slices : list of slice
        ``slices[i] = slice(idx[i], idx[i+1], step)``
        Additional slice objects may be added at the beginning or end,
        depending on whether ``pad==True`` and the supplied values for
        ``idx_min`` and ``idx_max``.

    See Also
    --------
    fix_frames

    Examples
    --------
    >>> # Generate slices from spaced indices
    >>> librosa.util.index_to_slice(np.arange(20, 100, 15))
    [slice(20, 35, None), slice(35, 50, None), slice(50, 65, None), slice(65, 80, None),
     slice(80, 95, None)]
    >>> # Pad to span the range (0, 100)
    >>> librosa.util.index_to_slice(np.arange(20, 100, 15),
    ...                             idx_min=0, idx_max=100)
    [slice(0, 20, None), slice(20, 35, None), slice(35, 50, None), slice(50, 65, None),
     slice(65, 80, None), slice(80, 95, None), slice(95, 100, None)]
    >>> # Use a step of 5 for each slice
    >>> librosa.util.index_to_slice(np.arange(20, 100, 15),
    ...                             idx_min=0, idx_max=100, step=5)
    [slice(0, 20, 5), slice(20, 35, 5), slice(35, 50, 5), slice(50, 65, 5), slice(65, 80, 5),
     slice(80, 95, 5), slice(95, 100, 5)]
    r   c                8    g | ]\  }}t          ||          S r   )rM   ).0startendr  s      rU   
<listcomp>z"index_to_slice.<locals>.<listcomp>	  s)    VVVE%d##VVVrV   r   N)r"   zip)r   r	  r
  r  ry   	idx_fixeds      `  rU   r,   r,     sN    h 3gW#FFFI WVVVIyQRQSQS}8U8UVVVVrV   )	aggregatery   r9   %Union[Sequence[int], Sequence[slice]]r  c                  |t           j        }t          | j                  }t          j        d |D                       r|}n\t          j        d |D                       r,t          t          j        |          d||         |          }nt          d|           t          |          }t          |          ||<   t          j	        |t          j
        |           rdnd| j        	          }t          d          g| j        z  }	t          d          g|j        z  }
t          |          D ]?\  }}||	|<   ||
|<    || t          |	                   |
          |t          |
          <   @|S )a  Aggregate a multi-dimensional array between specified 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 : sequence 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.ex('choice'))
    >>> tempo, beats = librosa.beat.beat_track(y=y, sr=sr, trim=False)
    >>> C = np.abs(librosa.cqt(y=y, sr=sr))
    >>> beats = librosa.util.fix_frames(beats)

    By default, use mean aggregation

    >>> C_avg = librosa.util.sync(C, beats)

    Use median-aggregation instead of mean

    >>> C_med = librosa.util.sync(C, beats,
    ...                              aggregate=np.median)

    Or sub-beat synchronization

    >>> sub_beats = librosa.segment.subsegment(C, beats)
    >>> sub_beats = librosa.util.fix_frames(sub_beats)
    >>> C_med_sub = librosa.util.sync(C, 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)
    >>> fig, ax = plt.subplots(nrows=3, sharex=True, sharey=True)
    >>> librosa.display.specshow(librosa.amplitude_to_db(C,
    ...                                                  ref=np.max),
    ...                          x_axis='time', ax=ax[0])
    >>> ax[0].set(title='CQT power, shape={}'.format(C.shape))
    >>> ax[0].label_outer()
    >>> librosa.display.specshow(librosa.amplitude_to_db(C_med,
    ...                                                  ref=np.max),
    ...                          x_coords=beat_t, x_axis='time', ax=ax[1])
    >>> ax[1].set(title='Beat synchronous CQT power, '
    ...                 'shape={}'.format(C_med.shape))
    >>> ax[1].label_outer()
    >>> librosa.display.specshow(librosa.amplitude_to_db(C_med_sub,
    ...                                                  ref=np.max),
    ...                          x_coords=subbeat_t, x_axis='time', ax=ax[2])
    >>> ax[2].set(title='Sub-beat synchronous CQT power, '
    ...                 'shape={}'.format(C_med_sub.shape))
    Nc                8    g | ]}t          |t                    S r   )r[   rM   r  _s     rU   r  zsync.<locals>.<listcomp>s  s"    111z!U##111rV   c                f    g | ].}t          j        t          |          t           j                  /S r   )rH   r]   r   rj   r  s     rU   r  zsync.<locals>.<listcomp>u  s,    AAAtAww
33AAArV   r   )r	  r
  ry   zInvalid index set: FC)orderr^   ro   )rH   r   rK   rG   ra   r,   r   r   r   empty	isfortranr^   rM   rN   r   rJ   )rp   r   r  ry   r9   rG   rT   	agg_shapedata_aggidx_inidx_aggr   segments                rU   r-   r-     s   D G	E	v11S11122 :	AASAAA	B	B :JsOOQd
 
 
 8388999UI&kkIdOxT 2 2;4:  H Dkk]TY&FT{{mhm+G'' M M
7t#,9T%---@t#L#L#Lw  OrV   )powersplit_zerosXX_refr&  r'  c                  | j         |j         k    rt          d| j          d|j                    t          j        | dk               st          j        |dk               rt          d          |dk    rt          d          | j        }t          j        |t          j                  st          j        }t          j        | |          	                    |          }|t          j
        |          j        k     }d||<   t          j        |          r@| |z  |z  }||z  |z  }| }	||	xx         ||	         ||	         z   z  cc<   |rd||<   nd||<   n| |k    }|S )	au	  Robustly compute a soft-mask operation.

        ``M = X**power / (X**power + X_ref**power)``

    Parameters
    ----------
    X : np.ndarray
        The (non-negative) input array corresponding to the positive mask elements

    X_ref : np.ndarray
        The (non-negative) array of reference or background elements.
        Must have the same shape as ``X``.

    power : number > 0 or np.inf
        If finite, returns the soft mask computed in a numerically stable way

        If infinite, returns a hard (binary) mask equivalent to ``X > X_ref``.
        Note: for hard masks, ties are always broken in favor of ``X_ref`` (``mask=0``).

    split_zeros : bool
        If `True`, entries where ``X`` and ``X_ref`` are both small (close to 0)
        will receive mask values of 0.5.

        Otherwise, the mask is set to 0 for these entries.

    Returns
    -------
    mask : np.ndarray, shape=X.shape
        The output mask array

    Raises
    ------
    ParameterError
        If ``X`` and ``X_ref`` have different shapes.

        If ``X`` or ``X_ref`` are negative anywhere

        If ``power <= 0``

    Examples
    --------
    >>> X = 2 * np.ones((3, 3))
    >>> X_ref = np.vander(np.arange(3.0))
    >>> X
    array([[ 2.,  2.,  2.],
           [ 2.,  2.,  2.],
           [ 2.,  2.,  2.]])
    >>> X_ref
    array([[ 0.,  0.,  1.],
           [ 1.,  1.,  1.],
           [ 4.,  2.,  1.]])
    >>> librosa.util.softmask(X, X_ref, power=1)
    array([[ 1.   ,  1.   ,  0.667],
           [ 0.667,  0.667,  0.667],
           [ 0.333,  0.5  ,  0.667]])
    >>> librosa.util.softmask(X_ref, X, power=1)
    array([[ 0.   ,  0.   ,  0.333],
           [ 0.333,  0.333,  0.333],
           [ 0.667,  0.5  ,  0.333]])
    >>> librosa.util.softmask(X, X_ref, power=2)
    array([[ 1. ,  1. ,  0.8],
           [ 0.8,  0.8,  0.8],
           [ 0.2,  0.5,  0.8]])
    >>> librosa.util.softmask(X, X_ref, power=4)
    array([[ 1.   ,  1.   ,  0.941],
           [ 0.941,  0.941,  0.941],
           [ 0.059,  0.5  ,  0.941]])
    >>> librosa.util.softmask(X, X_ref, power=100)
    array([[  1.000e+00,   1.000e+00,   1.000e+00],
           [  1.000e+00,   1.000e+00,   1.000e+00],
           [  7.889e-31,   5.000e-01,   1.000e+00]])
    >>> librosa.util.softmask(X, X_ref, power=np.inf)
    array([[ True,  True,  True],
           [ True,  True,  True],
           [False, False,  True]], dtype=bool)
    zShape mismatch: z!=r   z X and X_ref must be non-negativezpower must be strictly positiver   g      ?r   )rG   r   rH   rn   r^   r]   r_   float32maximumr   finfor0   r`   )
r(  r)  r&  r'  r^   Zbad_idxmaskref_maskgood_idxs
             rU   r.   r.     sw   ^ 	w%+HHH5;HHIII	va!e}} Auqy)) A?@@@zz>??? GE=,, 
 	
1e##E**A"(5//&&GAgJ
 
{5 A%AI%'8X$x.8H+=== 	 DMMDMM 5yKrV   Union[float, np.ndarray]r   c                8   t          j        |           } t          j        | j        t           j                  s$t          j        | j        t           j                  r| j        }nt          j        t           j                  }t          j        |          j        S )a  Compute the tiny-value corresponding to an input's data type.

    This is the smallest "usable" number representable in ``x.dtype``
    (e.g., float32).

    This is primarily useful for determining a threshold for
    numerical underflow in division or multiplication operations.

    Parameters
    ----------
    x : number or np.ndarray
        The array to compute the tiny-value for.
        All that matters here is ``x.dtype``

    Returns
    -------
    tiny_value : float
        The smallest positive usable number for the type of ``x``.
        If ``x`` is integer-typed, then the tiny value for ``np.float32``
        is returned instead.

    See Also
    --------
    numpy.finfo

    Examples
    --------
    For a standard double-precision floating point number:

    >>> librosa.util.tiny(1.0)
    2.2250738585072014e-308

    Or explicitly as double-precision

    >>> librosa.util.tiny(np.asarray(1e-5, dtype=np.float64))
    2.2250738585072014e-308

    Or complex numbers

    >>> librosa.util.tiny(1j)
    2.2250738585072014e-308

    Single-precision floating point:

    >>> librosa.util.tiny(np.asarray(1e-5, dtype=np.float32))
    1.1754944e-38

    Integer

    >>> librosa.util.tiny(5)
    1.1754944e-38
    )	rH   r   r]   r^   r_   complexfloatingr+  r-  r0   )r<   r^   s     rU   r0   r0     sv    l 	
1A 
}QWbk** %bm	#/ / % $$8E??rV   )r   radiusNonec                  | j         \  }}t          t          j        |t          j        | j                   z                      }| j         \  }}t          j        | j         d         | j         d         z
            }||k     r1t          j        | ||z             }t          j        | |           }n0t          j        | |          }t          j        | | |z
            }|| |<   || |<   dS )a/  Set all cells of a matrix to a given ``value``
    if they lie outside a constraint region.

    In this case, the constraint region is the
    Sakoe-Chiba band which runs with a fixed ``radius``
    along the main diagonal.

    When ``x.shape[0] != x.shape[1]``, the radius will be
    expanded so that ``x[-1, -1] = 1`` always.

    ``x`` will be modified in place.

    Parameters
    ----------
    x : np.ndarray [shape=(N, M)]
        Input matrix, will be modified in place.
    radius : float
        The band radius (1/2 of the width) will be
        ``int(radius*min(x.shape))``
    value : float
        ``x[n, m] = value`` when ``(n, m)`` lies outside the band.

    Examples
    --------
    >>> x = np.ones((8, 8))
    >>> librosa.util.fill_off_diagonal(x, radius=0.25)
    >>> x
    array([[1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 0, 0, 0, 0, 0],
           [0, 1, 1, 1, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 0, 0, 0],
           [0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 1, 1, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1]])
    >>> x = np.ones((8, 12))
    >>> librosa.util.fill_off_diagonal(x, radius=0.25)
    >>> x
    array([[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
           [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
           [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]])
    r   r   )kN)rG   r?   rH   roundr   r   triu_indices_fromtril_indices_from)r<   r6  r   nxnyoffsetidx_uidx_ls           rU   r+   r+   G  s    ` WFB &26!'??23344FWFBVQWQZ!'!*,..F	Bww$Q&6/:::$Q6'222$Q&111$Q6'F*:;;; AeHAeHHHrV   
edge_orderr9   rC  Literal[1, 2]c                  dg| j         z  }||f||<   t          j        | |d          }t          j        |||          }t	          d          g| j         z  }t	          ||           ||<   |t          |                   }|S )a.  Estimate the gradient of a function over a uniformly sampled,
    periodic domain.

    This is essentially the same as `np.gradient`, except that edge effects
    are handled by wrapping the observations (i.e. assuming periodicity)
    rather than extrapolation.

    Parameters
    ----------
    data : np.ndarray
        The function values observed at uniformly spaced positions on
        a periodic domain
    edge_order : {1, 2}
        The order of the difference approximation used for estimating
        the gradient
    axis : int
        The axis along which gradients are calculated.

    Returns
    -------
    grad : np.ndarray like ``data``
        The gradient of ``data`` taken along the specified axis.

    See Also
    --------
    numpy.gradient

    Examples
    --------
    This example estimates the gradient of cosine (-sine) from 64
    samples using direct (aperiodic) and periodic gradient
    calculation.

    >>> import matplotlib.pyplot as plt
    >>> x = 2 * np.pi * np.linspace(0, 1, num=64, endpoint=False)
    >>> y = np.cos(x)
    >>> grad = np.gradient(y)
    >>> cyclic_grad = librosa.util.cyclic_gradient(y)
    >>> true_grad = -np.sin(x) * 2 * np.pi / len(x)
    >>> fig, ax = plt.subplots()
    >>> ax.plot(x, true_grad, label='True gradient', linewidth=5,
    ...          alpha=0.35)
    >>> ax.plot(x, cyclic_grad, label='cyclic_gradient')
    >>> ax.plot(x, grad, label='np.gradient', linestyle=':')
    >>> ax.legend()
    >>> # Zoom into the first part of the sequence
    >>> ax.set(xlim=[0, np.pi/16], ylim=[-0.025, 0.025])
    rv   wrap)rt   rB  N)rN   rH   ry   gradientrM   rJ   )rp   rC  r9   paddingdata_padgradrT   
grad_slices           rU   r1   r1     s    h h"G,GDMvdG&111H ;xJTBBBD Dkk]TY&Fj[11F4L!%--0JrV   factorr9   rM  c                   |dk    r| j         } t          j        |           }t          | j        d                   D ]+}t          j        | dd|f         ||z            |dd|f<   ,|dk    r|j         }|S )z2Numba-accelerated shear for dense (ndarray) arraysr   r   N)TrH   r   rangerG   roll)r(  rM  r9   X_shearr   s        rU   __shear_denserS    s     qyyCmAG171: 5 5!!!Q$!441qyy)NrV   scipy.sparse.spmatrixc                  | j         }|dk    r| j        } |                     d          }t          j        |t          j        |j        d                   z  t          j        |j                            }t          j	        |j
        |z   |j        d         |j
                   |dk    r|j        }|                    |          S )zFast shearing for sparse matrices

    Shearing is performed using CSC array indices,
    and the result is converted back to whatever sparse format
    the data was originally provided in.
    r   T)rD   r   )out)formatrO  tocscrH   repeatarangerG   diffindptrr   indicesasformat)r(  rM  r9   r  rR  rQ  s         rU   __shear_sparser_    s     (CqyyC gg4g  G
 9Vbia(8999277>;R;RSSD F7?T!7=#3IIIIqyy) C   rV   _ArrayOrSparseMatrix)boundc                   d S r   r   r(  rM  r9   s      rU   r)   r)         CrV   c                   d S r   r   rc  s      rU   r)   r)     s	     CrV   c                  t          j        t          |          t           j                  st	          d| d          t
          j                            |           rt          | ||          S t          | ||          S )ae  Shear a matrix by a given factor.

    The column ``X[:, n]`` will be displaced (rolled)
    by ``factor * n``

    This is primarily useful for converting between lag and recurrence
    representations: shearing with ``factor=-1`` converts the main diagonal
    to a horizontal.  Shearing with ``factor=1`` converts a horizontal to
    a diagonal.

    Parameters
    ----------
    X : np.ndarray [ndim=2] or scipy.sparse matrix
        The array to be sheared
    factor : integer
        The shear factor: ``X[:, n] -> np.roll(X[:, n], factor * n)``
    axis : integer
        The axis along which to shear

    Returns
    -------
    X_shear : same type as ``X``
        The sheared matrix

    Examples
    --------
    >>> E = np.eye(3)
    >>> librosa.util.shear(E, factor=-1, axis=-1)
    array([[1., 1., 1.],
           [0., 0., 0.],
           [0., 0., 0.]])
    >>> librosa.util.shear(E, factor=-1, axis=0)
    array([[1., 0., 0.],
           [1., 0., 0.],
           [1., 0., 0.]])
    >>> librosa.util.shear(E, factor=1, axis=-1)
    array([[1., 0., 0.],
           [0., 0., 1.],
           [0., 1., 0.]])
    zfactor=z must be integer-valuedrL  )
rH   r]   r   rj   r   r   r   
isspmatrixr_  rS  rc  s      rU   r)   r)     s    V =frz22 HFvFFFGGG |q!! :aT::::QvD9999rV   arraysList[np.ndarray]c                  d | D             }t          |          dk    rt          d          t          |          dk     rt          d          |                                }|dk    rt          j        | |          S t          t          |           gt          |          z             }t          j        |  }t          j        ||d          }t          j        | ||	           |S )
a+  Stack one or more arrays along a target axis.

    This function is similar to `np.stack`, except that memory contiguity is
    retained when stacking along the first dimension.

    This is useful when combining multiple monophonic audio signals into a
    multi-channel signal, or when stacking multiple feature representations
    to form a multi-dimensional array.

    Parameters
    ----------
    arrays : list
        one or more `np.ndarray`
    axis : integer
        The target axis along which to stack.  ``axis=0`` creates a new first axis,
        and ``axis=-1`` creates a new last axis.

    Returns
    -------
    arr_stack : np.ndarray [shape=(len(arrays), array_shape) or shape=(array_shape, len(arrays))]
        The input arrays, stacked along the target dimension.

        If ``axis=0``, then ``arr_stack`` will be F-contiguous.
        Otherwise, ``arr_stack`` will be C-contiguous by default, as computed by
        `np.stack`.

    Raises
    ------
    ParameterError
        - If ``arrays`` do not all have the same shape
        - If no ``arrays`` are given

    See Also
    --------
    numpy.stack
    numpy.ndarray.flags
    frame

    Examples
    --------
    Combine two buffers into a contiguous arrays

    >>> y_left = np.ones(5)
    >>> y_right = -np.ones(5)
    >>> y_stereo = librosa.util.stack([y_left, y_right], axis=0)
    >>> y_stereo
    array([[ 1.,  1.,  1.,  1.,  1.],
           [-1., -1., -1., -1., -1.]])
    >>> y_stereo.flags
      C_CONTIGUOUS : False
      F_CONTIGUOUS : True
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
      UPDATEIFCOPY : False

    Or along the trailing axis

    >>> y_stereo = librosa.util.stack([y_left, y_right], axis=-1)
    >>> y_stereo
    array([[ 1., -1.],
           [ 1., -1.],
           [ 1., -1.],
           [ 1., -1.],
           [ 1., -1.]])
    >>> y_stereo.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
      UPDATEIFCOPY : False
    c                    h | ]	}|j         
S r   )rG   )r  arrs     rU   	<setcomp>zstack.<locals>.<setcomp>  s    ***Cci***rV   r   z)all input arrays must have the same shapez3at least one input array must be provided for stackr   ro   r  )r^   r  )r9   rV  )	r   r   poprH   r*   rJ   rK   result_typer  )rh  r9   shapesshape_inrG   r^   results          rU   r*   r*   D  s    X +*6***F
6{{QHIII	VqRSSSzz||HqyyxT**** s6{{md8nn455 ' %uC888 	d////rV   )defaultrE   rs  Optional[type]c                  t          j        t           j                  t           j        t          j        t           j                  t           j        t          j        t                    t          j        t                    j        i}t          j        |           }|j	        dk    r|S t          j        |
                    ||                    S )a  Find the complex numpy dtype corresponding to a real dtype.

    This is used to maintain numerical precision and memory footprint
    when constructing complex arrays from real-valued data
    (e.g. in a Fourier transform).

    A `float32` (single-precision) type maps to `complex64`,
    while a `float64` (double-precision) maps to `complex128`.

    Parameters
    ----------
    d : np.dtype
        The real-valued dtype to convert to complex.
        If ``d`` is a complex type already, it will be returned.
    default : np.dtype, optional
        The default complex target type, if ``d`` does not match a
        known dtype

    Returns
    -------
    d_c : np.dtype
        The complex dtype

    See Also
    --------
    dtype_c2r
    numpy.dtype

    Examples
    --------
    >>> librosa.util.dtype_r2c(np.float32)
    dtype('complex64')

    >>> librosa.util.dtype_r2c(np.int16)
    dtype('complex64')

    >>> librosa.util.dtype_r2c(np.complex128)
    dtype('complex128')
    c)rH   r^   r+  	complex64float64
complex128rd   complexr   kindgetrE   rs  mappingdts       rU   r2   r2     s    R 	bl
bm
'**/&G 
!B	w#~~	 8GKKG,,---rV   c                  t          j        t           j                  t           j        t          j        t           j                  t           j        t          j        t                    t          j        t                    j        i}t          j        |           }|j	        dk    r|S t          j        |
                    ||                    S )a(  Find the real numpy dtype corresponding to a complex dtype.

    This is used to maintain numerical precision and memory footprint
    when constructing real arrays from complex-valued data
    (e.g. in an inverse Fourier transform).

    A `complex64` (single-precision) type maps to `float32`,
    while a `complex128` (double-precision) maps to `float64`.

    Parameters
    ----------
    d : np.dtype
        The complex-valued dtype to convert to real.
        If ``d`` is a real (float) type already, it will be returned.
    default : np.dtype, optional
        The default real target type, if ``d`` does not match a
        known dtype

    Returns
    -------
    d_r : np.dtype
        The real dtype

    See Also
    --------
    dtype_r2c
    numpy.dtype

    Examples
    --------
    >>> librosa.util.dtype_r2c(np.complex64)
    dtype('float32')

    >>> librosa.util.dtype_r2c(np.float32)
    dtype('float32')

    >>> librosa.util.dtype_r2c(np.int16)
    dtype('float32')

    >>> librosa.util.dtype_r2c(np.complex128)
    dtype('float64')
    f)rH   r^   rw  r+  ry  rx  rz  rd   r   r{  r|  r}  s       rU   r3   r3     s    X 	


28E??/&G 
!B	w#~~	 8GKKG,,---rV   c                D    t          j        |           }|j        d         S )zCount the number of unique values in an array.

    This function is a helper for `count_unique` and is not
    to be called directly.
    r   )rH   r   rG   r<   uniquess     rU   __count_uniquer  	  s     illG=rV   c               8    t          j        t          ||           S )a  Count the number of unique values in a multi-dimensional array
    along a given axis.

    Parameters
    ----------
    data : np.ndarray
        The input array
    axis : int
        The target axis to count

    Returns
    -------
    n_uniques
        The number of unique values.
        This array will have one fewer dimension than the input.

    See Also
    --------
    is_unique

    Examples
    --------
    >>> x = np.vander(np.arange(5))
    >>> x
    array([[  0,   0,   0,   0,   1],
       [  1,   1,   1,   1,   1],
       [ 16,   8,   4,   2,   1],
       [ 81,  27,   9,   3,   1],
       [256,  64,  16,   4,   1]])
    >>> # Count unique values along rows (within columns)
    >>> librosa.util.count_unique(x, axis=0)
    array([5, 5, 5, 5, 1])
    >>> # Count unique values along columns (within rows)
    >>> librosa.util.count_unique(x, axis=-1)
    array([2, 1, 5, 5, 5])
    )rH   apply_along_axisr  rp   r9   s     rU   r4   r4   (	  s    J ~tT:::rV   c                V    t          j        |           }|j        d         | j        k    S )zDetermine if the input array has all unique values.

    This function is a helper for `is_unique` and is not
    to be called directly.
    r   )rH   r   rG   rq   r  s     rU   __is_uniquer  P	  s%     illG=qv%%rV   c               8    t          j        t          ||           S )a  Determine if the input array consists of all unique values
    along a given axis.

    Parameters
    ----------
    data : np.ndarray
        The input array
    axis : int
        The target axis

    Returns
    -------
    is_unique
        Array of booleans indicating whether the data is unique along the chosen
        axis.
        This array will have one fewer dimension than the input.

    See Also
    --------
    count_unique

    Examples
    --------
    >>> x = np.vander(np.arange(5))
    >>> x
    array([[  0,   0,   0,   0,   1],
       [  1,   1,   1,   1,   1],
       [ 16,   8,   4,   2,   1],
       [ 81,  27,   9,   3,   1],
       [256,  64,  16,   4,   1]])
    >>> # Check uniqueness along rows
    >>> librosa.util.is_unique(x, axis=0)
    array([ True,  True,  True,  True, False])
    >>> # Check uniqueness along columns
    >>> librosa.util.is_unique(x, axis=-1)
    array([False, False,  True,  True,  True])
    )rH   r  r  r  s     rU   r5   r5   [	  s    L {D$777rV   zfloat32(complex64)zfloat64(complex128))r   r   identityr   c                ,    | j         dz  | j        dz  z   S )z*Efficiently compute abs2 on complex inputsr   )realimagrk   s    rU   _cabs2r  	  s    
 619qvqy  rV   znp.number[Any]_NumberOrArrayc                    t          j        |           r(t          |           }||S |                    |          S t          j        | |          S )a  Compute the squared magnitude of a real or complex array.

    This function is equivalent to calling `np.abs(x)**2` but it
    is slightly more efficient.

    Parameters
    ----------
    x : np.ndarray or scalar, real or complex typed
        The input data, either real (float32, float64) or complex (complex64, complex128) typed
    dtype : np.dtype, optional
        The data type of the output array.
        If not provided, it will be inferred from `x`

    Returns
    -------
    p : np.ndarray or scale, real
        squared magnitude of `x`

    Examples
    --------
    >>> librosa.util.abs2(3 + 4j)
    25.0

    >>> librosa.util.abs2((0.5j)**np.arange(8))
    array([1.000e+00, 2.500e-01, 6.250e-02, 1.562e-02, 3.906e-03, 9.766e-04,
       2.441e-04, 6.104e-05])
    Nr   )rH   iscomplexobjr  r   square)r<   r^   rY   s      rU   r6   r6   	  sR    8 
q 	)1II=H88E??" y%((((rV   zcomplex64(float32)zcomplex128(float64)np.complexfloating[Any, Any]c                Z    t          j        |           dt          j        |           z  z   S )Ny              ?)rH   cossinrk   s    rU   _phasor_anglesr  	  s#     6!99rBF1II~%%rV   znp.integer[Any]znp.floating[Any])r   anglesr   Optional[np.ndarray]c                   d S r   r   r  r   s     rU   r7   r7   	  rd  rV   _RealOptional[_Number]c                   d S r   r   r  s     rU   r7   r7   	  rd  rV   Union[np.ndarray, _Real]$Optional[Union[np.ndarray, _Number]]/Union[np.ndarray, np.complexfloating[Any, Any]]c               2    t          |           }|||z  }|S )a  Construct a complex phasor representation from angles.

    When `mag` is not provided, this is equivalent to:

        z = np.cos(angles) + 1j * np.sin(angles)

    or by Euler's formula:

        z = np.exp(1j * angles)

    When `mag` is provided, this is equivalent to:

        z = mag * np.exp(1j * angles)

    This function should be more efficient (in time and memory) than the equivalent'
    formulations above, but produce numerically identical results.

    Parameters
    ----------
    angles : np.ndarray or scalar, real-valued
        Angle(s), measured in radians

    mag : np.ndarray or scalar, optional
        If provided, phasor(s) will be scaled by `mag`.

        If not provided (default), phasors will have unit magnitude.

        `mag` must be of compatible shape to multiply with `angles`.

    Returns
    -------
    z : np.ndarray or scalar, complex-valued
        Complex number(s) z corresponding to the given angle(s)
        and optional magnitude(s).

    Examples
    --------
    Construct unit phasors at angles 0, pi/2, and pi:

    >>> librosa.util.phasor([0, np.pi/2, np.pi])
    array([ 1.000e+00+0.000e+00j,  6.123e-17+1.000e+00j,
           -1.000e+00+1.225e-16j])

    Construct a phasor with magnitude 1/2:

    >>> librosa.util.phasor(np.pi/2, mag=0.5)
    (3.061616997868383e-17+0.5j)

    Or arrays of angles and magnitudes:

    >>> librosa.util.phasor(np.array([0, np.pi/2]), mag=np.array([0.5, 1.5]))
    array([5.000e-01+0.j , 9.185e-17+1.5j])
    )r  )r  r   zs      rU   r7   r7   	  s%    t 	vA
	SHrV   )r<   r=   r>   r?   r@   r?   r9   r?   r:   rA   r;   rA   rB   r=   )rY   r=   rB   rA   )r<   rd   rc   re   rB   r?   )r<   rd   rB   rA   )rl   r=   rB   rA   )
rp   r=   rq   r?   r9   r?   rr   r   rB   r=   )r<   r=   rN   r?   r}   r~   rB   r=   )
r   r   r   r   r   r   ry   rA   rB   r=   )
r   r=   r9   r?   r   r   r   r   rB   r=   )
r   r=   r9   r?   r   r   r   r   rB   r   )
r   r=   r9   r?   r   rA   r   r   rB   r   )r   r=   r   r   r9   r   r   r   r   r   rB   r=   )r<   r=   r9   r?   rB   r=   )r<   r=   r   r?   r   r?   r   r?   r   r?   r   rd   r   r?   r   rA   r9   r?   rB   r=   )r<   r=   r   rd   r^   r   rB   r   )r<   r=   r  r?   r^   r
   rB   r=   )r   r   r	  r   r
  r   r  r   ry   rA   rB   r  )rp   r=   r   r  r  r   ry   rA   r9   r?   rB   r=   )
r(  r=   r)  r=   r&  rd   r'  rA   rB   r=   )r<   r3  rB   r   )r<   r=   r6  rd   r   rd   rB   r7  )rp   r=   rC  rD  r9   r?   rB   r=   )r(  r=   rM  r?   r9   r?   rB   r=   )r(  rT  rM  r?   r9   r?   rB   rT  )r(  r`  rM  r?   r9   r?   rB   r`  )rh  ri  r9   r?   rB   r=   )rE   r
   rs  rt  rB   r
   )rp   r=   r9   r?   rB   r=   )r<   r   rB   r   r   )r<   r  r^   r   rB   r  )rB   r  )r  r=   r   r  rB   r=   )r  r  r   r  rB   r  )r  r  r   r  rB   r  )___doc__
__future__r   scipy.ndimager   scipy.sparsenumpyrH   numbanumpy.lib.stride_tricksr   _cacher   
exceptionsr   deprecationr	   numpy.typingr
   typingr   r   r   r   r   r   r   r   r   r   typing_extensionsr   _typingr   r   r   r   __all__r   r   r   r    r!   r   r   r   r"   r#   r   r&   stencilr   r   guvectorizer   r   r$   r%   r   r'   r(   r+  r/   r,   r-   r.   r0   r+   r1   jitrS  r_  r\   r   spmatrixr`  r)   r*   rw  r2   r3   r  r4   r  r5   	vectorizer  rz  _Numberr  r6   r  rd   r  r7   r   rV   rU   <module>r     s<
     " " " " " "              . . . . . .       & & & & & & # # # # # # " " " " " "                        & % % % % % C C C C C C C C C C      P c c c c c cL R> > > >B GK      @8 8 8 8   6 13G+ G+ G+ G+ G+ G+TD D D DP 138 8 8 8 8 8| V V V V V Vr 
 *-     
 
 *-     
 *.a$ a$ a$ a$ a$ a$H R F)-d d d d d dN + + +
 + + +
    
    
    
    
 ,- : : : : : :z ,- ; ; ; ; ; ;~    !    R { { { { { {| R(,4_ _ _ _ _ _F &'2:7 7 7 7 7 7D "!7W 7W 7W 7W 7W 7Wt R
 /3~ ~ ~ ~ ~ ~D 9:us s s s s sl@  @  @  @ F GH A A A A A AJ 67B? ? ? ? ? ?D D%%%24"      &%" 02r! ! ! ! ! !> w%
EL4I(I"J   
 
*-3      
 
/2     
 /0R3: 3: 3: 3: 3: 3:l 45 c c c c c cL :< 5. 5. 5. 5. 5. 5.p :< 8. 8. 8. 8. 8. 8.v D%%%  &% 35 %; %; %; %; %; %;P D%%%& & &%& 02 &8 &8 &8 &8 &8 &8R 01DWX  ! ! ! !
 ))
*)w
7J1KLLL%) %) %) %) %)P 01DWX  & & & & 	e&(::; 
>A      
 
69      
 15? ? ? ? ? ? ? ?rV   