o
    oi                     @   s  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 d dl
Zd dlZd dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlmZ G dd dej Z!G dd dej Z"ddddd dej#dddddf
de$dee$ de$de$de$de$de%dej&de%d e%fd!d"Z'G d#d$ d$ej&Z(dbd%ej)d&e$d'e%d(e%d)ef
d*d+Z*G d,d- d-ej&Z+G d.d/ d/ej&Z,G d0d1 d1ej&Z-d2ed3ed4e$d5ee fd6d7Z.dcd8ed9e$de$d:e$d)ef
d;d<Z/ddd8ed9e$de$d=e$d:e$d)efd>d?Z0G d@dA dAej&Z1G dBdC dCej&Z2G dDdE dEej&Z3G dFdG dGej&Z4G dHdI dIej&Z5G dJdK dKej&Z6G dLdM dMej&Z7d8edNe$dOej8d)efdPdQZ9			RdedSedTed9e$dUe%dVee$ dWe:d)eeeef fdXdYZ;dZd[ Z<d\d] Z=d^d_ Z>d`da Z?dS )f    N)OrderedDict)CallableIterableListOptionalTupleUnion)Tensornn)
functional)init)	Parameter)Final)ModelParams)
as_complexas_real
get_deviceget_norm_alpha)unit_norm_initc                       s   e Zd Zdddddejjejjfdededeee	e f deded	e
d
e
de
deedejjf  deedejjf  f fddZ  ZS )Conv2dNormAct   TFin_chout_chkernel_sizefstridedilationfpadbias	separable
norm_layer.activation_layerc                    s.  d}t |tr||fnt|}|r|d d | d }nd}dd|d d | |f}g }tdd |D r>|t|d |rFt||nd}|dkrNd}t	|dkrVd}|tj
|||d|fd|fd|f||d |rz|tj
||ddd	 |	d
ur||	| |
d
ur||
  t j|  d
S )zmCausal Conv2d by delaying the signal for any lookahead.

        Expected input format: [B, C, T, F]
        r   r      c                 s       | ]}|d kV  qdS r   N .0xr$   r$   H/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/modules.py	<genexpr>/       z)Conv2dNormAct.__init__.<locals>.<genexpr>        F)r   paddingstrider   groupsr   r   r   N)
isinstanceinttupleanyappendr
   ConstantPad2dmathgcdmaxConv2dsuper__init__selfr   r   r   r   r   r   r   r   r   r    	lookaheadfpad_padlayersr.   	__class__r$   r(   r;      sD   zConv2dNormAct.__init__)__name__
__module____qualname__torchr
   BatchNorm2dReLUr1   r   r   boolr   r   Moduler;   __classcell__r$   r$   rB   r(   r      s:    	
r   c                       s   e Zd Zdddddejjejjfdededeee	eef f deded	e
d
e
de
deedejjf  deedejjf  f fddZ  ZS )ConvTranspose2dNormActr   TFr   r   r   r   r   r   r   r   r   .r    c                    s(  d}t |tr||fn|}|r|d d }nd}dd|d d | |f}g }tdd |D r8|t|d |r@t||nd}|dkrHd}|tj||||d d || d fd|fd|fd|f||d	 |rw|tj	||ddd	 |	d
ur||	| |
d
ur||
  t
 j|  d
S )zMCausal ConvTranspose2d.

        Expected input format: [B, C, T, F]
        r   r   r!   c                 s   r"   r#   r$   r%   r$   r$   r(   r)   f   r*   z2ConvTranspose2dNormAct.__init__.<locals>.<genexpr>r+   F)r   r,   output_paddingr-   r   r.   r   r/   N)r0   r1   r3   r4   r
   r5   r6   r7   ConvTranspose2dr9   r:   r;   r<   rB   r$   r(   r;   L   s@   zConvTranspose2dNormAct.__init__)rD   rE   rF   rG   r
   rH   rI   r1   r   r   rJ   r   r   rK   r;   rL   r$   r$   rB   r(   rM   K   s:    	
rM   r      r!   FT)inplacenormalr   r   kfr   r>   
batch_normact	depthwise
complex_inc              	   C   s  |du }|d dksJ |dkrdnd|f}|d u r&|dkr"| d n| d }|d d }d|f}g }dd|d | |f}t dd |D rP|dt|d	f |	rXt| |}nd}| | dksf|| dkrhd}|
rt|d dkrt|d }| |||f|||d
}|dkr|dtjdd|i|f n?|dkr|d |f}|dtjd||d|f n$|dkr|dt|f d|d< |dtjdd|i|f nt |dkr|dtj||dddf |r|dt	|f |d|f t
t|S )NFr!   r   rR   r   c                 s   r"   r#   r$   )r&   pr$   r$   r(   r)      r*   zconvkxf.<locals>.<genexpr>r@   r+   )in_channelsout_channelsr   r-   r.   r   sconvr,   
transposedsconvt)r,   rN   upsampler-   1x1conv)r   normrV   r$   )r3   r4   r
   r5   minr9   rO   FreqUpsampleNotImplementedErrorrH   
Sequentialr   )r   r   rS   rT   r   r>   rU   rV   moderW   rX   r   r-   r   convpadmodulesr@   r.   
convkwargsr,   r$   r$   r(   convkxf   sV     rj   c                       s6   e Zd Zd	def fddZdedefddZ  ZS )
rc   nearestfactorc                    s   t    t|| _|| _d S N)r:   r;   floatrT   rf   )r=   rl   rf   rB   r$   r(   r;      s   


zFreqUpsample.__init__r'   returnc                 C   s   t j|d| jg| jdS )Ng      ?)scale_factorrf   )FinterpolaterT   rf   )r=   r'   r$   r$   r(   forward   s   zFreqUpsample.forward)rk   )rD   rE   rF   r1   r;   r	   rs   rL   r$   r$   rB   r(   rc      s    rc   widthssr
normalizedinversero   c                 C   s   t t| }td|d |d d d }tdg|   t d d }t|j	d |j	d f}t
t| |  D ]\}\}	}
d||	|	|
 |f< q?|rb| }|sa||jddd }n
|rl||jdd }|jt dS )	Nr   r!   r   Tdimkeepdimrz   device)r1   npsumrG   linspacecumsumtolistastypezerosshape	enumeratezipttor   )rt   ru   rv   rw   n_freqs	all_freqsb_ptsfbibwr$   r$   r(   erb_fb   s   ""r   c                	       sd   e Zd Zddededef fddZdd	ed
edefddZdded	edee defddZ	  Z
S )MaskF-q=
erb_inv_fbpost_filterepsc                    s@   t    |  | d| tjdkptjdk| _|| _|| _d S )Nr   z1.9.0)r:   r;   register_bufferrG   __version__clamp_tensorr   r   )r=   r   r   r   rB   r$   r(   r;      s   

zMask.__init__{Gz?maskbetaro   c                 C   sH   |t tj| d  }d| | d|||| jd   }|S )aB  Post-Filter proposed by Valin et al. [1].

        Args:
            mask (Tensor): Real valued mask, typically of shape [B, C, T, F].
            beta: Global gain factor.
        Refs:
            [1]: Valin et al.: A Perceptually-Motivated Approach for Low-Complexity, Real-Time Enhancement of Fullband Speech.
        r!   r   )rG   sinr   pidiv	clamp_minr   pow)r=   r   r   mask_sinmask_pfr$   r$   r(   pf   s   	,zMask.pfNspec	atten_limc                 C   s   | j s| jr| |}|d urGd| d  }| jr&|j|ddddd}n!g }t|jd D ]}||| 	|| 
  q/tj|dd}|| j}| sV|d}|| S )	N
      rx   r   )rb   r   r|      )trainingr   r   r   clampviewranger   r4   r   itemrG   stackmatmulr   
is_complex	unsqueeze)r=   r   r   r   m_outr   r$   r$   r(   rs      s   

zMask.forward)Fr   )r   rm   )rD   rE   rF   r	   rJ   rn   r;   r   r   rs   rL   r$   r$   rB   r(   r      s    (r   c                       s\   e Zd ZU dZee ed< ee ed< ddededef fddZde	d	e	fd
dZ
  ZS )ExponentialUnitNormzUnit norm for a complex spectrogram.

    This should match the rust code:
    ```rust
        for (x, s) in xs.iter_mut().zip(state.iter_mut()) {
            *s = x.norm() * (1. - alpha) + *s * alpha;
            *x /= s.sqrt();
        }
    ```
    alphar   +=num_freq_binsc                    sD   t    || _|| _|  tt|dd|d}| d| d S )Nr   
init_state)	r:   r;   r   r   rG   
from_numpyr   r   r   )r=   r   r   r   srB   r$   r(   r;     s   
zExponentialUnitNorm.__init__r'   ro   c           
      C   s   |j \}}}}}| jddd| j }| j |||d}g }	t	|D ]}|d d d d |f d| j
  || j
  }|	| q(|t|	d  S )Nrx   Try   r   r!   )r   squarer   r   r   sqrtr   cloneexpandr   r   r4   rG   r   )
r=   r'   r   cr   rT   _x_absstate
out_statesr$   r$   r(   rs   '  s   *zExponentialUnitNorm.forward)r   )rD   rE   rF   __doc__r   rn   __annotations__r1   r;   r	   rs   rL   r$   r$   rB   r(   r     s   
 r   c                       s@  e Zd ZU ee ed< ee ed< ee ed< ee ed< 				ddededededef
 fd	d
ZdefddZ	dde	de	de
e	 de	fddZ	dde	de	de
e	 de	fddZ	dde	de	de
e	 de	fddZ	dde	de	de
e	 de	fddZ	dde	de	de
e	 de	fddZde	de	de	de	fddZ  ZS ) DfOpdf_orderdf_binsdf_lookahead	freq_bins   r   complex_stridedmethodc                    s0   t    || _|| _|| _|| _| | d S rm   )r:   r;   r   r   r   r   set_forward)r=   r   r   r   r   r   rB   r$   r(   r;   9  s   
zDfOp.__init__c              	   C   s   | j | j| j| j| j| jd}|| vr"td|  d| d|dkrA| j| j	ks.J |  | j
dtdd| j| jdd	d
 || | _d S )N)	real_loopreal_stridedreal_unfoldr   real_one_stepreal_hidden_state_loopz`method` must be one of z, but got ''r   spec_bufr   r!   F)
persistent)forward_real_loopforward_real_stridedforward_real_unfoldforward_complex_stridedforward_real_no_pad_one_stepforward_real_hidden_state_loopkeysrd   r   r   r   rG   r   r   rs   )r=   r   forward_methodsr$   r$   r(   r   H  s$   zDfOp.set_forwardNr   coefsr   ro   c                 C   s  |j \}}}}}| j}t|dd | jd d f d| j| jdd}tj|||df|jd}	t	| jD ]}
|	d  |d d |
|
| ddf |d d d d |
d d df  7  < |	d  |d d |
|
| ddf |d d d d |
d d df  8  < |	d	  |d d |
|
| ddf |d d d d |
d d df  7  < |	d	  |d d |
|
| ddf |d d d d |
d d df  7  < q3t
||	d| j|S )
N.r   r|   r!   r}   .r   r   .r   )r   r   spec_padsqueezer   r   rG   r   r~   r   	assign_dfr   )r=   r   r   r   r   r   r   rT   paddedspec_fr   r$   r$   r(   r   `  s   &FFFHzDfOp.forward_real_loopc                 C   s   t |dd | jd d f d| j| jdd}|d |d  }||d |d  8 }|d |d  }||d |d  7 }t||fdd}t||	d| j|S )	N.r   r   r|   r   r   rx   r!   )

