
    9i(                     f    S SK rS SKJr  SSKJrJrJr  SS/r/ SQr	S r
S	 r " S
 S5      rSS jrg)    N)array_namespace   )_output_len_apply	mode_enumupfirdnr   )	constantwrapedgesmooth	symmetricreflectantisymmetricantireflectlinec                     [        U 5      [        U 5      * U-  -   n[        R                  " X R                  5      nXS[        U 5      & UR	                  SU5      R
                  SS2SSS24   R                  5       nU$ )a  Store coefficients in a transposed, flipped arrangement.

For example, suppose upRate is 3, and the
input number of coefficients is 10, represented as h[0], ..., h[9].

Then the internal buffer will look like this::

   h[9], h[6], h[3], h[0],   // flipped phase 0 coefs
   0,    h[7], h[4], h[1],   // flipped phase 1 coefs (zero-padded)
   0,    h[8], h[5], h[2],   // flipped phase 2 coefs (zero-padded)

N)lennpzerosdtypereshapeTravel)huph_padlenh_fulls       U/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/scipy/signal/_upfirdn.py_pad_hr    /   sl     1v#a&2&HXXh(F7CFO^^B#%%a2g.446FM    c                 <    U R                  5       n [        U 5      nU$ )N)lowerr   )modeenums     r   _check_moder&   C   s    ::<DT?DKr!   c                   (    \ rS rSrSrS rSS jrSrg)_UpFIRDnI   zHelper for resampling.c                 d   [         R                  " U5      nUR                  S:w  d  UR                  S:X  a  [	        S5      e[         R
                  " UR                  U[         R                  5      U l        [         R                  " XR                  5      n[        U5      U l
        [        U5      U l        U R                  S:  d  U R                  S:  a  [	        S5      e[        XR                  5      U l        [         R                  " U R                  5      U l        [        U5      U l        g )Nr   r   z"h must be 1-D with non-zero lengthzBoth up and down must be >= 1)r   asarrayndimsize
ValueErrorresult_typer   float32_output_typeint_up_downr    _h_trans_flipascontiguousarrayr   _h_len_orig)selfr   x_dtyper   downs        r   __init___UpFIRDn.__init__L   s    JJqM66Q;!&&A+ABBNN177GRZZHJJq++,r7Y
88a<4::><==#Axx011$2D2DEq6r!   c           
         [        U R                  UR                  U   U R                  U R                  5      n[
        R                  " UR                  [
        R                  S9nXVU'   [
        R                  " X`R                  SS9nX!R                  -  n[        U5      n[        [
        R                  " XR                  5      U R                  UU R                  U R                  X#U5        U$ )z@Apply the prepared filter to the specified axis of N-D signal x.)r   C)r   order)r   r7   shaper3   r4   r   r+   int64r   r1   r,   r&   r   r5   )r8   xaxisr$   cval
output_lenoutput_shapeouts           r   apply_filter_UpFIRDn.apply_filter[   s     !1!11774=!%4::7
 zz!'':'Thh|+<+<CHff}4 rzz!../!!3xxT	7 
r!   )r4   r7   r5   r1   r3   N)r   r	   r   )__name__
__module____qualname____firstlineno____doc__r;   rH   __static_attributes__ r!   r   r(   r(   I   s     "r!   r(   c                     [        X5      n[        R                  " U5      n[        XR                  X#5      nUR                  UR                  XXV5      5      $ )aG  Upsample, FIR filter, and downsample.

Parameters
----------
h : array_like
    1-D FIR (finite-impulse response) filter coefficients.
x : array_like
    Input signal array.
up : int, optional
    Upsampling rate. Default is 1.
down : int, optional
    Downsampling rate. Default is 1.
axis : int, optional
    The axis of the input data array along which to apply the
    linear filter. The filter is applied to each subarray along
    this axis. Default is -1.
mode : str, optional
    The signal extension mode to use. The set
    ``{"constant", "symmetric", "reflect", "edge", "wrap"}`` correspond to
    modes provided by `numpy.pad`. ``"smooth"`` implements a smooth
    extension by extending based on the slope of the last 2 points at each
    end of the array. ``"antireflect"`` and ``"antisymmetric"`` are
    anti-symmetric versions of ``"reflect"`` and ``"symmetric"``. The mode
    `"line"` extends the signal based on a linear trend defined by the
    first and last points along the ``axis``.

    .. versionadded:: 1.4.0
cval : float, optional
    The constant value to use when ``mode == "constant"``.

    .. versionadded:: 1.4.0

Returns
-------
y : ndarray
    The output signal array. Dimensions will be the same as `x` except
    for along `axis`, which will change size according to the `h`,
    `up`,  and `down` parameters.

Notes
-----
The algorithm is an implementation of the block diagram shown on page 129
of the Vaidyanathan text [1]_ (Figure 4.3-8d).

The direct approach of upsampling by factor of P with zero insertion,
FIR filtering of length ``N``, and downsampling by factor of Q is
O(N*Q) per output sample. The polyphase implementation used here is
O(N/P).

.. versionadded:: 0.18

References
----------
.. [1] P. P. Vaidyanathan, Multirate Systems and Filter Banks,
       Prentice Hall, 1993.

Examples
--------
Simple operations:

>>> import numpy as np
>>> from scipy.signal import upfirdn
>>> upfirdn([1, 1, 1], [1, 1, 1])   # FIR filter
array([ 1.,  2.,  3.,  2.,  1.])
>>> upfirdn([1], [1, 2, 3], 3)  # upsampling with zeros insertion
array([ 1.,  0.,  0.,  2.,  0.,  0.,  3.])
>>> upfirdn([1, 1, 1], [1, 2, 3], 3)  # upsampling with sample-and-hold
array([ 1.,  1.,  1.,  2.,  2.,  2.,  3.,  3.,  3.])
>>> upfirdn([.5, 1, .5], [1, 1, 1], 2)  # linear interpolation
array([ 0.5,  1. ,  1. ,  1. ,  1. ,  1. ,  0.5])
>>> upfirdn([1], np.arange(10), 1, 3)  # decimation by 3
array([ 0.,  3.,  6.,  9.])
>>> upfirdn([.5, 1, .5], np.arange(10), 2, 3)  # linear interp, rate 2/3
array([ 0. ,  1. ,  2.5,  4. ,  5.5,  7. ,  8.5])

Apply a single filter to multiple signals:

>>> x = np.reshape(np.arange(8), (4, 2))
>>> x
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])

Apply along the last dimension of ``x``:

>>> h = [1, 1]
>>> upfirdn(h, x, 2)
array([[ 0.,  0.,  1.,  1.],
       [ 2.,  2.,  3.,  3.],
       [ 4.,  4.,  5.,  5.],
       [ 6.,  6.,  7.,  7.]])

Apply along the 0th dimension of ``x``:

>>> upfirdn(h, x, 2, axis=0)
array([[ 0.,  1.],
       [ 0.,  1.],
       [ 2.,  3.],
       [ 2.,  3.],
       [ 4.,  5.],
       [ 4.,  5.],
       [ 6.,  7.],
       [ 6.,  7.]])
)r   r   r+   r(   r   rH   )	r   rB   r   r:   rC   r$   rD   xpufds	            r   r   r   l   sH    T 
	B


1A
1ggr
(C::c&&q;<<r!   )r   r   r   r	   r   )numpyr   scipy._lib._array_apir   _upfirdn_applyr   r   r   __all___upfirdn_modesr    r&   r(   r   rP   r!   r   <module>rY      s@   D  1 : :m
$(   Fo=r!   