a
    {k`]                     @   s\  d Z ddlZddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZ G d
d deZG dd deZG dd deZG dd deZG dd deZdd Zd'ddZdd ZedkrXddlmZ ddlmZ  edddZ!ee!\Z"Z#Z$e%e"d  Z"e&e"d! Z'd"e"e"e'k< e j(e"d#d$g d%d& e )  dS )(z9
Bilinear Time-Frequency Processing in the Affine Class.
    N)hilbert)brenthnewton)splrepsplev)mexhatscale)integrate_2d)BaseTFRepresentation)nextpow2c                       s`   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zd fdd	Z	dd Z
dd Z  ZS )AffineDistributionTNc              	      sv  t t| j|fi | |jdkr\d| _| jd d df  | jd d df   | _| _nd| _| j  | _| _t	
| j| _t	
| j| _| jjd | jjd d  d | _|d u s|d u rFt	jt	j| j| j | j d  }t	jt	j| j| j | j d  }|jd }t	|d tt	|d  d }t	|d tt	|d  d }	| }
|	 }t	ddtt	|d d }|d u r||
d k}t	j|jd td	|t  }td
dt	|| d  g}|d u rF|	|d k}t	j|jd td	|t  }dt	|| d  }|| | _| _|| | _| j||  d | _ d S )N   Zcrossr      auto      ?g       @d   Zdtype{Gz?皙?)!superr   __init__ndimkindsignalcopyx1x2npreals1s2shapemfftfftshifttsminmaxabsintroundlinspacearangeastypeboolfloorceilfmaxfminbwR)selfr   r2   r1   kwargsstf1stf2nstfsp1sp2maxsp1maxsp2fmaskindminindmax	__class__ c/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/tftb/processing/affine.pyr      sB    
4"$$
$$ 
"
"
zAffineDistribution.__init__c                 C   sp   | j | j dd| j   td| jd  d| jd    }t|d }||d  }dt| }t|| _d S Nr   r   )	r3   Tr4   r   logr0   r   r)   n_voices)r5   qnqnminndfltrD   rD   rE   _get_nvoices?   s     zAffineDistribution._get_nvoicesc                 C   s   t jjt| jdd}t jjt| jdd}dtt | j| jj	d d   }dtt | j
| jj	d d   }||d | }||d | }||fS )Nr   Zaxisr   r   )r   r#   r   r   r    r)   r*   r2   r%   r!   r1   )r5   ZSP1ZSP2r@   rA   sp1_anasp2_anarD   rD   rE   
_normalizeK   s    $$zAffineDistribution._normalizec              
   C   s  t d| jd }| j| j d| jd   | _t d| jjd d | j d }| jt 	|d t 
| j  }|| _t 	dt |dd|dd t j }t | jd| jjd |}t | jd| jjd |}t |t | jf}t |t | jf}||fS )Nr   r                 )r   r,   rI   r1   r2   rJ   r   r!   r"   exprH   geo_fdotreshapepir   r    appendzeros)r5   ktrV   ZtfmatxS1S2rD   rD   rE   _geometric_sampleT   s    " ,z$AffineDistribution._geometric_samplec           
      C   s   t d| j }t jt j|}t jt j|}| j }t | j| d| j  }t 	|| j| t
| j| | }d|t
| j< || _|t| j d dt | j  }	|	||fS )Nr   r   r   )r   r,   rI   r#   r$   ifftumaxr(   m1r+   r)   ufloatrH   rJ   )
r5   r^   r_   pmellin1mellin2uminZdurd   betarD   rD   rE   _mellin_transforma   s    ""z$AffineDistribution._mellin_transformcontourr   c              
      sl   t | j| }d| j| j|k< |dt | j| jt| jj	d d }t
t| jf |||d| d S )Nr   freq_yr   )r   show_tfrm   )r   amaxtfrpopr+   r2   r1   r)   r   r!   r   r   plot)r5   r   rn   	thresholdr6   Z_threshrm   rB   rD   rE   rr   m   s    "zAffineDistribution.plotc                 C   sv  t | j| jjd f}| jjd d d }t | j| jd   | | j| jd  | d| j }t	| jD ]}t 
|| j|  | k|| j| | k}t t |d }|| }|||f  }	| j| | j|  }
t||	}t|
| ||d d f< ql| j}| j }|| _|  \}}| jdkr@t j|d }nt ||}|| t||| | j }|| _|||fS )Nr   r   r   r   )r   r[   rI   r%   r!   r   r+   rV   rc   rangelogical_andnonzeroravelr   r   freqsrR   r   linalgnormrW   r	   rp   )r5   tffrrp   ts2gammai	conditionindxyxitckr]   r>   rP   rQ   
multiplierrD   rD   rE   _get_interpolated_tfx   s6    "