as_stridedr   r   r   r   rG   r   r   r   r   )r=   r   r   r   r   reimr   r$   r$   r(   r   r  s   &zDfOp.forward_real_stridedc                 C   s   t |dd | jd d f d| j| jdd}|jd| jdd}|ddddd	}t|}|d
 |d
  |d
< |d
  |d |d  8  < |d |d
  |d< |d  |d
 |d  7  < |j	dd}t
||d| j|S )N.r   r   r|   )	dimensionsizestepr   r   r!   rP   r   r   )r   r   r   r   r   unfoldpermuterG   
empty_liker   r   r   r=   r   r   r   r   r   r$   r$   r(   r     s   &
zDfOp.forward_real_unfoldc                 C   sl   t |dd | jd d f d| j| jdd}tjt|t| dd}t|}t	||
d| j|S )N.r   r   r|   r!   )r   r   r   r   r   rG   r   view_as_complexview_as_realr   r   r   r$   r$   r(   r     s   &
zDfOp.forward_complex_stridedc                 C   s   |j d | jksJ d|j d dksJ d|dd | jd d f dd\}}|dd\}}tj|| ||  ddd}tj|| ||  ddd}	tj||	fdd}
t|d d d d | j| j	 d f |

d| j|S )Nr!   zPThis forward method needs spectrogram buffer with `df_order` time steps as inputr   z1This forward method is only valid for 1 time step.rx   r|   )r   r   r   splitrG   r   r   r   r   r   r   )r=   r   r   r   sresimcrecimoutroutir   r$   r$   r(   r     s   	$   z!DfOp.forward_real_no_pad_one_stepc                 C   s|  |j \}}}}}tj|d|| jdf|jd}t|j d D ]}| jjddd| _|d d d d |f | jd d d d df< | jdd | jd d f 	dd\}}	|d d ||d f 	dd\}
}tj
||
 |	|  ddd}tj
