o
    pi                     @   sd   d dl m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 G d	d
 d
eZdS )    )OptionalN)Tensor   )BaseWaveformTransform)calculate_rms)Audio)
ObjectDictc                       s   e Zd ZdZddhZdZdZdZdZ							
	
	
	
dde	de	de
de
de	de
ded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 )Mixa  
    Create a new sample by mixing it with another random sample from the same batch

    Signal-to-noise ratio (where "noise" is the second random sample) is selected
    randomly between `min_snr_in_db` and `max_snr_in_db`.

    `mix_target` controls how resulting targets are generated. It can be one of
    "original" (targets are those of the original sample) or "union" (targets are the
    union of original and overlapping targets)

    per_exampleper_channelTF              @union      ?Nmin_snr_in_dbmax_snr_in_db
mix_targetmodepp_modesample_ratetarget_rateoutput_typec
           
         sr   t  j||||||	d || _|| _| j| jkrtd|| _|dkr*dd | _d S |dkr5dd | _d S td)	N)r   r   r   r   r   r   z4min_snr_in_db must not be greater than max_snr_in_dboriginalc                 S   s   | S N targetbackground_targetsnrr   r   [/home/ubuntu/.local/lib/python3.10/site-packages/torch_audiomentations/augmentations/mix.py<lambda>;   s    zMix.__init__.<locals>.<lambda>r   c                 S   s   t | |S r   )torchmaximumr   r   r   r    r!   >   s    z0mix_target must be one of 'original' or 'union'.)super__init__r   r   
ValueErrorr   _mix_target)
selfr   r   r   r   r   r   r   r   r   	__class__r   r    r%       s$   zMix.__init__samplestargetsc           	      C   sv   |j \}}}tjjtj| jtj|jdtj| jtj|jddd}|j	|fd| j
d< tjd||f|jd| j
d< d S )	N)dtypedeviceT)lowhighvalidate_args)sample_shape	snr_in_dbr   )r.   
sample_idx)shaper"   distributionsUniformtensorr   float32r.   r   sampletransform_parametersrandint)	r(   r+   r   r,   r   
batch_sizenum_channelsnum_samplessnr_distributionr   r   r    randomize_parametersE   s.   zMix.randomize_parametersreturnc                 C   s   | j d }| j d }t|| }t|d|jddd   }||d|  }	|d u r/d }
n|| }| |||}
t|	||
|dS )Nr3   r4   
   )dim   )r+   r   r,   r   )r;   r   rms_normalizer   	unsqueezer'   r   )r(   r+   r   r,   r   r   idxbackground_samplesbackground_rmsmixed_samplesmixed_targetsbackground_targetsr   r   r    apply_transformh   s   

zMix.apply_transform)	r   r   r   r
   r   NNNN)NNNN)__name__
__module____qualname____doc__supported_modessupports_multichannelrequires_sample_ratesupports_targetrequires_targetfloatstrintr   r%   r   rA   r   rO   __classcell__r   r   r)   r    r	      s~    	
'
%r	   )typingr   r"   r   core.transforms_interfacer   	utils.dspr   utils.ior   utils.object_dictr   r	   r   r   r   r    <module>   s    