a
    c?                     @   sn   d dl Z d dlZG dd de jjZG dd de jjZddd	ZG d
d de jjZG dd de jjZ	dS )    Nc                       s2   e Zd ZdZd
 fdd	Zdd Zdd	 Z  ZS )Log1pzD
    Applies log(1 + 10**a * x), with scale fixed or trainable.
    r   Fc                    s<   t t|   |r,tjtj|t d}|| _|| _	d S )Ndtype)
superr   __init__torchnn	Parametertensorget_default_dtypea	trainable)selfr   r   	__class__ $/nfs/NAS6/mahe/ceta-cnns/frontend.pyr   
   s
    zLog1p.__init__c                 C   s(   | j s| jdkr$td| j | }|S )Nr   
   )r   r   r   log1pr   xr   r   r   forward   s    zLog1p.forwardc                 C   s   d t| jS )Nztrainable={})formatreprr   )r   r   r   r   
extra_repr   s    zLog1p.extra_repr)r   F)__name__
__module____qualname____doc__r   r   r   __classcell__r   r   r   r   r      s   r   c                       s&   e Zd Zd fdd	Zd	d
 Z  ZS )	PCENLayer皙?皙?      $@      ?ư>Tc              
      s   t t|   tjttdd|f| | _tjttdd|df| | _	tjttdd|df| | _
tjttdd|df| | _t|| _|| _d S )N   )r   r    r   r   r   r	   logoneslog_s	log_alpha	log_deltalog_rr
   epsinit_smoother_from_data)r   	num_bandssalphadeltarr-   r.   r   r   r   r      s    $&&&zPCENLayer.__init__c              
   C   s   |d d d d d d df }| j s.t|j}|g}td|jd D ]N}|dt| j ||d   t| j|d d d d d d |f    qDt|	dddd}t| j
t| jt| j  }}}|| j| |  | | ||  S )Nr   r&         )r.   r   zerosshaperangeappendexpr)   stackpermuter*   r+   r,   r-   )r   inputinitfilteredZiframer1   r2   r3   r   r   r   r   *   s    L(zPCENLayer.forward)r!   r"   r#   r$   r%   T)r   r   r   r   r   r   r   r   r   r   r       s         r    TFc                 C   s  dt |d  }dt |d  }t|||d }	dt|	d  }
|
| |  }|d d }|rt|tt || t|  }tj	||j
dddt jf }|dd	 |dd
 |dd   }}}|| ||  }|| ||  }t||}tj|dd}|r||d }|S )a  
    Creates a mel filterbank of `num_bands` triangular filters, with the first
    filter starting at `min_freq` and the last one stopping at `max_freq`.
    Returns the filterbank as a matrix suitable for a dot product against
    magnitude spectra created from samples at a sample rate of `sample_rate`
    with a window length of `frame_len` samples. If `norm`, will normalize
    each filter by its area. If `crop`, will exclude rows that exceed the
    maximum frequency and are therefore zero.
    ig  g     @r5   i  r&   r   Nr   r4   )min)npr   r   linspaceexpm1rB   intceilfloataranger   newaxisclampsum)sample_rateZ	frame_lenr/   min_freqmax_freqnormcropZmin_melZmax_melZ	peaks_melZpeaks_hzZ	peaks_binZ
input_binsr   lcr3   Ztri_leftZ	tri_righttriZ
filterbankr   r   r   create_mel_filterbank;   s*    (rU   c                       s>   e Zd Z fddZdd Zd fdd		Z fd
dZ  ZS )	MelFilterc                    s2   t t|   t|||||dd}| d| d S )NT)rQ   bank)r   rV   r   rU   register_buffer)r   rM   winsizer/   rN   rO   Zmelbankr   r   r   r   g   s
    zMelFilter.__init__c                 C   s@   | dd}|dd | jjd f }|| j}| dd}|S )Nr4   rA   .r   )	transposerW   r8   matmulr   r   r   r   r   m   s
    zMelFilter.forwardN Fc                    s.   t t| |||}| jD ]}||| = q|S N)r   rV   
state_dict_buffersr   destinationprefix	keep_varsresultkr   r   r   r^   t   s    
zMelFilter.state_dictc                    sR   | j D ]}||| d  q| j }i | _ tt| j||g|R i |}|| _ |S r]   )r_   popr   rV   _load_from_state_dictr   r^   rb   argskwargsre   buffersrd   r   r   r   rg   {   s    
 zMelFilter._load_from_state_dict)Nr\   F)r   r   r   r   r   r^   rg   r   r   r   r   r   rV   f   s   rV   c                       s@   e Zd Zd fdd	Zd fdd	Z fdd	Zd
d Z  ZS )STFTFc                    s:   t t|   || _|| _| dtj|dd || _d S )NwindowF)Zperiodic)	r   rl   r   rY   hopsizerX   r   hann_windowcomplex)r   rY   rn   rp   r   r   r   r      s    zSTFT.__init__Nr\   c                    s.   t t| |||}| jD ]}||| = q|S r]   )r   rl   r^   r_   r`   r   r   r   r^      s    
zSTFT.state_dictc                    sR   | j D ]}||| d  q| j }i | _ tt| j||g|R i |}|| _ |S r]   )r_   rf   r   rl   rg   rh   r   r   r   rg      s    
 zSTFT._load_from_state_dictc                 C   s   | d}|jd d \}}|d|jdd   }tj|| j| j| jddd}| jsd|j	ddd}|||df|jdd   }|S )Nr&   r5   )r4   F)rm   centerreturn_complexr4   )pdim)
	unsqueezer8   reshaper   stftrY   rn   rm   rp   rP   )r   r   Z	batchsizechannelsr   r   r   r      s    
zSTFT.forward)F)Nr\   F)r   r   r   r   r^   rg   r   r   r   r   r   r   rl      s   rl   )TF)
r   numpyrC   r   Moduler   r    rU   rV   rl   r   r   r   r   <module>   s   " 
+!