|| |	|
  ddd}tj||fdd}t| jd d d d | j| j d f d|d| j|d d |f d|d d d d |f< q|S )Nr   r!   r}   rx   )dims.r|   )r   rG   emptyr   r~   r   r   rollr   r   r   r   r   r   r   r   r   )r=   r   r   r   r   r   r   spec_outr   r   r   r   r   r   r   r$   r$   r(   r     s&   *&$  (z#DfOp.forward_real_hidden_state_loop)r   r   r   r   rm   )rD   rE   rF   r   r1   r   strr;   r   r	   r   r   r   r   r   r   r   rL   r$   r$   rB   r(   r   3  s   
 




"r   r   r   r   r   c                 C   s   |   }|d ur4| jd }||dddd}|| | dd |d d f d|   |dd |d d f< |S ||dd |d d f< |S )Nr   r   rx   .)r   r   r   )r   r   r   r   r   r   r$   r$   r(   r     s   
8r   r'   window_sizerz   c                 C   s   dg|    d }|dkr,|| d ||   | d d < |||   | d d d < n|| d || d d < ||| d d d < t| |S )Nr   r!   r   )rz   rq   r@   )r'   r  r>   rz   r@   r$   r$   r(   r     s    r   r   c                 C   st   t | j}||d | t| |||d} d}| d| d| d| dg}|||| |  t| ||S )Nr   r|   r   r!   rP   )listr   insertr   r-   rG   r   )r'   r  r>   r   rz   r   r-   r$   r$   r(   r     s   
$r   c                       s   e Zd ZU ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< 					
ddededededededef fddZdd Z	de
dfdede
jfddZddedee deeef fddZ  ZS )GroupedGRULayer
input_sizehidden_sizeout_sizebidirectionalnum_directionsr.   batch_firstTr   Fr   dropoutc                    s   t    || dksJ || dksJ ||||d || _|| _|_|_|r0dnd_|_|_j| dksDJ dt	
 fddt|D _d S )Nr   )r   r
  r  r  r!   r   z'Hidden size must be divisible by groupsc                 3   s(    | ]}t jjjfi  V  qd S rm   )r
   GRUr  r  r&   r   kwargsr=   r$   r(   r)     s   & z+GroupedGRULayer.__init__.<locals>.<genexpr>)r:   r;   r  r  r  r  r	  r.   r
  r
   
