U
    Hvf+                     @   s   d dl Zd dlmZ d dlmZmZ d dlmZ	 d dlZd dl
mZmZ d dlmZmZ d dlmZ dd	d
ZG dd dZeejejeefZG dd dZdd ZdS )    N)product)assert_equalassert_allclose)raises)upfirdnfirwin)_output_len_upfirdn_modes)	_pad_test   c                 C   sb   t |}t t| | | j}| |dd|< t ||dd| dtt|t| || }|S )zpNaive upfirdn processing in Python.

    Note: arg order (x, h) differs to facilitate apply_along_axis use.
    N)npasarrayzeroslendtypeZconvolver   )xhupdownout r   C/tmp/pip-unpacked-wheel-96ln3f52/scipy/signal/tests/test_upfirdn.pyupfirdn_naive/   s
    
0r   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )UpFIRDnCasezTest _UpFIRDn objectc                 C   s0   || _ || _t|| _|| _tjd| _d S )N   )	r   r   r   
atleast_1dr   x_dtyperandomRandomStaterng)selfr   r   r   r   r   r   r   __init__=   s
    zUpFIRDnCase.__init__c                 C   s(  |  td| j |  td| j | jd| j}| jtjtjfkrb|d| jd 7 }|  | |  t	d| j d}| jj| | j}| jtjtjfkr|d| jj|  7 }t
t|D ]}| j ||d q|d d d d ddd df j}t
t|D ]}| j ||d qd S )Nr   
                 ?)         axisr$   r%   )scrubr   onesr   r   randnastype	complex64
complex128arangeranger   T)r    r   sizer(   r   r   r   __call__D   s     
 zUpFIRDnCase.__call__c                 C   s>  t t||| j| j| j}tt| j|j| | j| j}|j| |ksJt	t
| j|| j| j|d}|j| |kstt	|j|jkst	| jj|jf}tdd |D rt|jt j n|t j|krt j|krt|jt j nXtdd |D rt|jt j n6t j|kst j|kr"t|jt j nt|jt j t|| d S )Nr'   c                 s   s   | ]}|t jkV  qd S N)r   r-   .0dr   r   r   	<genexpr>d   s     z$UpFIRDnCase.scrub.<locals>.<genexpr>c                 s   s   | ]}|t jkV  qd S r5   )r   float32r6   r   r   r   r9   h   s     )r   Zapply_along_axisr   r   r   r   r   r   shapeAssertionErrorr   r   allr   r-   r:   r.   float64r   )r    r   r(   yrwant_lenyZdtypesr   r   r   r)   [   s*    
  zUpFIRDnCase.scrubN)r4   )__name__
__module____qualname____doc__r!   r3   r)   r   r   r   r   r   ;   s   r   c                   @   s  e Zd Zdd Zejddddddgejd	dddddgd
d Zdd Zejdddddddddgfdddddddddgfdddddddddgfdddddddddgfdddddddddddgfgdd Z	ejddddgdd Z
ejdeejddejdddd d!gd"d# Zejdeejd$eejd%eed&d&d'd( Zd)d* Zejd+ed,d- Zejd.ed/gddd0geejejejejgd1d2 Zd3S )4TestUpfirdnc                 C   sF   t ttdgdgdd t ttg dgdd t ttdggdgdd d S )Nr   r   )assert_raises
ValueErrorr   )r    r   r   r   test_valid_inputv   s    zTestUpfirdn.test_valid_inputlen_hr   r$   r%      r&   len_xc                 C   sZ   t |}d||d < t |}t||dd}t ||d |d d fd}t|| d S )N      ?r$   r   constant)r   r   r*   r   padr   )r    rJ   rL   r   r   rA   Zwantr   r   r   test_singleton{   s    

zTestUpfirdn.test_singletonc                 C   sL   t ddgdgdd}t|ddg t ddgddgdd}t|dddg d S )Nr   rM   g        r   )r   r   )r    rA   r   r   r   test_shift_x   s    zTestUpfirdn.test_shift_xz len_h, len_x, up, down, expectedr         c           	      C   s8   t |}d|d< t |}t||||}t|| d S )NrM   r   )r   r   r*   r   r   )	r    rJ   rL   r   r   expectedr   r   rA   r   r   r   test_length_factors   s
    	

