o
    Ebu&                     @   s&  d Z ddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZ 		d3ddd	d
ZeedZde_eedZde_		d3ddddZeedZde_eedZde_		d3ddddZeedZde_eedZde_d4ddddZd4ddddZd4ddddZd4ddddZd4dddd Zd4ddd!d"Z		d5ddd#d$Z ee dZ!d%e!_ee dZ"d&e"_		d5ddd'd(Z#ee#dZ$d)e$_ee#dZ%d*e%_		d5ddd+d,Z&ee&dZ'd-e'_ee&dZ(d.e(_d6d/d0Z)ee)dZ*d1e*_ee)dZ+d2e+_dS )7z(
Discrete Fourier Transforms - basic.py
    N   )pypocketfft)	_asfarray_init_nd_shape_and_axes_datacopied
_fix_shape_fix_shape_1d_normalization_workersF)planc                C   s   |durt dt|}|pt||}t|| }t|}|dur-t|||\}}	|p+|	}n|j| dk r>td|j| |rH|j	j
dkrH|nd}
t||f| ||
|S )z@ Return discrete Fourier transform of real or complex sequence. NFPassing a precomputed plan is not yet supported by scipy.fft functionsr   -invalid number of data points ({0}) specifiedc)NotImplementedErrorr   r   r	   r
   r   shape
ValueErrorformatdtypekindpfftc2c)forwardxnaxisnormoverwrite_xworkersr   tmpcopiedout r"   </usr/lib/python3/dist-packages/scipy/fft/_pocketfft/basic.pyr      s   

r   Tfftifftc          
      C   s   |durt dt|}t|| }t|}t|std|dur+t|||\}}	n|j| dk r<t	d
|j| t||f| |d|S )z8
    Discrete Fourier transform of a real sequence.
    Nr   x must be a real sequencer   r   )r   r   r	   r
   np	isrealobj	TypeErrorr   r   r   r   r   r2c
r   r   r   r   r   r   r   r   r   _r"   r"   r#   r*   (   s   

r*   rfftihfftc          
   	   C   s   |durt dt|}t|| }t|}t|r|d }|du r7|j| d d }|dk r6td|nt	||d d |\}}	t
||f|| |d|S )zG
    Return inverse discrete Fourier transform of real sequence x.
    Nr                   r      z-Invalid number of data points ({0}) specified)r   r   r	   r
   r'   r(   r   r   r   r   r   c2rr+   r"   r"   r#   r1   G   s    

r1   hfftirfftr   c                C   "   |durt dt| |||||S )z)
    2-D discrete Fourier transform.
    Nr   )r   fftnr   saxesr   r   r   r   r"   r"   r#   fft2j      r;   c                C   r6   )zM
    2-D discrete inverse Fourier transform of real or complex sequence.
    Nr   )r   ifftnr8   r"   r"   r#   ifft2u   r<   r>   c                C   r6   )z;
    2-D discrete Fourier transform of a real sequence
    Nr   )r   rfftnr8   r"   r"   r#   rfft2   r<   r@   c                C   r6   )zC
    2-D discrete inverse Fourier transform of a real sequence
    Nr   )r   irfftnr8   r"   r"   r#   irfft2   r<   rB   c                C   r6   )z@
    2-D discrete Fourier transform of a Hermitian sequence
    Nr   )r   hfftnr8   r"   r"   r#   hfft2   r<   rD   c                C   r6   )zH
    2-D discrete inverse Fourier transform of a Hermitian sequence
    Nr   )r   ihfftnr8   r"   r"   r#   ihfft2   r<   rF   c                C   s   |durt dt|}t|||\}	}|pt||}t|}t|dkr'|S t||	|\}}
|p2|
}t|| }|rB|jj	dkrB|nd}t
||| |||S )z=
    Return multidimensional discrete Fourier transform.
    Nr   r   r   )r   r   r   r   r
   lenr   r	   r   r   r   r   )r   r   r9   r:   r   r   r   r   r   r   r    r!   r"   r"   r#   c2cn   s   
rH   r7   r=   c                C   s   |durt dt|}t|stdt|||\}	}t||	|\}}
t|| }t|}t	|dkr8t
dt||| |d|S )z@Return multidimensional discrete Fourier transform of real inputNr   r&   r   #at least 1 axis must be transformed)r   r   r'   r(   r)   r   r   r	   r
   rG   r   r   r*   )r   r   r9   r:   r   r   r   r   r   r   r,   r"   r"   r#   r2cn   s   

rJ   r?   rE   c             	   C   s   |durt dt|}t|r|d }|du }	t|||\}
}t|dkr+td|	r:|j|d  d d |
d< t|| }t	|}|
d }|
d d d |
d< t
||
|\}}t|||| |d|S )	zDMultidimensional inverse discrete fourier transform with real outputNr   r/   r   rI   r   r   r0   )r   r   r'   r(   r   rG   r   r   r	   r
   r   r   r1   )r   r   r9   r:   r   r   r   r   r   Znoshaper   Zlastsizer,   r"   r"   r#   c2rn   s"   

rK   rC   rA   c           
   	   C   s   t |}|p
t||}t|| }td}|jjdkrtd|dur/t|||\}}|p-|}n|j| dk r@t	d
|j| |rD|nd}	t||f| | ||	|S )z=FFT of a real sequence, returning fftpack half complex formatNr   r&   r   r   )r   r   r	   r
   r   r   r)   r   r   r   r   r   r2r_fftpack)
r   r   r   r   r   r   r   r   r    r!   r"   r"   r#   rL     s   

rL   rfft_fftpackirfft_fftpack)Nr   NFN)Nr4   NFN)NNNFN)Nr   NF),__doc__Znumpyr'   	functools r   r   helperr   r   r   r   r   r	   r
   r   partialr$   __name__r%   r*   r-   r.   r1   r2   r3   r;   r>   r@   rB   rD   rF   rH   r7   r=   rJ   r?   rE   rK   rC   rA   rL   rM   rN   r"   r"   r"   r#   <module>   s    $"