ModuleListr   rA   )r=   r  r  r.   r
  r   r  r  rB   r  r(   r;      s&   




zGroupedGRULayer.__init__c                 C      | j D ]}|  qd S rm   )rA   flatten_parameters)r=   layerr$   r$   r(   r       

z"GroupedGRULayer.flatten_parametersr   cpu
batch_sizer~   c                 C   s   t j| j| j || j|dS Nr}   )rG   r   r.   r	  r  r=   r  r~   r$   r$   r(   get_h0#  s   
zGroupedGRULayer.get_h0Ninputh0ro   c                 C   s   |d u r|j d d \}}| jr|n|}| j||jd}g }g }t| jD ]1\}}	|	|d|| j |d | j f ||| j |d | j   \}
}|	|
 |	| q%t
j|dd}t
j|dd}||fS )Nr!   r}   .r   rx   r|   r   )r   r
  r  r~   r   rA   r  r	  detachr4   rG   cat)r=   r  r  dim0dim1bsoutputs	outstatesr   r  or   outputhr$   r$   r(   rs   +  s    
zGroupedGRULayer.forward)TTr   Frm   )rD   rE   rF   r   r1   r   rJ   rn   r;   r  rG   r~   r  r	   r   r   rs   rL   r$   r$   rB   r(   r    s<   
  ,r  c                       s  e Zd ZU ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< 			
						d dedededededededededef fddZdd Z	e
dfdede
jdefddZd!dedee deeef fddZ  ZS )"
GroupedGRUr.   
num_layersr
  r  r  r	  shuffleadd_outputsr   r   Tr   Fr  r   r  c                    s   t    |||||d}|| dksJ || dksJ |dks#J || _|| _|| _|| _|| | _|| _|r;dnd| _|dkrDd}	|	| _	|
