o
    pi                     @   sl   d dl Z d dlZd dlmZ d dlmZ d dlmZ ddlmZ ddl	m
Z
 ddlmZ G d	d
 d
eZdS )    N)Optional)Tensor)pad   )BaseWaveformTransform)#convert_decibels_to_amplitude_ratio)
ObjectDictc                       s   e Zd ZdZddhZdZ								dd	ed
edee dee	 dee	 dee f fddZ
				ddedee	 dee dee	 fddZ				ddedee	 dee dee	 def
ddZ  ZS )	SpliceOutz
    spliceout augmentation proposed in https://arxiv.org/pdf/2110.00046.pdf
    silence padding is added at the end to retain the audio length.
    	per_batchper_exampleT           ?Nmodepp_modesample_ratetarget_rateoutput_typec	           	         s(   t  j||||||d || _|| _dS )z
        param num_time_intervals: number of time intervals to spliceout
        param max_width: maximum width of each spliceout in milliseconds
        param n_fft: size of FFT
        )r   r   r   r   r   r   N)super__init__num_time_intervals	max_width)	selfr   r   r   r   r   r   r   r   	__class__ b/home/ubuntu/.local/lib/python3.10/site-packages/torch_audiomentations/augmentations/splice_out.pyr      s   
zSpliceOut.__init__samplestargetsc                 C   s4   t jdt|| j d |jd | jfd| jd< d S )Nr   gMbP?)lowhighsizesplice_lengths)torchrandintintr   shaper   transform_parameters)r   r   r   r   r   r   r   r   randomize_parameters2   s
   zSpliceOut.randomize_parametersreturnc              
   C   s  g }t |jd D ]}| jd | }|| d d d d f }t | jD ]}	tjd|jd ||	  dd}
||	 d dkrD||	  d7  < ||	 }tj||jd}|d |d  ||d d  }}|d d |
|
||	 d  f |d d |
||	 d  |
||	  f }}|| ||  }tj|d d d |
f |d d d d f |d d |
||	  d f fdd	}q#tj	|| jd || jd |jd  ftj
|jd
}tj||fdd	}||d q	ttj|dd	|||dS )Nr   r#   )   )r"   r   r,   )device)dim)dtyper-   )r   r   r   r   )ranger'   r(   r   r$   r%   hann_windowr-   catzerosfloat32append	unsqueezer   )r   r   r   r   r   spliceout_samplesirandom_lengthssamplejstarthann_window_lenr1   hann_window_lefthann_window_right
fading_out	fading_in	crossfadepaddingr   r   r   apply_transform?   sR   &	$zSpliceOut.apply_transform)r   r   r   r   NNNN)NNNN)__name__
__module____qualname____doc__supported_modesrequires_sample_ratestrfloatr   r&   r   r   r)   r   rD   __classcell__r   r   r   r   r	      sj    	
r	   )loggingr$   typingr   r   torch.nn.functionalr   core.transforms_interfacer   	utils.dspr   utils.object_dictr   r	   r   r   r   r   <module>   s    