o
    i                     @   s   d Z ddlZddlmZ ddlmZ ddlZddlZddl	Z	ddl
mZ ddlmZ dZ		ddejd	ed
ededededejfddZ			ddejd
edededee dee dejfddZG dd deZdS )zGriffin-Lim related modules.    N)partial)Optional)parse)check_argument_typesg|=lmspcfsn_fftn_melsfminfmaxreturnc           	      C   s|   | j d |ks	J |du rdn|}|du r|d n|}td| }tjj|||||d}tj|}tt	t
||jjS )a{  Convert log Mel filterbank to linear spectrogram.

    Args:
        lmspc: Log Mel filterbank (T, n_mels).
        fs: Sampling frequency.
        n_fft: The number of FFT points.
        n_mels: The number of mel basis.
        f_min: Minimum frequency to analyze.
        f_max: Maximum frequency to analyze.

    Returns:
        Linear spectrogram (T, n_fft // 2 + 1).

       Nr      g      $@)srr   r	   r
   r   )shapenppowerlibrosafiltersmellinalgpinvmaximumEPSdotT)	r   r   r   r	   r
   r   mspc	mel_basisinv_mel_basis r   M/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/utils/griffin_lim.pylogmel2linear   s   
r!   hann    spcn_shift
win_lengthwindown_iterc           
      C   s  | j d |d d ksJ ttjtdkr2t| j} tj| ||||| j d dkr,dndd}|S t	d t| 
tjj}tdtj tjj|j   }tj|| |||d	}t|D ]}	td
ttj|||||d	 }tj|| |||d	}q_|S )a  Convert linear spectrogram into waveform using Griffin-Lim.

    Args:
        spc: Linear spectrogram (T, n_fft // 2 + 1).
        n_fft: The number of FFT points.
        n_shift: Shift size in points.
        win_length: Window length in points.
        window: Window function type.
        n_iter: The number of iterations.

    Returns:
        Reconstructed waveform (N,).

    r   r   z0.7.0TF)Sr(   
hop_lengthr&   r'   centerzlibrosa version is old. use slow version of Grriffin-Lim algorithm.if you want to use fast Griffin-Lim, please update librosa via `source ./path.sh && pip install librosa==0.7.0`.y               @)r'   y              ?)r   Vr   __version__r   absr   
griffinlimloggingwarningastypecomplexexppirandomrandistftrangeanglestft)
r$   r   r%   r&   r'   r(   ycspcanglesir   r   r    griffin_lim6   s4   r@   c                   @   st   e Zd ZdZ							ddedededed	ed
ee dededee fddZdd Zde	j
de	j
fddZdS )Spectrogram2Waveformz*Spectrogram to waveform conversion module.Nr"      r   r%   r   r	   r&   r'   r
   r   griffin_lim_itersc
           
      C   s   t  sJ || _|durtt|||||dnd| _tt|||||	d| _t|||||	d| _|dur>| jj||||d dS dS )a  Initialize module.

        Args:
            fs: Sampling frequency.
            n_fft: The number of FFT points.
            n_shift: Shift size in points.
            n_mels: The number of mel basis.
            win_length: Window length in points.
            window: Window function type.
            f_min: Minimum frequency to analyze.
            f_max: Maximum frequency to analyze.
            griffin_lim_iters: The number of iterations.

        N)r   r   r	   r
   r   )r   r%   r&   r'   r(   )r   r	   r
   r   )r   r   r   r!   r@   dictparamsupdate)
selfr   r%   r   r	   r&   r'   r
   r   rC   r   r   r    __init__r   s4   
zSpectrogram2Waveform.__init__c                 C   sB   | j j d}| j D ]\}}|| d| d7 }q|d7 }|S )N(=z, ))	__class____name__rE   items)rG   retvalkvr   r   r    __repr__   s
   zSpectrogram2Waveform.__repr__r$   r   c                 C   sJ   |j }|j}|  }| jdur| |}| |}t|j||dS )zConvert spectrogram to waveform.

        Args:
            spc: Log Mel filterbank (T_feats, n_mels)
                or linear spectrogram (T_feats, n_fft // 2 + 1).

        Returns:
            Tensor: Reconstructed waveform (T_wav,).

        N)devicedtype)	rS   rT   cpunumpyr!   r@   torchtensorto)rG   r$   rS   rT   wavr   r   r    __call__   s   


zSpectrogram2Waveform.__call__)NNNr"   NNrB   )rM   
__module____qualname____doc__intr   strrH   rR   rW   Tensorr[   r   r   r   r    rA   o   s<    	

5rA   )NN)Nr"   r#   )r^   r0   	functoolsr   typingr   r   rV   r   rW   packaging.versionr   r,   	typeguardr   r   ndarrayr_   r!   r`   r@   objectrA   r   r   r   r    <module>   s\   
%
9