| _
t | _| jt||fi | td|D ]}| jt||fi | qa|   d S )N)r.   r   r
  r  r  r   r!   r   F)r:   r;   r  r.   r'  r
  r  r  r	  r(  r)  r
   r  grusr4   r  r   r  )r=   r  r  r'  r.   r   r
  r  r  r(  r)  r  r   rB   r$   r(   r;   K  s4   


zGroupedGRU.__init__c                 C   r  rm   )r*  r  )r=   grur$   r$   r(   r  t  r  zGroupedGRU.flatten_parametersr  r  r~   ro   c                 C   s$   t j| j| j | j || jf|dS r  )rG   r   r'  r.   r	  r  r  r$   r$   r(   r  x  s   zGroupedGRU.get_h0Nr  r   c                 C   s  |j \}}}| jr|n|}|d u r| ||j}tj||| j| j | j |jd}g }| j| j }	t	| j
D ]@\}
}||||
|	 |
d |	  \}}|| | jrl|
| jd k rl|||d| jdd||d}| jrt||7 }q6|}q6tj|dd}||fS )Nr}   r   rx   r!   rP   r   r|   )r   r
  r  r~   rG   r   r  r	  r.   r   r*  r4   r(  r'  r   	transposereshaper)  r  )r=   r  r   r  r  r   r   r$  r"  r%  r   r+  r   outstater$   r$   r(   rs   ~  s(   "
"
zGroupedGRU.forward)r   r   TTr   FTFrm   )rD   rE   rF   r   r1   r   rJ   rn   r;   r  rG   r~   r	   r  r   r   rs   rL   r$   r$   rB   r(   r&  A  sR   
 	
)",r&  c                          e Zd ZU ee ed< ee ed< dddddejfdededee ded	ed
e	dee
dejjf  de
dejjf f fddZddedeeef fddZ  ZS )SqueezedGRUr  r  Nr      Toutput_sizer'  linear_groupsr
  gru_skip_op.linear_act_layerc	           	            t    || _|| _tt|||| | _tj||||d| _	|d ur(| nd | _
|d ur=tt|||| | _d S t | _d S N)r'  r
  r:   r;   r  r  r
   re   GroupedLinearEinsum	linear_inr  r+  gru_skip
linear_outIdentity	r=   r  r  r2  r'  r3  r
  r4  r5  rB   r$   r(   r;        

zSqueezedGRU.__init__r  ro   c                 C   sD   |  |}| ||\}}| jd ur|| | }| |}||fS rm   )r:  r+  r;  r<  r=   r  r%  r'   r$   r$   r(   rs     s   