zTestUpfirdn.test_length_factorszdown, want_len)r$   i  )rS   i  )O      c                 C   s   t jd}tt jt jttf}d}|D ]}||	|}|t jt j
fkr\|d|| 7 }tdd| dd}t||d|}	t||d|d	}
|
j|fkst|	jd
 |
jd
 kstt|	|
ddd q&d S )Nr   i'  r#      rM   Zhamming)Zwindowr   )r   r   r   gHz>atolrtol)r   r   r   intr:   r-   floatcomplexr+   r,   r.   r   r   r   r;   r<   r   )r    r   r@   random_stateZ	try_typesr2   r   r   r   ZylrA   r   r   r   test_vs_convolve   s    zTestUpfirdn.test_vs_convolver   r   )rM   r#   zup, down)r   r   )r$   r$   )r%   r$   )r$   r%   c                 C   s   t ||||  d S r5   )r   )r    r   r   r   r   r   r   r   test_vs_naive_delta   s    zTestUpfirdn.test_vs_naive_deltah_dtypezp_max, q_max)r"   d   c                 C   s$   |  ||||}|D ]
}|  qd S r5   )_random_factors)r    r   rb   p_maxq_maxteststestr   r   r   test_vs_naive   s    zTestUpfirdn.test_vs_naivec                 C   s   d}d}t jd}g }t|D ]}	||kr0|nd}
||kr@|nd}|||
 }||| }||d }t ||}||}|tkr|d|| 7 }|t	|||| q |S )Nr%      r   r   r#   )
r   r   r   r0   randintr   r,   r^   appendr   )r    re   rf   rb   r   Zn_repZ	longest_hr_   rg   _Zp_addZq_addpqrJ   r   r   r   r   rd      s     
zTestUpfirdn._random_factorsmodec           
      C   s\  t jddddgtd}d\}}t||||d}|dkrbt dddd	d
ddddddd	d
dddg}n|dkrt ddddddddddddddddg}n|dkrt ddd	d
dddddddd	ddddg}n|dkr:|d |d  t|d  }|d t | dd|  }|d t d|d |  }	t |||	f}nt j|||f|d}t	|| dS )z@Test vs. manually computed results for modes not in numpy's pad.r   r$   r%   r   )rR   rR   nprenpostrp   antisymmetricr4   antireflectr   smoothiiilinerp   N)
r   arrayr]   r
   r   r   r/   ZconcatenaterO   r   )
r    rp   r   rs   rt   rA   
y_expectedZ	lin_slopeleftrightr   r   r   test_extensions   s,    """
zTestUpfirdn.test_extensionszsize, h_len, mode, dtype      c                 C   s   t jd}|||}|t jt jfkr>|d|| 7 }t jdd| |jj	d}t
||dd|d}|d }	|dkrt||	|	|d}
nt j||	|d}
t
||
ddd	d}||	|	  }t |jd
  }}t||||d d S )Nr&   r#   r   rq   )r   r   rp   )ru   rx   ry   r|   rr   r}   rN   g      Y@rY   )r   r   r   r+   r,   r-   r.   r/   realr   r   r
   rO   ZfinfoZepsr   )r    r2   Zh_lenrp   r   r_   r   r   rA   ZnpadZxpadZypadr   rZ   r[   r   r   r   
test_modes   s    
zTestUpfirdn.test_modesN)rB   rC   rD   rI   pytestmarkZparametrizerP   rQ   rU   r`   _UPFIRDN_TYPESra   listr   ri   rd   r	   r   r   r:   r>   r-   r.   r   r   r   r   r   rF   t   sT   	



	rF   c                  C   s.   d} d}d}d}t | |||}|dks*td S )Ni  i i@  i  i6S)r   r<   )rJ   Zin_lenr   r   Zout_lenr   r   r   test_output_len_long_input  s    r   )r   r   )Znumpyr   	itertoolsr   Znumpy.testingr   r   r   r   rG   Zscipy.signalr   r   Zscipy.signal._upfirdnr   r	   Zscipy.signal._upfirdn_applyr
   r   r   r\   r:   r-   r]   r^   r   rF   r   r   r   r   r   <module>#   s   
6 !