
    Ugs=                         d dl mZmZmZmZmZmZmZ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mZ ddlmZmZmZ d dlmZ g dZddZi Zd	 Zd
 Zd Z d Z!d Z"d Z#d Z$d Z%d Z&ddZ'ddZ(ddZ)ddZ*dS )    )asarraypi
zeros_likearrayarctan2tanonesarangefloorr_
atleast_1dsqrtexpgreatercosaddsin   )	cspline2dsepfir2d)lfiltersosfiltlfiltic)BSpline)spline_filtergauss_spline	cspline1d	qspline1dcspline1d_evalqspline1d_eval      @c                    | j         j        }t          g dd          dz  }|dv r}|                     d          } t	          | j        |          }t	          | j        |          }t          |||          }t          |||          }|d|z  z                       |          }nJ|dv r7t	          | |          }t          |||          }|                    |          }nt          d          |S )	a4  Smoothing spline (cubic) filtering of a rank-2 array.

    Filter an input data set, `Iin`, using a (cubic) smoothing spline of
    fall-off `lmbda`.

    Parameters
    ----------
    Iin : array_like
        input data set
    lmbda : float, optional
        spline smooghing fall-off value, default is `5.0`.

    Returns
    -------
    res : ndarray
        filtered input data

    Examples
    --------
    We can filter an multi dimensional signal (ex: 2D image) using cubic
    B-spline filter:

    >>> import numpy as np
    >>> from scipy.signal import spline_filter
    >>> import matplotlib.pyplot as plt
    >>> orig_img = np.eye(20)  # create an image
    >>> orig_img[10, :] = 1.0
    >>> sp_filter = spline_filter(orig_img, lmbda=0.1)
    >>> f, ax = plt.subplots(1, 2, sharex=True)
    >>> for ind, data in enumerate([[orig_img, "original image"],
    ...                             [sp_filter, "spline filter"]]):
    ...     ax[ind].imshow(data[0], cmap='gray_r')
    ...     ax[ind].set_title(data[1])
    >>> plt.tight_layout()
    >>> plt.show()

    )      ?g      @r#   f      @)FDr&   y              ?)r$   dzInvalid data type for Iin)	dtypecharr   astyper   realimagr   	TypeError)	Iinlmbdaintypehcolckrckioutroutiouts	            U/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/signal/_bsplines.pyr   r      s    L Y^F#&&,Djjoo%((%((T4((T4((b4i''//	:		U##sD$''jj  3444J    c                     t          |           } |dz   dz  }dt          dt          z  |z            z  t          | dz   dz  |z            z  S )a  Gaussian approximation to B-spline basis function of order n.

    Parameters
    ----------
    x : array_like
        a knot vector
    n : int
        The order of the spline. Must be non-negative, i.e., n >= 0

    Returns
    -------
    res : ndarray
        B-spline basis function values approximated by a zero-mean Gaussian
        function.

    Notes
    -----
    The B-spline basis function can be approximated well by a zero-mean
    Gaussian function with standard-deviation equal to :math:`\sigma=(n+1)/12`
    for large `n` :

    .. math::  \frac{1}{\sqrt {2\pi\sigma^2}}exp(-\frac{x^2}{2\sigma})

    References
    ----------
    .. [1] Bouma H., Vilanova A., Bescos J.O., ter Haar Romeny B.M., Gerritsen
       F.A. (2007) Fast and Accurate Gaussian Derivatives Based on B-Splines. In:
       Sgallari F., Murli A., Paragios N. (eds) Scale Space and Variational
       Methods in Computer Vision. SSVM 2007. Lecture Notes in Computer
       Science, vol 4485. Springer, Berlin, Heidelberg
    .. [2] http://folk.uio.no/inf3330/scripting/doc/python/SciPy/tutorial/old/node24.html

    Examples
    --------
    We can calculate B-Spline basis functions approximated by a gaussian
    distribution:

    >>> import numpy as np
    >>> from scipy.signal import gauss_spline
    >>> knots = np.array([-1.0, 0.0, -1.0])
    >>> gauss_spline(knots, 3)
    array([0.15418033, 0.6909883, 0.15418033])  # may vary

    r   g      (@   )r   r   r   r   )xnsignsqs      r8   r   r   J   sT    Z 	