z'AffineDistribution._get_interpolated_tfc                 C   s   t d S N)NotImplementedErrorr5   rD   rD   rE   run   s    zAffineDistribution.run)NN)rl   Tr   )__name__
__module____qualname__isaffiner   rN   rR   r`   rk   rr   r   r   __classcell__rD   rD   rB   rE   r      s   $	r   c                       s2   e Zd ZdZdZdZd	 fdd	Zdd Z  ZS )
	ScalogramzMorlet Scalogram.
    Z	scalogramFNc                    s   t t| j|||d |d u r.t|jd }|d u rB| jjd }|| _|| _t	| jt	| j
  }t|| _| jt| _d S )N)r2   r1   r   )r   r   r   r   sqrtr!   r   rI   
waveparamsr   meanr   zrp   r-   complex)r5   r   r2   r1   rI   r   r6   Z
s_centeredrB   rD   rE   r      s    
zScalogram.__init__c                 C   s  t t | jt | j| j}t t | jt| j t d| j}t j| j| jj	d ft
d}| jdkrt| jD ]}| j||  }t tt | tt |d }t dt d |d   |d  }t dt j ||  | }|| }	t | j|	t ||  }
t jtt ||
j	d tt | d td}|
| j ||d d f< |
| }
|
| j t |
| j  | j|d d f< qzn| jdkrlt| jD ]}t|| }	|	j	d d d }t | j|	t ||  }
t tt |d |
j	d tt | d }|
| }
|
| j ||d d f< |
| j t |
| j  | j|d d f< qnt| jt jrJ| jj	\}}||kr| jj| _t jj| jdd}| jj	d }|t |d |d  t t |d |d  k }|d d|   }t t |t| j t |t| j | j}d}|d	 }t d
t || dd|   t d|d  d|d    d g}t!| j|| j| j|}t| jD ]}||d d f }	|	j	d d }t | j|	t ||  }
|
tt "||
j	d t |  }
|
| j ||d d f< |
| j t |
| j  | j|d d f< qt jj| jdd}dtt | j| j#j	d d   }dtt | j| j#j	d d   }|||d  }t $| j| _|  jt j%&|d t'| j| j| 9  _|  j| j  _| j| j||fS )Nr   r   r   r   
                  @rO   gGz?gjt?   )(r   Zlogspacelog10r2   r1   rI   re   r[   r%   r!   r   r   rt   r,   r)   r*   rU   rH   rY   Zconvolver   r   conjrp   r   
isinstanceZndarrayrG   r#   r(   ro   r   r'   r   r/   r   r   ry   rz   r	   )r5   r>   awtptrZnhaZthar   r   ZhaZdetailZixZrwavZcwavZwavefZnwaveZf0Br4   ZnscaleZwtsSPr@   rA   ZSPanarD   rD   rE   r      s      &&.*0

00	&,$$*zScalogram.run)NNNN)	r   r   r   __doc__namer   r   r   r   rD   rD   rB   rE   r      s    r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	UnterbergerDistributionunterbergerANc                    s   | _ tt j|f|||d|  fdd}t|d _ jjd  jjd d  d  _ j j	 j  }|d j k rt
td jd  |  j d }	 j|	 }
d j|	  d  _n
d}	 j}
t
t|
 _|d u r   n| _d S )Nr2   r1   rI   c                    s:   t d| d d  }|| d  || d    j j  S rF   )r   r   r1   r2   )r   r   r   rD   rE   umaxunt  s    z1UnterbergerDistribution.__init__.<locals>.umaxuntr   r   r   )formr   r   r   r   rb   r   r!   r"   r1   r)   r   r*   rG   rc   rN   rI   )r5   r   r   r2   r1   rI   r6   r   teqm0rc   rB   r   rE   r     s,    
"&

z UnterbergerDistribution.__init__c              
   C   s  |   \}}| ||\}}}tjd| j | jftd}dtj | d  }tdd| j d D ]4}t	t
d| j|d  d d  | j|d  d  }	t||	 | }
t	t
d| j|d  d d  | j|d  d  }	t||	 | }tjtj|
d | j }tjtj|d | j }|t| ||d d d f< | jdkr`||d d d f  dt
d| j| d d   9  < q`t|| jd| j d d f |d | jd d f f}|tj| jd| jjd fd| j dd9 }tjj|dd}ttjt|| jd| j d d d f |d | jd d f fd	d
}t| j| jjd f}| jjd d d }t| j| jd   | | j| jd  | d| j }t| jD ]}t|| j|  | k|| j| | k}tt|d }|| }|||f  }| j| d | j|  }t||}t || ||d d f< q| j}| jd | j   }| _!| " \}}| j#dkrtj$%|d }nt&||}|| t'||| | j }|| _(|||fS )Nr   r   r   r   r   r   r   rO   rT   r\   r   ))r`   rk   r   r[   rc   rI   r   rY   rt   rH   r   rd   rU   r#   r$   r   r   vstackrepeatrV   rX   r!   ra   r   rot90r%   r   r+   ru   rv   rw   r   r   rx   rR   r   ry   rz   rW   r	   rp   )r5   r^   r_   rj   rg   rh   wafZ_xnZ_ymx1mx2fx1fx2r{   rp   r|   r}   r~   r   r   r   r   r   r   r]   r>   rP   rQ   r   rD   rD   rE   r     sf    88
:8 :"
zUnterbergerDistribution.run)r   NNNr   r   r   r   r   r   r   rD   rD   rB   rE   r      s   r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )DFlandrinDistributionz
d-flandrinNc                    s   t t| j|f|||d| t| j| j | _| j| j| j  }|d| j k rtt	d| jd  | | j d }d| j|  d | _
nd}tt	| j| | _|d u r|   n|| _d S )Nr   r   r   r   )r   r   r   umaxdfla_solver1   r2   rb   r"   r)   r*   rG   r   rc   rN   rI   )r5   r   r2   r1   rI   r6   r   r   rB   rD   rE   r   [  s"    
$
zDFlandrinDistribution.__init__c              
   C   s  |   \}}| ||\}}}tjd| j | jftd}tdd| j d D ]}tdtj	 | d  d t
