o
    ٷiU#                     @   s\   d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddgZ
	
dddZ	
dddZdS )zCore resampling interface    N   )
get_filter)resample_f_sresample_f_presampleresample_nukaiser_bestFc                 K   s  |dkrt d||dkrt d|||kr|  S t|| }t| j}t|| t| t| ||< || dk rKt d| j| ||t| j	tj
rWtj}	n| j	}	tj| |	|d}
t|fi |\}}}|dk ru|| }tj||d d}td	|}d	| }t|| | }|rzt| d|||||||
d| W |
S  tjy } z#tj| d
dd t| d|||||||
d| W Y d}~|
S d}~ww t| d|||||||
d| |
S )a	  Resample a signal x from sr_orig to sr_new along a given axis.

    Parameters
    ----------
    x : np.ndarray, dtype=np.float*
        The input signal(s) to resample.

    sr_orig : int > 0
        The sampling rate of x

    sr_new : int > 0
        The target sampling rate of the output signal(s)

        If `sr_new == sr_orig`, then a copy of `x` is returned with no
        interpolation performed.

    axis : int
        The target axis along which to resample `x`

    filter : optional, str or callable
        The resampling filter to use.

        By default, uses the `kaiser_best` (pre-computed filter).

    parallel : optional, bool
        Enable/disable parallel computation exploiting multi-threading.

        Default: False.

    **kwargs
        additional keyword arguments provided to the specified filter

    Returns
    -------
    y : np.ndarray
        `x` resampled to `sr_new`

    Raises
    ------
    ValueError
        if `sr_orig` or `sr_new` is not positive
    TypeError
        if the input signal `x` has an unsupported data type.

    Examples
    --------
    >>> import resampy
    >>> np.set_printoptions(precision=3, suppress=True)
    >>> # Generate a sine wave at 440 Hz for 5 seconds
    >>> sr_orig = 44100.0
    >>> x = np.sin(2 * np.pi * 440.0 / sr_orig * np.arange(5 * sr_orig))
    >>> x
    array([ 0.   ,  0.063, ..., -0.125, -0.063])
    >>> # Resample to 22050 with default parameters
    >>> resampy.resample(x, sr_orig, 22050)
    array([ 0.011,  0.122,  0.25 , ..., -0.366, -0.25 , -0.122])
    >>> # Resample using the fast (low-quality) filter
    >>> resampy.resample(x, sr_orig, 22050, filter='kaiser_fast')
    array([ 0.012,  0.121,  0.251, ..., -0.365, -0.251, -0.121])
    >>> # Resample using a high-quality filter
    >>> resampy.resample(x, sr_orig, 22050, filter='kaiser_best')
    array([ 0.011,  0.122,  0.25 , ..., -0.366, -0.25 , -0.122])
    >>> # Resample using a Hann-windowed sinc filter
    >>> import scipy.signal
    >>> resampy.resample(x, sr_orig, 22050, filter='sinc_window',
    ...                  window=scipy.signal.hann)
    array([ 0.011,  0.123,  0.25 , ..., -0.366, -0.25 , -0.123])

    >>> # Generate stereo data
    >>> x_right = np.sin(2 * np.pi * 880.0 / sr_orig * np.arange(len(x)))
    >>> x_stereo = np.stack([x, x_right])
    >>> x_stereo.shape
    (2, 220500)
    >>> # Resample along the time axis (1)
    >>> y_stereo = resampy.resample(x_stereo, sr_orig, 22050, axis=1)
    >>> y_stereo.shape
    (2, 110250)
    r   Invalid sample rate: sr_orig={}zInvalid sample rate: sr_new={}r   z;Input signal length={} is too small to resample from {}->{}dtypeshaper   append      ?$
Fallback to the sequential version.   
stacklevelN)
ValueErrorformatcopyfloatlistr   intnp
issubdtyper   integerfloat32
zeros_liker   diffminaranger   swapaxesnumbaTypingErrorwarningswarnr   )xsr_origsr_newaxisfilterparallelkwargssample_ratior   r   y
interp_win	precision_interp_deltascaletime_incrementt_outexc r9   @/home/ubuntu/.local/lib/python3.10/site-packages/resampy/core.pyr      s   R
 


"




c                 K   s  |dkrt d|t|}|jdkrt d|jt|dk s2t|| j| d | krHt dt|t|| j| d | t| j}t	|||< t
| jtjr_tj}n| j}tj| ||d}	t|fi |\}
}}tj|
|
d d}|d	kr|| }|rzt| d|||
||d	|	d| W |	S  tjy } z#tj| d
dd t| d|||
||d	|	d| W Y d}~|	S d}~ww t| d|||
||d	|	d| |	S )a'  Interpolate a signal x at specified positions (t_out) along a given axis.

    Parameters
    ----------
    x : np.ndarray, dtype=np.float*
        The input signal(s) to resample.

    sr_orig : float
        Sampling rate of the input signal (x).

    t_out : np.ndarray, dtype=np.float*
        Position of the output samples.

    axis : int
        The target axis along which to resample `x`

    filter : optional, str or callable
        The resampling filter to use.

        By default, uses the `kaiser_best` (pre-computed filter).

    parallel : optional, bool
        Enable/disable parallel computation exploiting multi-threading.

        Default: True.

    **kwargs
        additional keyword arguments provided to the specified filter

    Returns
    -------
    y : np.ndarray
        `x` resampled to `t_out`

    Raises
    ------
    TypeError
        if the input signal `x` has an unsupported data type.

    Notes
    -----
    Differently form the `resample` function the filter `rolloff`
    is not automatically adapted in case of subsampling.
    For this reason results obtained with the `resample_nu` could be slightly
    different form the ones obtained with `resample` if the filter
    parameters are not carefully set by the user.

    Examples
    --------
    >>> import resampy
    >>> np.set_printoptions(precision=3, suppress=True)
    >>> # Generate a sine wave at 100 Hz for 5 seconds
    >>> sr_orig = 100.0
    >>> f0 = 1
    >>> t = np.arange(5 * sr_orig) / sr_orig
    >>> x = np.sin(2 * np.pi * f0 * t)
    >>> x
    array([ 0.   ,  0.063,  0.125, ..., -0.187, -0.125, -0.063])
    >>> # Resample to non-uniform sampling
    >>> t_new = np.log2(1 + t)[::5] - t[0]
    >>> resampy.resample_nu(x, sr_orig, t_new)
    array([ 0.001,  0.427,  0.76 , ..., -0.3  , -0.372, -0.442])
    r   r
   r   z+Invalid t_out shape ({}), 1D array expectedz6Output domain [{}, {}] exceeds the data domain [0, {}]r   r   r   r   r   r   r   N)r   r   r   asarrayndimr   r!   maxr   lenr   r   r   r   r   r   r    r   r#   r$   r%   r&   r'   r   )r(   r)   r7   r+   r,   r-   r.   r   r   r0   r1   r2   r3   r4   r8   r9   r9   r:   r      s|   B


* 


"




)r   r	   F)__doc__r&   numpyr   r$   filtersr   interpnr   r   __all__r   r   r9   r9   r9   r:   <module>   s   
 '