A!et^FtAFVO$$$sAF7Q;+?'@'@@@r9   c                     t          | t                    } t          j        g dd          } ||           }d|| dk     | dk    z  <   |S )Nr)   )r   r   r;   Fextrapolater   rA   r;   )r   floatr   basis_elementr<   br7   s      r8   _cubicrI   |   sY    A///UCCCA
!A$$CCRAEJr9   c                     t          t          | t                              } t          j        g dd          } ||           }d|| dk     | dk    z  <   |S )Nr@   )      g      g      ?      ?FrC   r   rK   rL   )absr   rE   r   rF   rG   s      r8   
_quadraticrN      sa    GAU###$$A444%HHHA
!A$$C"#CTa#gJr9   c           
      V   dd| z  z
  d| z  t          dd| z  z             z  z   }t          t          d| z  dz
            t          |                    }d| z  dz
  t          |          z
  d| z  z  }|t          d| z  d| z  t          dd| z  z             z  z   |z            z  }||fS )Nr   `            0   )r   r   )lamxiomegrhos       r8   _coeff_smoothrY      s    	
R#XS4C#I#6#66	6B4c	A&&R11D8a<$r(("rCx
0C
b3hcDS3Y,?,?!??2EFF
FC9r9   c                     |t          |          z  || z  z  t          || dz   z            z  t          | d          z  S )Nr   rB   )r   r   )kcsrX   omegas       r8   _hcr^      sB    UOsax(3uA+?+??ArNN r9   c                 <   ||z  d||z  z   z  d||z  z
  z  dd|z  |z  t          d|z            z  z
  |dz  z   z  }d||z  z
  d||z  z   z  t          |          z  }t          |           }|||z  z  t          ||z            |t          ||z            z  z   z  S )Nr   r;      )r   r   rM   r   )r[   r\   rX   r]   c0gammaaks          r8   _hsrd      s    
r'Qs]
#q39}
5q3w}s1u9~~--q8:Bs]q39}-E

:E	QBr	>S__us52:/FFGGr9   c           	         t          |          \  }}dd|z  t          |          z  z
  ||z  z   }t          |           }t          |          }t	          d|||          | d         z  t          j        t	          |dz   |||          | z            z   }t	          d|||          | d         z  t	          d|||          | d         z  z   t          j        t	          |dz   |||          | z            z   }t          |t          dd|z  t          |          z  ||z  f         t          ||f                   }	|		                    dd          }	t          |dddd|z  t          |          z  ||z  f         }
|
	                    dd          }
t          |
| dd          |	          \  }}t          |||f         }t          j        t          ||||          t          |dz   |||          z   | d d d         z            }t          j        t          |dz
  |||          t          |dz   |||          z   | d d d         z            }t          |t          dd|z  t          |          z  ||z  f         t          ||f                   }	|		                    dd          }	t          |
|dd d         |	          \  }}t          |d d d         ||f         }|S )Nr   r;   r   rA   rB   zi)rY   r   lenr
   r^   r   reducer   r   reshaper   rd   )signallambrX   r]   r\   Kr[   zi_2zi_1rg   sosyp_ys                 r8   _cubic_smooth_coeffru      s   t$$JC	
QWs5zz!	!C#I	-BFAq		A2sE""VAY.Js1q5"c511F:;;<D2sE""VAY.2sE""VAY./Js1q5"c511F:;;<D 
R28c%jj0#);<btn	M	MB	Ar		B
RAq"s(SZZ/s:
;C
++a

CC+++EB	D$N	B :s1b#u--1q5"c51125;DDbD\B C CD:s1q5"c5111q5"c51125;DDbD\B C CD 
R28c%jj0#);<btn	M	MB	Ar		B326r6
r***DAq
1TTrT7D$AHr9   c           
         dt          d          z   }t          |           }|t          |          z  }|dk    r=| d         |t          j        || z            z  z   }||dz
  z  |z  }t          |          S t          dt          d| f         t          t          j        || z                                }t          d          }t          d| f         }t          ||| |          \  }}	||dz
  z  ||dz
           z  }
t          | t          d| f         t          |
                    }t          | g          }t          |||dd d         |          \  }}	t          |d d d         |
f         }|dz  S )NrA   rR   r   r   rf   rB   r%   r   ri   r
   r   rj   r   r   r   r	   r   r   rl   rg   rn   powersyplusoutputstaterH   ars   out_lasts              r8   _cubic_coeffr      ss   	d1ggBFA6!99_FAvvq	BFVO!<!<<<rAv&&!!! Ar!bS&z:cj&.I.I#J#JKKEQA
1rc6
Aq!V...HE1 R!V}uQU|+HRCAsFZ%9%9::E"A1eBFFm666IFAttth&'FC<r9   c           
         ddt          d          z  z   }t          |           }|t          |          z  }|dk    r=| d         |t          j        || z            z  z   }||dz
  z  |z  }t          |          S t          dt          d| f         t          t          j        || z                                }t          d          }t          d| f         }t          ||| |          \  }}	||dz
  z  ||dz
           z  }
t          | t          d| f         t          |
                    }t          | g          }t          |||dd d         |          \  }}	t          |d d d         |
f         }|d	z  S )
Nrh   r;   g       @r   r   rf   rA   rB   g       @rw   rx   s              r8   _quadratic_coeffr      sx   	a$s))m	BFA6!99_FAvvq	BFVO!<!<<<rAv&&!!! Ar!bS&z:cj&.I.I#J#JKKEQA
1rc6
Aq!V...HE1 R!V}uQU|+HRCAsFZ%9%9::E"A1eBFFm666IFAttth&'FC<r9           c                 L    |dk    rt          | |          S t          |           S )a  
    Compute cubic spline coefficients for rank-1 array.

    Find the cubic spline coefficients for a 1-D signal assuming
    mirror-symmetric boundary conditions. To obtain the signal back from the
    spline representation mirror-symmetric-convolve these coefficients with a
    length 3 FIR window [1.0, 4.0, 1.0]/ 6.0 .

    Parameters
    ----------
    signal : ndarray
        A rank-1 array representing samples of a signal.
    lamb : float, optional
        Smoothing coefficient, default is 0.0.

    Returns
    -------
    c : ndarray
        Cubic spline coefficients.

    See Also
    --------
    cspline1d_eval : Evaluate a cubic spline at the new set of points.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a cubic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import cspline1d, cspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = cspline1d_eval(cspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    r   )ru   r   rl   rm   s     r8   r   r     s,    X s{{"64000F###r9   c                 J    |dk    rt          d          t          |           S )aF  Compute quadratic spline coefficients for rank-1 array.

    Parameters
    ----------
    signal : ndarray
        A rank-1 array representing samples of a signal.
    lamb : float, optional
        Smoothing coefficient (must be zero for now).

    Returns
    -------
    c : ndarray
        Quadratic spline coefficients.

    See Also
    --------
    qspline1d_eval : Evaluate a quadratic spline at the new set of points.

    Notes
    -----
    Find the quadratic spline coefficients for a 1-D signal assuming
    mirror-symmetric boundary conditions. To obtain the signal back from the
    spline representation mirror-symmetric-convolve these coefficients with a
    length 3 FIR window [1.0, 6.0, 1.0]/ 8.0 .

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a quadratic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import qspline1d, qspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = qspline1d_eval(qspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    r   z.Smoothing quadratic splines not supported yet.)
ValueErrorr   r   s     r8   r   r   A  s+    Z s{{IJJJ'''r9   r#   c                    t          |          |z
  t          |          z  }t          || j                  }|j        dk    r|S t          |           }|dk     }||dz
  k    }||z   }t          | ||                    ||<   t          | d|dz
  z  ||         z
            ||<   ||         }|j        dk    r|S t          || j                  }	t          |dz
                                t                    dz   }
t          d          D ]>}|
|z   }|                    d|dz
            }|	| |         t          ||z
            z  z  }	?|	||<   |S )a  Evaluate a cubic spline at the new set of points.

    `dx` is the old sample-spacing while `x0` was the old origin. In
    other-words the old-sample points (knot-points) for which the `cj`
    represent spline coefficients were at equally-spaced points of:

      oldx = x0 + j*dx  j=0...N-1, with N=len(cj)

    Edges are handled using mirror-symmetric boundary conditions.

    Parameters
    ----------
    cj : ndarray
        cublic spline coefficients
    newx : ndarray
        New set of points.
    dx : float, optional
        Old sample-spacing, the default value is 1.0.
    x0 : int, optional
        Old origin, the default value is 0.

    Returns
    -------
    res : ndarray
        Evaluated a cubic spline points.

    See Also
    --------
    cspline1d : Compute cubic spline coefficients for rank-1 array.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a cubic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import cspline1d, cspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = cspline1d_eval(cspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    r@   r   r   r;   r`   )r   rE   r   r)   sizeri   r   r   r+   intrangecliprI   cjnewxdxx0resNcond1cond2cond3resultjlowerithisjindjs                 r8   r   r   t  sa   d DMMB%))+D