d| j|d  d   | }tdtj	 | d  d t
d| j|d  d   | }	tjtj|d | j }
tjtj|	d | j }|
t| ||d d d f< qLt|| jd| j d d f |d | jd d f f}|tj| jd| jjd fd| j dd9 }tjj|dd}ttjt|| jd| j d d d f |d | jd d f fd	d
}| |S )Nr   r   r   r   r      r   rO   rT   r   )r`   rk   r   r[   rc   rI   r   rt   rU   rY   rH   rd   r#   r$   r   r   r   rV   rX   r!   ra   r   r   r   r5   r^   r_   rj   rg   rh   r   r   r   r   r   r   r{   rD   rD   rE   r   l  s>    22 8 :zDFlandrinDistribution.run)NNNr   rD   rD   rB   rE   r   W  s   r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )BertrandDistributionbertrandNc           
         s   t t j|f|||d|  fdd}t|dd _ j j j  }| jjd k rt	t
d jd  |  j d } j| }	d|	 d  _n
d} j}	|	 _|d u r   n| _d S )Nr   c                    s   t |  j j  S r   )r   rU   r1   r2   )r   r   rD   rE   <lambda>      z/BertrandDistribution.__init__.<locals>.<lambda>r   r   r   r   )r   r   r   r   rb   r"   r1   r   r!   r)   r   r*   rG   rc   rN   rI   )
r5   r   r2   r1   rI   r6   Zumaxbertr   r   rc   rB   r   rE   r     s(    
&

zBertrandDistribution.__init__c                 C   s  |   \}}| ||\}}}tjdt| j | jftd}tt	d| jd t	| jd d| j d fD ](}t
dtj | d t| j|d  d t
| j|d   d  t| j|d  d   | }t
dtj | d t| j|d  d t
| j|d  d  t| j|d  d   | }	tjtj|d | j }
tjtj|	d | j }|
t| ||d d d f< qp|d | j t|d | j  || jd d f< t|| jd| j d d f |d | jd d f f}|tj| jd| jjd fd| j dd9 }tjj|dd}ttjt|| jd| j d d d f |d | jd d f fdd	}| |S )
Nr   r   r   rS   r   r   rO   rT   r   )r`   rk   r   r[   r)   rc   rI   r   Zhstackr,   rU   rY   rH   rd   sinhr#   r$   r   r   r   rV   rX   r!   ra   r   r   r   r   rD   rD   rE   r     sd    ,
 08 :zBertrandDistribution.run)NNNr   rD   rD   rB   rE   r     s   r   c                 C   s   ddddd}|| }|dvrX|t |  d  t | |  d  }|d|d   }n^|dkrt d| t |   t |  d   }n*|dkr| dkrdS |  t |  d  }|S )Nr   rT   r   r   )r   r   Z
