o
     j-0                     @   s  d dl Z d dlmZmZmZ d dlZd dlZd dlmZ G dd dZ	e	 Z
e
 dee dedefd	d
Ze
 deeef defddZe
 dededefddZe
 dedefddZe
 dededefddZe
 	d@dedededefddZe
 	d@dededededef
ddZe
 	d@dededededef
d d!Ze
 	dAdedededefd$d%Ze
 d@dedededefd&d'Ze
 d@dedededefd(d)Ze
 	dBdedededefd+d,Ze
 	d@ded-edededef
d.d/Ze
 	dCdedededefd1d2Ze
 d@dedededefd3d4Ze
 d@dedededefd5d6Ze
 d@dedededefd7d8Z e
 d@dedededefd9d:Z!		d@d;eeeeef f d<ed=ededef
d>d?Z"dS )D    N)ListTupleUnion)Tensorc                   @   s&   e Zd Zdd ZdddZdd ZdS )	WindowFunctionRegisterc                 C   s
   i | _ d S N_functions_dictself r   _/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/audio/functional/window.py__init__      
zWindowFunctionRegister.__init__Nc                    s    fdd}|S )Nc                    s   | j }|  j|< | S r   )__name__r	   )funcnamer
   r   r   add_subfunction   s   
z8WindowFunctionRegister.register.<locals>.add_subfunctionr   )r   r   r   r   r
   r   register   s   zWindowFunctionRegister.registerc                 C   s
   | j | S r   r   )r   r   r   r   r   get"   r   zWindowFunctionRegister.getr   )r   
__module____qualname__r   r   r   r   r   r   r   r      s    
r   x	data_typereturnc                 C   sT   g }| D ] }t |rt|ts|t|g| q|t|| qt|S r   )npZisscalar
isinstancestrappendpaddleZ	to_tensorconcat)r   r   ltr   r   r   _cat)   s   
r#   c                 C   sD   t | trt| t| d d  S t| tt| d  S )N      )r   floatmathlogsqrtr   Zsquare)r   r   r   r   _acosh4   s   
r*   Msymc                 C   s   |s| d dfS | dfS )z:Extend window by 1 sample if needed for DFT-even symmetry.r%   TFr   )r+   r,   r   r   r   _extend;   s   r-   c                 C   s$   t | | ks
| dk rtd| dkS )z)Handle small or incorrect window lengths.r   z.Window length M must be a non-negative integerr%   )int
ValueError)r+   r   r   r   _len_guardsD   s   r0   wneededc                 C   s   |r| dd S | S )z<Truncate window by 1 sample if needed for DFT-even symmetry.Nr   )r1   r2   r   r   r   	_truncateM   s   r4   Tfloat64dtypec                 C   sl   t | rtj| f|dS t| |\} }tjd| |d| d d  }tdt|| d|   }t||S )zCompute a window with a generalized Gaussian shape.
    This function is consistent with scipy.signal.windows.general_gaussian().
    r6   r         ?       @g      r$   )r0   r   onesr-   arangeexpabsr4   )r+   psigr,   r6   needs_truncnr1   r   r   r   _general_gaussianV   s    
rB   ac                 C   s   t | rtj| f|dS t| |\} }tjtj tj| |d}tj| f|d}tt	|D ]}||| t
||  7 }q-t||S )zCompute a generic weighted sum of cosine terms window.
    This function is consistent with scipy.signal.windows.general_cosine().
    r7   )r0   r   r:   r-   linspacer'   piZzerosrangelencosr4   )r+   rC   r,   r6   r@   facr1   kr   r   r   _general_cosineg   s   
rK   alphac                 C   s   t | |d| g||dS )zvCompute a generalized Hamming window.
    This function is consistent with scipy.signal.windows.general_hamming()
    r8   r7   rK   )r+   rL   r,   r6   r   r   r   _general_hammingx   s   rN         c              	      s  t rtjf|dS t|\}d|d  }t|tj }|d |d |d d   }	tjd||dtj|d f|d t	}
d|
ddd< d|
ddd<  }t
tD ]u}|
| td|| |	 |d d d     }|d	krdtd|| ||d d    }n<|td krdtd|| |d|    }n"dtd|| |d|    td|| ||d d    }||  |< q] fd
d}|tjd	|d}|rd|d d  }||9 }| }t||S )zCompute a Taylor window.
    The Taylor window taper function approximates the Dolph-Chebyshev window's
    constant sidelobe level for a parameterized number of near-in sidelobes.
    r7   
      r$         ?r%   Nr3   r   c                    sD   ddt  dt dtj d | d  d     S )Nr%   r$   r   r9   rS   )r   matmulZ	unsqueezerH   r'   rE   )rA   ZFmr+   mar   r   W   s   ,z_taylor.<locals>.Wr8   )r0   r   r:   r-   r*   r'   rE   r;   emptyZ
empty_likerF   rG   prodZsqueezer4   )r+   ZnbarZsllZnormr,   r6   r@   BAs2Zsignsm2miZnumerdenomrW   r1   scaler   rU   r   _taylor   sD   