T
*
*
*C
x1}}
BA1HEAENEemET%[L11CJAQK$u+$=>>CJ;DyA~~
BH---F4!8__##C((1,F1XX 2 2
zz!QU##"T(VD5L1111CJJr9   c                 p   t          |          |z
  |z  }t          |          }|j        dk    r|S t          |           }|dk     }||dz
  k    }||z   }t	          | ||                    ||<   t	          | d|dz
  z  ||         z
            ||<   ||         }|j        dk    r|S t          |          }	t          |dz
                                t                    dz   }
t          d          D ]>}|
|z   }|	                    d|dz
            }|	| |         t          ||z
            z  z  }	?|	||<   |S )a  Evaluate a quadratic spline at the new set of points.

    Parameters
    ----------
    cj : ndarray
        Quadratic spline coefficients
    newx : ndarray
        New set of points.
    dx : float, optional
        Old sample-spacing, the default value is 1.0.
    x0 : int, optional
        Old origin, the default value is 0.

    Returns
    -------
    res : ndarray
        Evaluated a quadratic spline points.

    See Also
    --------
    qspline1d : Compute quadratic spline coefficients for rank-1 array.

    Notes
    -----
    `dx` is the old sample-spacing while `x0` was the old origin. In
    other-words the old-sample points (knot-points) for which the `cj`
    represent spline coefficients were at equally-spaced points of::

      oldx = x0 + j*dx  j=0...N-1, with N=len(cj)

    Edges are handled using mirror-symmetric boundary conditions.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a quadratic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import qspline1d, qspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = qspline1d_eval(qspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    r   r   r;   rL   rR   )r   r   r   ri   r    r   r+   r   r   r   rN   r   s                 r8   r    r      sO   h DMMB"$D
T

C
x1}}
BA1HEAENEemET%[L11CJAQK$u+$=>>CJ;DyA~~
F4#:%%c**Q.F1XX 6 6
zz!QU##"T(Zu5555CJJr9   N)r!   )r   )r#   r   )+numpyr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   _spliner   r   _signaltoolsr   r   r   scipy.interpolater   __all__r   _splinefunc_cacher   rI   rN   rY   r^   rd   ru   r   r   r   r   r   r     r9   r8   <module>r      s\  F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
 ) ( ( ( ( ( ( ( 3 3 3 3 3 3 3 3 3 3 % % % % % %I I I5 5 5 5p  /A /A /Ad        
H H H' ' 'T  D  D/$ /$ /$ /$d0( 0( 0( 0(fG G G GTI I I I I Ir9   