d_flandrinZaspwv)r   r   r   )r   rU   )rd   r\   Zmethod_lookupr   rD   rD   rE   lambdak  s    (,r   r   c           I   	   C   s  | j d }|du r"t| j d }|du r:t| j d }|j d }	| j d }
|   }}t|}t|}|
t|
d d }|du s|du rtjtj||	 |
 d  }tjtj||	 |
 d  }|j d }t|dtt|d  d }t|dtt|d  d }|
 }|
 }tddt|d d dtt|d  }|du r||d k}tj|j d td|t 	 }t
dd	t|| d	  g}|du r||d k}tj|j d td|t 
 }d	t|| d	  }|| }||| d  }|| }t|}|||  }|d| krzd|d  | | d } nd} t||  }!d|! d }"|du rt||" dd|   td|d  d|d    d }#|#|#d  }$dt|$ }%t|%}td|d }&|d|d   }'t|&d t|' }(||( })tj||	ftd}*tj||	ftd}+t||||||d
 \},},},}-t||||||d
 \},},},}.t|D ]j}/|-|/ddf t|(||/ d   |*|/ddf< |.|/ddf t|(||/ d   |+|/ddf< q| }0t|0|d|! d }1|1dd|!  }1d|1|!< td| }2|2t| d dt|'  }3tjd|! d| ftd }4}5t|4j d D ]x}tdtj d |3 tt|1| | |4|ddf< tdtj d |3 tt|1|  | |5|ddf< q|dkr6td|! }6n|d}7|| td|7 td  }8dtjd  |8d  |d  td }9t|9td |!d   t|! |!d  }6td|! |f}:t||	f};tjd| ftd }<}=td| d|! f }>}?t|	D ]8}@|*dd|@f |<d|< tjtj|<}A|4|A d|Aj d !d|! d }>tjj|>dd}>|>d|ddf j"}B|+dd|@f |=d|< tjtj|=}C|5|C d|Cj d !d|! d }?tjj|?dd}?|?d|ddf j"}Dt|Bt#|D |6 |6j d dj!|dd }:t$|:|) |;dd|@f< q|}E|)}tjt%|}tjt%|}dtt||d   }dtt||d   }|||d  }F|||d  }Gt&t|Ft|G}H|Ht&t'|Ft'|G7 }H|;|H t(|;|E| | };|;|E|fS )a9  smoothed_pseudo_wigner

   :param signal:
   :param timestamps:
   :param K:
   :param nh0:
   :param ng0:
   :param fmin:
   :param fmax:
   :param n_voices:
   :type signal:
   :type timestamps:
   :type K:
   :type nh0:
   :type ng0:
   :type fmin:
   :type fmax:
   :type n_voices:
   :return:
   :rtype:
    r   Nr   r   r   r   r   r   r   )Ztime_instantsr   r2   r1   rI   y              ?   r   rO   ))r!   r   r,   r   r   r   	remainderr#   r$   r&   r'   r(   r)   r*   r+   r-   r.   r/   r0   rH   r   rU   r[   r   r   r   rt   re   rY   r   Zonesra   rX   r   rG   r   sumr   rW   imagr	   )Ir   
timestampsKZnh0Zng0r2   r1   rI   ZxrowZtcolmtr   r   r   r    r"   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r   r4   ratiorb   r   r   murG   rK   rL   rM   r\   rJ   r   rV   Zmatxte1Zmatxte2_Zwt1Zwt2r   ri   rd   rf   rj   l1l2GZa_tZsigma_tZa_ur   rp   r^   r_   r   r   Ztirg   Ztx1rh   Ztx2r]   rP   rQ   ZxxrD   rD   rE   smoothed_pseudo_wigner  s    




((
$$2
"
"

<268>
 (0""$r   c                 C   s<   d|  d d|  d d|  g}t |}t t |d S )Nr      r   r   )r   rootsr&   r(   )r   Zcoeffsr   rD   rD   rE   r     s    
r   __main__)altes@   g?g?r   r   g        r   lower)r   r   r   r   )ZaspectoriginZextent)Nr   Nr   NNN)*r   numpyr   Zscipy.signalr   Zscipy.optimizer   r   Zscipy.interpolater   r   Ztftb.generatorsr   r   Ztftb.processing.utilsr	   Ztftb.processing.baser
   Z
tftb.utilsr   r   r   r   r   r   r   r   r   r   r   Zmatplotlib.pyplotZpyplotZpltsigrp   r   Zfrequenciesr(   ro   rs   ZimshowZshowrD   rD   rD   rE   <module>	   sF    dY9I       
 (
