o
    si                     @   s   d dl ZdZdd ZdS )    Ng:0yE>c                 C   s   t || \}} |t j|ddd }| t j| ddd } t j| d dddt }t j| | ddd| }||  }|| }t j|d ddt j|d ddt  }t jdt |t  t jdS )	uQ  
    Scale-Invariant Signal-to-Distortion Ratio (SI-SDR)

    Args:
        reference: numpy.ndarray, [..., T]
        estimation: numpy.ndarray, [..., T]

    Returns:
        SI-SDR

    [1] SDR– Half- Baked or Well Done?
    http://www.merl.com/publications/docs/TR2019-013.pdf

    >>> np.random.seed(0)
    >>> reference = np.random.randn(100)
    >>> si_sdr(reference, reference)
    inf
    >>> si_sdr(reference, reference * 2)
    inf
    >>> si_sdr(reference, np.flip(reference))
    -25.127672346460717
    >>> si_sdr(reference, reference + np.flip(reference))
    0.481070445785553
    >>> si_sdr(reference, reference + 0.5)
    6.3704606032577304
    >>> si_sdr(reference, reference * 2 + 1)
    6.3704606032577304
    >>> si_sdr([reference, reference], [reference * 2 + 1, reference * 1 + 0.5])
    array([6.3704606, 6.3704606])

    T)keepdims   )axisr   )r   
   )dtype)npbroadcast_arraysmeansumEPSarraylog10float64)	reference
estimationreference_energyoptimal_scaling
projectionnoiseratio r   X/home/ubuntu/.local/lib/python3.10/site-packages/pb_bss_eval/evaluation/module_si_sdr.pysi_sdr   s     r   )numpyr   r   r   r   r   r   r   <module>   s    