U
    5dT#                     @   sX   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 rt d| j| ||t| j	tj
rtj}	n| j	}	tj| |	|d}
t|f|\}}}|dk r|| }tj||d d}td	|}d	| }t|| | }|rz(t| d|||||||
d| W n^ tjk
r } z<tj| d
dd t| d|||||||
d| W 5 d}~X Y nX n$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: True.

    **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minZaranger   swapaxesnumbaTypingErrorwarningswarnr   )xsr_origZsr_newaxisfilterparallelkwargsZsample_ratior   r   y
interp_win	precision_interp_deltaZscaleZtime_incrementt_outexc r4   0/tmp/pip-unpacked-wheel-pmi9jsp3/resampy/core.pyr      s~    R
   


	





c                 K   s  |dkrt d|t|}|jdkr:t d|jt|dk sdt|| j| d | krt dt|t|| j| d | t| j}t	|||< t
| jtjrtj}n| j}tj| ||d}	t|f|\}
}}tj|
|
d d}|d	kr
|| }|rz(t| d|||
||d	|	d| W n^ tjk
r } z<tj| d
dd t| d|||
||d	|	d| W 5 d}~X Y nX n$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   Zasarrayndimr   r!   maxr   lenr   r   r   r   r   r   r    r   r"   r#   r$   r%   r&   r   )r'   r(   r2   r)   r*   r+   r,   r   r   r-   r.   r/   r0   r1   r3   r4   r4   r5   r      sx    B


*  



	





)r   r	   F)r   r	   F)__doc__r%   Znumpyr   r#   filtersr   Zinterpnr   r   __all__r   r   r4   r4   r4   r5   <module>   s        
 '     