"($ 
ra   c                 C      t | d||dS )zCompute a Hamming window.
    The Hamming window is a taper formed by using a raised cosine with
    non-zero endpoints, optimized to minimize the nearest side lobe.
    gHzG?r7   rN   r+   r,   r6   r   r   r   _hamming      re   c                 C   rb   )zCompute a Hann window.
    The Hann window is a taper formed by using a raised cosine or sine-squared
    with ends that touch zero.
    rS   r7   rc   rd   r   r   r   _hann   rf   rg   rS   c              	   C   s<  t | rtj| f|dS |dkrtj| f|dS |dkr"t| |dS t| |\} }tjd| |d}t|| d  d }|d|d  }||d | | d  }|| | d d }	ddttj	d	d| | | d      }
tj|j
|d}ddttj	d
| d d|	 | | d      }t|
||g}t||S )z[Compute a Tukey window.
    The Tukey window is also known as a tapered cosine window.
    r7   r   r8   )r,   r%   r9   NrS   r3   g       )r0   r   r:   rg   r-   r;   r.   rH   r'   rE   shaper    r4   )r+   rL   r,   r6   r@   rA   widthZn1Zn2Zn3Zw1Zw2Zw3r1   r   r   r   _tukey   s*   ,*
rj   stdc                 C   sl   t | rtj| f|dS t| |\} }tjd| |d| d d  }d| | }t|d  | }t||S )ztCompute a Gaussian window.
    The Gaussian widows has a Gaussian shape defined by the standard deviation(std).
    r7   r   r8   r9   r$   )r0   r   r:   r-   r;   r<   r4   )r+   rk   r,   r6   r@   rA   Zsig2r1   r   r   r   	_gaussian   s   
rl   r8   c                 C   s   |r
|dur
t dt| rtj| f|dS t| |\} }|du r'| d d }tjd| |d}tt||  | }t||S )z+Compute an exponential (or Poisson) window.Nz"If sym==True, center must be None.r7   r%   r$   r   )	r/   r0   r   r:   r-   r;   r<   r=   r4   )r+   centertaur,   r6   r@   rA   r1   r   r   r   _exponential  s   
ro   c                 C   s   t | rtj| f|dS t| |\} }tjd| d d d |d}| d dkr<d| d |  }t||ddd g}nd| | d  }t||ddd g}t||S )	zCompute a triangular window.r7   r%   r$   r   r8   Nr3   )r0   r   r:   r-   r;   r    r4   )r+   r,   r6   r@   rA   r1   r   r   r   _triang  s   
rq   c                 C   s   t | rtj| f|dS t| |\} }ttjdd| |ddd }d| ttj|  dtj t	tj|   }t
d|dg|}t||S )z^Compute a Bohman window.
    The Bohman window is the autocorrelation of a cosine window.
    r7   r3   r%   r8   r   )r0   r   r:   r-   r=   rD   rH   r'   rE   sinr#   r4   )r+   r,   r6   r@   rI   r1   r   r   r   _bohman'  s    "
rs   c                 C   s   t | g d||dS )a  Compute a Blackman window.
    The Blackman window is a taper formed by using the first three terms of
    a summation of cosines. It was designed to have close to the minimal
    leakage possible.  It is close to optimal, only slightly worse than a
    Kaiser window.
    )gzG?rS   g{Gz?r7   rM   rd   r   r   r   	_blackman9  s   rt   c                 C   sT   t | rtj| f|dS t| |\} }ttj|  tjd| |dd  }t||S )z,Compute a window with a simple cosine shape.r7   r   rS   )	r0   r   r:   r-   rr   r'   rE   r;   r4   )r+   r,   r6   r@   r1   r   r   r   _cosineD  s
   $
ru   window
win_lengthfftbinsc              
   C   s   | }d}t | tr| d }t| dkr| dd }nt | tr/| dv r,td|  d | }n
tdtt|  z	td	| }W n tyS } ztd
|d}~ww |f| }	d|i}
||	d|i|
S )a  Return a window of a given length and type.

    Args:
        window (Union[str, Tuple[str, float]]): The window function applied to the signal before the Fourier transform. Supported window functions: 'hamming', 'hann', 'gaussian', 'general_gaussian', 'exponential', 'triang', 'bohman', 'blackman', 'cosine', 'tukey', 'taylor'.
        win_length (int): Number of samples.
        fftbins (bool, optional): If True, create a "periodic" window. Otherwise, create a "symmetric" window, for use in filter design. Defaults to True.
        dtype (str, optional): The data type of the return window. Defaults to 'float64'.

    Returns:
        Tensor: The window represented as a tensor.

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> n_fft = 512
            >>> cosine_window = paddle.audio.functional.get_window('cosine', n_fft)

            >>> std = 7
            >>> gaussian_window = paddle.audio.functional.get_window(('gaussian',std), n_fft)
    r   r   r%   N)ZgaussianZexponentialzThe 'z6' window needs one or more parameters -- pass a tuple.z#%s as window type is not supported._zUnknown window type.r,   r6   )	r   tuplerG   r   r/   typewindow_function_registerr   KeyError)rv   rw   rx   r6   r,   argsZwinstrZwinfunceparamskwargsr   r   r   
get_windowO  s2   




r   )Tr5   )rO   rP   TTr5   )rS   Tr5   )Nr8   Tr5   )#r'   typingr   r   r   numpyr   r   r   r   r|   r   r   r#   r&   r*   r.   boolr-   r0   r4   rB   rK   rN   ra   re   rg   rj   rl   ro   rq   rs   rt   ru   r   r   r   r   r   <module>   s   
	8!
