o
    i
                     @   s@   d dl mZ d dlZd dlZd dlmZ G dd dejjZdS )    )TupleN)make_pad_maskc                       s   e Zd ZdZ							ddeded	ed
edededef fddZdd Z	dde	j
de	j
dee	j
e	j
f fddZ  ZS )LogMela  Convert STFT to fbank feats

    The arguments is same as librosa.filters.mel

    Args:
        fs: number > 0 [scalar] sampling rate of the incoming signal
        n_fft: int > 0 [scalar] number of FFT components
        n_mels: int > 0 [scalar] number of Mel bands to generate
        fmin: float >= 0 [scalar] lowest frequency (in Hz)
        fmax: float >= 0 [scalar] highest frequency (in Hz).
            If `None`, use `fmax = fs / 2.0`
        htk: use HTK formula instead of Slaney
    >     P   NFfsn_fftn_melsfminfmaxhtklog_basec           
         s|   t    |d u rdn|}|d u r|d n|}t||||||d}|| _|| _tjjdi |}	| dt	
|	j  d S )Nr      )srr	   r
   r   r   r   melmat )super__init__dictmel_optionsr   librosafiltersmelregister_buffertorch
from_numpyTfloat)
selfr   r	   r
   r   r   r   r   _mel_optionsr   	__class__r   J/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/layers/log_mel.pyr      s   

zLogMel.__init__c                 C   s   d dd | j D S )Nz, c                 s   s"    | ]\}}| d | V  qdS )=Nr   ).0kvr   r   r#   	<genexpr>7   s     z$LogMel.extra_repr.<locals>.<genexpr>)joinr   items)r   r   r   r#   
extra_repr6   s   zLogMel.extra_reprfeatilensreturnc                 C   s   t || j}t j|dd}| jd u r| }n| jdkr"| }n| jdkr,| }n
| t | j }|d urH|t	||dd}||fS |j
|dg|dt jd}||fS )	Ng|=)ming       @g      $@   g        r   )
fill_valuedtype)r   matmulr   clampr   loglog2log10masked_fillr   new_fullsizelong)r   r,   r-   mel_featlogmel_featr   r   r#   forward9   s$   





zLogMel.forward)r   r   r   NNFN)N)__name__
__module____qualname____doc__intr   boolr   r+   r   Tensorr   r>   __classcell__r   r   r!   r#   r   	   sB    r   )	typingr   r   r   &espnet.nets.pytorch_backend.nets_utilsr   nnModuler   r   r   r   r#   <module>   s
    