zSqueezedGRU.forwardrm   rD   rE   rF   r   r1   r   r
   r=  r   rJ   r   rG   rK   r;   r	   r   rs   rL   r$   r$   rB   r(   r0    6   
 	$r0  c                       r/  )SqueezedGRU_Sr  r  Nr   r1  Tr2  r'  r3  r
  r4  .r5  c	           	         r6  r7  r8  r>  rB   r$   r(   r;     r?  zSqueezedGRU_S.__init__r  ro   c                 C   sD   |  |}| ||\}}| |}| jd ur|| | }||fS rm   )r:  r+  r<  r;  r@  r$   r$   r(   rs     s   


zSqueezedGRU_S.forwardrm   rA  r$   r$   rB   r(   rC    rB  rC  c                       st   e Zd ZU ee ed< ee ed< ee ed< ddededef fddZdd Zd	ed
efddZ	dd Z
  ZS )r9  r  r  r.   r   c              
      s   t    || _|| _|| _|| dksJ d| d| || dks.J d| d| || | _| dtt	||| || dd | 
  d S )Nr   zInput size z not divisible by zHidden size weightT)requires_grad)r:   r;   r  r  r.   wsregister_parameterr   rG   r   reset_parameters)r=   r  r  r.   rB   r$   r(   r;     s   
  
zGroupedLinearEinsum.__init__c                 C   s   t j| jtdd d S )Nr   )a)r   kaiming_uniform_rD  r6   r   r=   r$   r$   r(   rH    s   z$GroupedLinearEinsum.reset_parametersr'   ro   c                 C   sF   |j \}}}||| j| jf}||}td|| j}|dd}|S )Nzbtgi,gih->btghr!   rP   )r   r.   rF  r   rG   einsumrD  flatten)r=   r'   r   r   r   	new_shaper$   r$   r(   rs     s   
zGroupedLinearEinsum.forwardc                 C   s*   | j j}| d| j d| j d| j dS )Nz(input_size: z, hidden_size: z
, groups: ))rC   rD   r  r  r.   )r=   clsr$   r$   r(   __repr__
  s   "zGroupedLinearEinsum.__repr__)r   )rD   rE   rF   r   r1   r   r;   rH  r	   rs   rQ  rL   r$   r$   rB   r(   r9    s   
 r9  c                	       st   e Zd ZU ee ed< ee ed< ee ed< ee ed< ddedededef fddZd	ed
efddZ	  Z
S )GroupedLinearr  r  r.   r(  r   Tc                    sx   t    || dksJ || dksJ | _||  _||  _|dkr(d}| _t fddt|D  _	d S )Nr   r   Fc                 3   s     | ]}t  j jV  qd S rm   )r
   Linearr  r  r  rK  r$   r(   r)     s    
