o
    ߥih                     @   sl   d dl Zd dlZd dlmZ d dlm  mZ d dlm	Z	 d
ddZ
G dd dejZG dd	 d	ejZdS )    N)
get_windowFc                 C   s   |dks|d u rt | }n	t|| ddd }|}t jt |d |  }t |}t |}	t ||	gdj	}
|rBt j
|
j	}
|
| }
|
d d d d d f }
t|
t jt|d d d d f t jfS )NNoneT)fftbinsg      ?   )nponesr   fftrffteyerealimagconcatenateTlinalgpinvtorch
from_numpyastypefloat32)win_lenwin_incfft_lenwin_typeinverswindowNfourier_basisreal_kernelimag_kernelkernel r    Y/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/audio/ans/conv_stft.pyinit_kernels	   s   

r"   c                       s.   e Zd Z				d	 fdd	Zdd Z  ZS )
ConvSTFTNhammingr   Tc           	         s|   t t|   |d u rtdtt| | _n|| _t||| j|\}}t	j
|| d| _|| _|| _|| _| j| _d S )N   requires_grad)superr#   __init__intr   ceillog2r   r"   nn	Parameterweightfeature_typestrider   dim)	selfr   r   r   r   r0   fixr   _	__class__r    r!   r)       s   zConvSTFT.__init__c                 C   s   |  dkrt|d}tj|| j| jd}| jdkr|S | j d d }|d d d |d d f }|d d |d d d f }t|d |d  }t	||}||fS )Nr%   r   r1   complex)
r2   r   	unsqueezeFconv1dr/   r1   r0   sqrtatan2)r3   inputsoutputsr2   r   r   magsphaser    r    r!   forward5   s   
zConvSTFT.forwardNr$   r   T__name__
__module____qualname__r)   rC   __classcell__r    r    r6   r!   r#      s    r#   c                       s0   e Zd Z				d	 fdd	Zd
ddZ  ZS )	ConviSTFTNr$   r   Tc           	         s   t t|   |d u rtdtt| | _n|| _t||| j|dd\}}t	j
|| d| _|| _|| _|| _|| _|| _| j| _| d| | dt|d d d d d f  d S )Nr%   T)r   r&   r   enframe)r(   rJ   r)   r*   r   r+   r,   r   r"   r-   r.   r/   r0   r   r   r   r1   r2   register_bufferr   r
   )	r3   r   r   r   r   r0   r4   r   r   r6   r    r!   r)   H   s    
(zConviSTFT.__init__c                 C   s   |dur|t | }|t | }t ||gd}tj|| j| jd}| j	dd|
dd }tj|| j| jd}||d  }|S )z
        Args:
            inputs : [B, N+2, T] (complex spec) or [B, N//2+1, T] (mags)
            phase: [B, N//2+1, T] (if not none)
        Nr   r8   r%   g:0yE>)r   cossincatr;   conv_transpose1dr/   r1   r   repeatsizerK   )r3   r?   rB   r   r   r@   tcoffr    r    r!   rC   `   s   zConviSTFT.forwardrD   )NrE   r    r    r6   r!   rJ   F   s    rJ   )NF)numpyr   r   torch.nnr-   torch.nn.functional
functionalr;   scipy.signalr   r"   Moduler#   rJ   r    r    r    r!   <module>   s   
(