o
    'Æ&i-  ã                   @   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   úJC:\wamp64\www\opt\env\Lib\site-packages\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v r1|d| j d¡ 7 }|   |¡ |   t 	d¡ | j¡¡ d}| jj|Ž  | j¡}| jtjtjfv ra|d| jj|Ž  7 }t
t|ƒƒD ]	}| j ||d qg|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s%J ‚t	| j|| j| j|d}|j| |ks:J ‚|j|jksBJ ‚| jj
|j
f}tdd„ |D ƒƒrZt|j
t jƒ n<t j|v rlt j|v rlt|j
t jƒ n*tdd„ |D ƒƒr}t|j
t jƒ nt j|v s‡t j|v rt|j
t jƒ nt|j
t jƒ t||ƒ d S )Nr'   c                 s   ó    | ]}|t jkV  qd S ©N)r   r-   ©Ú.0Údr   r   r   Ú	<genexpr>d   ó   € z$UpFIRDnCase.scrub.<locals>.<genexpr>c                 s   r5   r6   )r   Úfloat32r7   r   r   r   r:   h   r;   )r   Zapply_along_axisr   r   r   r   r   r   Úshaper   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g d¢¡ej dg d¢¡dd„ ƒƒZdd	„ Zej d
ddddg d¢fddddg d¢fddddg d¢fddddg d¢fddddg d¢fg¡dd„ ƒZ	ej dg d¢¡dd„ ƒZ
ej de¡ej dd¡ej dg d ¢¡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g d/¢eejejejejgƒ¡d0d1„ ƒZd2S )3Ú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_h)r   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    rK   rM   r   r   rB   Zwantr   r   r   Útest_singleton{   s   

zTestUpfirdn.test_singletonc                 C   sJ   t ddgdgddƒ}t|ddgƒ t ddgddgddƒ}t|g d¢ƒ d S )Nr   rN   g        )r   r   r   )r   r   )r    rB   r   r   r   Útest_shift_x†   s   zTestUpfirdn.test_shift_xz len_h, len_x, up, down, expectedr$   r&   )r   r   r   r   r%   é   )r   r   r   r   r   rL   )r   r   r   r   r   )r   r   r   r   r   é   )r   r   r   r   r   r   r   c           	      C   s8   t  |¡}d|d< t  |¡}t||||ƒ}t||ƒ d S )NrN   r   )r   r   r*   r   r   )	r    rK   rM   r   r   Úexpectedr   r   rB   r   r   r   Útest_length_factors   s
   
	
zTestUpfirdn.test_length_factorszdown, want_len))r$   i—  )rT   i  )éO   é   c                 C   sÊ   t j d¡}tt jt jttf}d}|D ]O}| |¡ 	|¡}|t jt j
fv r.|d| |¡ 7 }tdd| dd}t||d|ƒ}	t||d|d	}
|
j|fksNJ ‚|	jd
 |
jd
 ksZJ ‚t|	|
ddd qd S )Nr   i'  r#   é   rN   Zhamming)Zwindowr   )r   r   r   gH¯¼šò×z>©ÚatolÚrtol)r   r   r   Úintr<   r-   ÚfloatÚcomplexr+   r,   r.   r   r   r   r=   r   )r    r   rA   Úrandom_stateZ	try_typesr2   r   r   r   ZylrB   r   r   r   Útest_vs_convolveŸ   s   özTestUpfirdn.test_vs_convolver   r   )rN   r#   zup, down)©r   r   )r$   r$   )r%   r$   )r$   r%   c                 C   s   t ||||ƒƒ  d S r6   )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 r6   )Ú_random_factors)r    r   rd   Ú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}	||kr|nd}
||kr |nd}| |¡|
 }| |¡| }| |¡d }t  | |¡¡}| |¡}|tkrQ|d| |¡ 7 }| t	||||ƒ¡ q|S )Nr%   é   r   r   r#   )
r   r   r   r0   Úrandintr   r,   r_   Úappendr   )r    rg   rh   rd   r   Zn_repZ	longest_hr`   ri   Ú_Zp_addZq_addÚpÚqrK   r   r   r   r   rf   Å   s    
zTestUpfirdn._random_factorsÚmodec           
      C   s  t jg d¢td}d\}}t||||d}|dkr!t  g d¢¡}nY|dkr-t  g d¢¡}nM|d	kr9t  g d
¢¡}nA|dkrp|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   ©r   )rS   rS   ©ÚnpreÚnpostrr   Úantisymmetric)r%   r   r4   éýÿÿÿéþÿÿÿr4   r   r$   r%   r   r4   rx   ry   r4   r   r$   Úantireflect)r   r$   r%   r   r4   r   r   r$   r%   r   r4   r   r   r$   r%   r   Úsmooth)éûÿÿÿéüÿÿÿrx   ry   r4   r   r   r$   r%   r   r4   rx   r|   iùÿÿÿi÷ÿÿÿiõÿÿÿÚliner4   r   r   ©rr   N)
r   Úarrayr^   r
   r   r   r/   ZconcatenaterP   r   )
r    rr   r   ru   rv   rB   Ú
y_expectedZ	lin_slopeÚleftÚrightr   r   r   Útest_extensionsÝ   s,   ÿÿÿzTestUpfirdn.test_extensionszsize, h_len, mode, dtypeé   )rL   r&   é   c                 C   sâ   t j d¡}| |¡ |¡}|t jt jfv r|d| |¡ 7 }t jdd| |jj	d}t
||dd|d}|d }	|dv rEt||	|	|d}
nt j||	|d}
t
||
ddd	d}||	|	 … }t  |¡jd
  }}t||||d d S )Nr&   r#   r   rs   )r   r   rr   )rw   rz   r{   r~   rt   r   rO   g      Y@rZ   )r   r   r   r+   r,   r-   r.   r/   Úrealr   r   r
   rP   ZfinfoZepsr   )r    r2   Zh_lenrr   r   r`   r   r   rB   ZnpadZxpadZypadr   r[   r\   r   r   r   Ú
test_modesõ   s   
zTestUpfirdn.test_modesN)rC   rD   rE   rJ   ÚpytestÚmarkZparametrizerQ   rR   rV   ra   Ú_UPFIRDN_TYPESrc   Úlistr   rk   rf   r	   r„   r   r<   r?   r-   r.   rˆ   r   r   r   r   rG   t   sN    	
û

ÿ
üþ	rG   c                  C   s.   d} d}d}d}t | |||ƒ}|dksJ ‚d S )Nié  i áõi@  i¹  i¸6S)r   )rK   Zin_lenr   r   Zout_lenr   r   r   Útest_output_len_long_input  s   r   rb   )Únumpyr   Ú	itertoolsr   Znumpy.testingr   r   r‰   r   rH   Zscipy.signalr   r   Zscipy.signal._upfirdnr   r	   Zscipy.signal._upfirdn_applyr
   r   r   r]   r<   r-   r^   r_   r‹   rG   r   r   r   r   r   Ú<module>   s   "
6 !