z)GroupedLinear.__init__.<locals>.<genexpr>)
r:   r;   r.   r  r  r(  r
   r  r   rA   )r=   r  r  r.   r(  rB   rK  r(   r;     s   


zGroupedLinear.__init__r'   ro   c              	   C   s   g }t | jD ]\}}|||d|| j |d | j f  qtj|dd}| jr>|j}|d| j	| j
dd|}|S )N.r   rx   r|   )r   rA   r4   r  rG   r  r(  r   r   r  r.   r,  r-  )r=   r'   r!  r   r  r$  
orig_shaper$   r$   r(   rs   #  s   ,zGroupedLinear.forward)r   T)rD   rE   rF   r   r1   r   rJ   r;   r	   rs   rL   r$   r$   rB   r(   rR    s   
  rR  c                	       sd   e Zd Z	ddededee f fddZd	ed
efddZddededee d
efddZ	  Z
S )LocalSnrTargetr   TNrF  dbws_nsc                    sD   t    | || _|d u r| jd n| || _|| _|| _d S )Nr!   )r:   r;   calc_wsrF  rX  rW  r   )r=   rF  rW  rX  target_snr_rangerB   r$   r(   r;   1  s
   

zLocalSnrTarget.__init__ws_msro   c                 C   sD   t  }||j|j d  }d||j|j d   }ttt|dS )Ni  r   )r   fft_sizeru   hop_sizer8   r1   round)r=   r[  rY   rF  r$   r$   r(   rY  :  s   zLocalSnrTarget.calc_wscleannoisemax_binc                 C   sf   |d urt |dd |f }t |dd |f }t||| j| j| jdd | jd | jd dS )N.)r  rW  window_size_nsr   r   )r   	local_snrrF  rW  rX  r   r   r   )r=   r_  r`  ra  r$   r$   r(   rs   A  s   zLocalSnrTarget.forward)r   TNNrm   )rD   rE   rF   r1   rJ   r   r;   rY  r	   rs   rL   r$   r$   rB   r(   rV  0  s    	(rV  rF  r~   c                 C   s|   |d dkr
|d7 }|d }t | ddd||ddf} tj||| jd}| jd|dd| } tj| dd|S )Nr!   r   r   rx   )r~   dtype)r   r   r|   )	rq   r@   r   r   rG   hann_windowrd  r   r   )r'   rF  r~   ws_halfr   r$   r$   r(   _local_energyN  s   &rg  r   r_  r`  rW  rb  r   c           	      C   s|   t | } t |}|  dksJ t| || j}|d u r|n|}t||| j}||| }|r9|| d}|||fS )Nr   r   )r   rz   rg  r~   r   log10mul)	r_  r`  r  rW  rb  r   E_speechE_noisesnrr$   r$   r(   rc  X  s   	
rc  c                  C   s  ddl m}  d}d}d}d}d}t|||dd}| | t|||f}||}t|j|||| gks7J |||\}	}
tjj	|||fd	|	|
fd
d tj
|||f}tjj	|||fd	|	|
fd
d tj
|}tjj	|||fd	|	|
fd
d d}t||||ddd}| | ||}t|j|| ||| gksJ |||\}	}
tj
|||f}tjj	|||fd	|	|
fd
d tj
|}tjj	|||fd	|	|
fd
d d S )Nr   )icr!   r   r   r   T)r
  zout/grouped.onnx   )example_outputsopset_version)r
  r(  )icecreamrm  r  rG   randnr  r  r   onnxexportjittracescriptr&  )rm  gr%  r   r   r   mr  r  outhoutnumr$   r$   r(   test_grouped_gruo  sJ   

 
r}  c                  C   s  dd l } ddlm} |  t }|jd d }| j|j|j|j|j	d}t
| |j}t
| |jdd}tjddd|ftjd}|  }| }	t| | |	d	}
t||}t|
|sgJ t| |
 |	}t||}t||sJ d S )
Nr   configr!   r   )ru   r\  r]  nb_bandsT)rw   )rd  F)libdf	df.configr  use_defaultsr   r\  DFru   r]  nb_erbr   
erb_widthsrG   rr  	complex64absr   r   erbnumpyr   allcloseerb_inv)r  r  rY   n_freqdf_stater  erb_inverser  	input_absr  df_erbpy_erbdf_outpy_outr$   r$   r(   test_erb  s"   r  c                  C   s   ddl m}  ddlm} |   t }d}|j}d}t|d||d}t	dd}t
|t|d |}t||}	t|	|d}
t|j|
jsQJ t|j|
js[J t| |
 sgJ d S )	Nr   r~  )	unit_normr!   d   r   F)log)r  r  r  r  r  r   nb_dfrG   rr  r   	as_tensorr   r   r  r   r  realimagr  )r  r  rY   r   rq   r   r   r   norm_libry  
norm_torchr$   r$   r(   test_unit_norm  s   
 
r  c                  C   s  ddl m}  |   t }|j}|d }|j}|j}d}tdd||d}td|||d}td|d}	t	|jd}
|

d |
|||	}|

d |
|||	}|

d	 |
|||	}|

d
 |
|||	}tj|| tj|| tj|| |

d t|||dd}t|}t|D ]0}|
|d d d d ||| f |d d |f d|	d d |f d|d d d d |f< qtj|| ||
_|

d |
|||	}tj|| d S )Nr   r~  r!   r  r   )r   r   r   r   r   r   r   r|   r   )r  r  r  r   r  r   r   rG   rr  r   r   testingassert_allcloser   
zeros_liker   r   r   )r  rY   rT   rq   r#  dr   r   r   r   dfopout1out2out3out4spec_paddedout5r   out6r$   r$   r(   	test_dfop  sF   





D
r  )TF)r   )r   r   )FNr   )@r6   collectionsr   typingr   r   r   r   r   r   r  r   rG   r	   r
   torch.nnr   rq   r   torch.nn.parameterr   typing_extensionsr   df.modelr   df.utilsr   r   r   r   r  r   re   r   rM   rI   r1   rJ   rK   rj   rc   ndarrayr   r   r   r   r   r   r   r  r&  r0  rC  r9  rR  rV  r~   rg  rn   rc  r}  r  r  r  r$   r$   r$   r(   <module>   s     98


C"
.# $ $JV''*!
2