o
    i                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	 d dl
mZ d dlmZ G dd dejZG dd dejZG d	d
 d
ejZdS )    N)
transforms)fftconvolve)sigprocc                       s2   e Zd Z fddZg fddZdddZ  ZS )	logFbankCalc                    s(   t t|   tj|||||d| _d S )N)sample_raten_fft
win_length
hop_lengthn_mels)superr   __init__r   MelSpectrogramfbankCal)selfr   r   r   r	   r
   	__class__ b/home/ubuntu/.local/lib/python3.10/site-packages/solospeech/vae_modules/stft_vae/models/feature.pyr      s   zlogFbankCal.__init__c                 C   s   |  |dd df }t|d }||jddjdd }tt|D ]9}|| r]t|j	d d |j	d d	 }td
|j	d | }|| |||  t  d || ||| < q$|S )N.gư>   )axis)dim         r   )
r   torchlogmean	unsqueezerangelenrandom	randrangeshape)r   xis_augoutioffsetstartr   r   r   forward   s    0zlogFbankCal.forwardFc                 C   s"   |  |d|g}|d}|S )Nr   )r*   r   squeeze)r   r$   r%   r   r   r   forward_sample$   s   
zlogFbankCal.forward_sample)F)__name__
__module____qualname__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 )STFT      c                    s$   t t|   || _|| _|| _d S N)r   r1   r   r   r	   r   )r   r   r	   r   r   r   r   r   ,   s   
zSTFT.__init__c              	   C   s   |  }|dks|dksJ d|jd }|jd }|dkr$|d|}tj|| j| j| jtj| j|j	ddd}|j\}}}|dkrK||d||}t
|}	t|}
|j}|j}|	|
|||fS )	Nr      zOnly support 2D or 3D Inputr   r   deviceT)windowreturn_complex)r   r#   reshaper   stftr   r	   r   hann_windowr7   absanglerealimag)r   ynum_dims
batch_sizenum_samplescomplex_stft_	num_freqs
num_framesmagphaser?   r@   r   r   r   r*   2   s,   



zSTFT.forward)r2   r3   r2   r-   r.   r/   r   r*   r0   r   r   r   r   r1   +   s    r1   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	iSTFTr2   r3   Nc                    s*   t t|   || _|| _|| _|| _d S r4   )r   rL   r   r   r	   r   length)r   r   r	   r   rM   r   r   r   r   S   s
   
ziSTFT.__init__c              	   C   s   |dkrt |tst |tsJ |\}}t||}n7|dkr)t|s(J dn)|dkrNt |ts9t |ts9J |\}}t|t| |t| }ntddd }|j	tj
krg|| jsg|tj}tj|| j| j| jtj| j|jd| jd	S )
N	real_imagcomplexz!The input feature is not complex.	mag_phasez;Only 'real_imag', 'complex', and 'mag_phase' are supported.c                 S   s   | | d @ dko| dkS )Nr   r   r   )nr   r   r   is_power_of_twol   s   z&iSTFT.forward.<locals>.is_power_of_twor6   )r8   rM   )
isinstancetuplelistr   rO   
is_complexcossinNotImplementedErrordtype	complex32r   to	complex64istftr	   r   r<   r7   rM   )r   features
input_typer?   r@   rI   rJ   rR   r   r   r   r*   Z   s0   "ziSTFT.forward)r2   r3   r2   NrK   r   r   r   r   rL   R   s    rL   )oslibrosanumpynpr   torch.nnnnr!   
torchaudior   scipy.signalr   python_speech_featuresr   Moduler   r1   rL   r   r   r   r   <module>   s    '