
    qi(                     B    d dl Z d dlZddlmZ ddlmZ  G d de      Zy)    N   )util)	IIRfilterc                   ^    e Zd ZdZd	dZd Zd Zd Zed        Z	e	j                  d        Z	y)
Metera   Meter object which defines how the meter operates

    Defaults to the algorithm defined in ITU-R BS.1770-4.

    Parameters
    ----------
    rate : float
        Sampling rate in Hz.
    filter_class : str
        Class of weighting filter used.
        - 'K-weighting'
        - 'Fenton/Lee 1'
        - 'Fenton/Lee 2'
        - 'Dash et al.'
        - 'DeMan'
    block_size : float
        Gating block size in seconds.
    c                 J    || _         || _        || _        || _        g | _        y N)ratefilter_class
block_sizeoverlapblockwise_loudness)selfr
   r   r   r   s        B/opt/pipecat/venv/lib/python3.12/site-packages/pyloudnorm/meter.py__init__zMeter.__init__   s'    	($"$    c                 b
   |j                         }t        j                  || j                  | j                         |j
                  dk(  r%t        j                  ||j                  d   df      }|j                  d   }|j                  d   }| j                  j                         D ]4  \  }}t        |      D ]!  }|j                  |dd|f         |dd|f<   # 6 g d}| j                  }	d}
| j                  }d|z
  }|| j                  z  }t        t        j                  ||	z
  |	|z  z        dz         }t        j                   d|      }t        j"                  ||f      }t        |      D ]  }|D ]  }t        |	||z  z  | j                  z        }t        |	||z  dz   z  | j                  z        }d|	| j                  z  z  t        j$                  t        j&                  ||||f               z  |||f<     t)        j*                         5  t)        j,                  dt.        	       |D cg c]R  }d
dt        j0                  t        j$                  t        |      D cg c]  }||   |||f   z   c}            z  z   T }}}ddd       | _        t5        |      D cg c]  \  }}||
k\  s| }}}t)        j*                         5  t)        j,                  dt.        	       t        |      D cg c]*  }t        j6                  |D cg c]	  }|||f    c}      , }}}ddd       d
dt        j0                  t        j$                  t        |      D cg c]  }||   |   z   c}            z  z   dz
  }t5        |      D cg c]  \  }}||kD  s||
kD  s| }}}t)        j*                         5  t)        j,                  dt.        	       t        j8                  t        j:                  t        |      D cg c]*  }t        j6                  |D cg c]	  }|||f    c}      , c}}            }ddd       t        j<                  d      5  d
dt        j0                  t        j$                  t        |      D cg c]  }||   |   z   c}            z  z   }ddd       |S c c}w c c}}w # 1 sw Y   ?xY wc c}}w c c}w c c}}w # 1 sw Y   xY wc c}w c c}}w c c}w c c}}w # 1 sw Y   xY wc c}w # 1 sw Y   S xY w)a   Measure the integrated gated loudness of a signal.

        Uses the weighting filters and block size defined by the meter
        the integrated loudness is measured based upon the gating algorithm
        defined in the ITU-R BS.1770-4 specification.

        Input data must have shape (samples, ch) or (samples,) for mono audio.
        Supports up to 5 channels and follows the channel ordering:
        [Left, Right, Center, Left surround, Right surround]

        Params
        -------
        data : ndarray
            Input multichannel audio data.

        Returns
        -------
        LUFS : float
            Integrated gated loudness of the input measured in dB LUFS.
        r   r   N)      ?r   r   (\?r   g     Qr   )shapeignore)categoryg&1g      $@)divide)copyr   valid_audior
   r   ndimnpreshaper   _filtersitemsrangeapply_filterr   introundarangezerossumsquarewarningscatch_warningssimplefilterRuntimeWarninglog10r   	enumeratemean
nan_to_numarrayerrstate)r   data
input_datanumChannels
numSamplesr   filter_stagechGT_gGamma_ar   stepT	numBlocksj_rangezijlul_jJ_gz_avg_gatedGamma_rLUFSs                             r   integrated_loudnesszMeter.integrated_loudness!   s   * YY[
TYY@??aJ1A1A!1Da0HIJ &&q) &&q)
 -1MM,?,?,A 	O(\<K( O#/#<#<Z"=M#N
1R4 O	O (oo,,W}"1s7sTz":<Q>?	))Ay)HHK	23{# 	ZA Zq4x,tyy89q4x!|,tyy89tyy1RVVBIIjQRSTQTUVQVFW<X5YY!A#	Z	Z $$& 	q!!(^Dhopcd$"&&{I[1\A!A$1Q3-1\*]!^^^pAp	q #$ (l=UQscWnq==$$& 	W!!(^DCHCUVa277C#8qAacF#89VKV	W
 4"((266RWXcRd2eQ1Q4+a.3H2e+f"gggjnn (lPUQssW}wqPP$$& 	p!!(^D--Z_`kZl1mUV"''3:Oa1QqS6:O2P1m(noK	p [[) 	iD288BFFSXYdSe3faAaD;q>4I3f,g#hhhD	i 1 2]p	q 	q >
 $9V	W 	W
 3f Q ;P1m	p 	p 4g	i s   !S;2S-SSS2S S*S0S*S%+	S*4S0,S=T,T2TATT-T;	TT..T$T.T$SSS%S**S00S:TTTT$$T.c           	      v   | j                   }| j                  }	 d| _         d| _        | j                  |d      }| j                  |       | j                  st        d      d}d}d}d	}| j                  D cg c]
  }||k\  s	| }	}t        |	      d
k(  rt        j                  || _         || _        S t        |	      }
t        j                  t        j                  dt        j                  |	d                  |
z  }dt        j                  |      z  }|	D cg c]  }|||z   k\  s| }}t        |      d
k(  rt        j                  || _         || _        S t        j                  ||      }t        j                  ||      }||z
  }||| _         || _        S c c}w c c}w # || _         || _        w xY w)a   Measure the loudness range of a signal.

        An implementation based on the MATLAB example of TECH 3342 -
        LOUDNESS RANGE: A MEASURE TO SUPPLEMENT EBU R 128 LOUDNESS NORMALIZATION

        Input data must have shape (samples, ch) or (samples,) for mono audio.
        Supports up to 5 channels and follows the channel ordering:
        [Left, Right, Center, Left surround, Right surround]

        Params
        -------
        data : ndarray
            Input multichannel audio data.

        Returns
        -------
        LRA : float
            Loudness Range measure in LU.
            Returns NaN if the signal is too quiet to compute LRA.
        g      @g
ףp=
?g      ?)silence_duration_seczNo blockwise loudness foundii
   _   r   )r   r   _append_silencerJ   r   
ValueErrorlenr   nanr'   powerr   r-   
percentile)r   r3   original_block_sizeoriginal_overlap	ABS_THRES	REL_THRESPRC_LOWPRC_HIGHxstl_absgated_vecn	stl_powerstl_integratedstl_relgated_vecstl_perc_lowstl_perc_highLRAs                    r   loudness_rangezMeter.loudness_ranges   s   , #oo<<)	,!DODL''3'GD$$T*** !>??IIGH ,0+B+BUaa9nUU #$)vv& 2DO+DL# $%ArxxBII6F,KLMPQQI"((9"55N+;_aqNU^D^?^__ #$)vv 2DO+DL ==)97CLMM*:HEM,.C 2DO+DL1  V  ` 2DO+DLsC   AF( 9
FFF( 6A'F( F#+F#/F( 2F( 
F( (F8c                    t        || j                  z        }t        j                  |      }t	        |j
                        dk(  rt        j                  ||f      }|S t	        |j
                        dk(  rA|j
                  d   }t        j                  ||f      }t        j                  ||fd      }|S t        d      )Nr      r   )axiszInvalid shape for audio data)r#   r
   r   r&   rQ   r   concatenaterP   )r   r3   rL   num_silence_samplessilencenew_audio_datanum_channelss          r   rO   zMeter._append_silence   s    !"6"BC((./ tzz?a^^T7O<N  _!::a=Lhh 3\BCG^^T7O!DN  ;<<r   c                     | j                   S r	   )_filter_class)r   s    r   r   zMeter.filter_class   s    !!!r   c                    i | _         || _        | j                  dk(  rct        ddt        j                  d      z  d| j
                  d      | j                   d<   t        ddd	| j
                  d
      | j                   d
<   y | j                  dk(  rt        ddt        j                  d      z  d| j
                  d      | j                   d<   t        ddd| j
                  d
      | j                   d
<   t        ddt        j                  d      z  d| j
                  d      | j                   d<   y | j                  dk(  rct        ddt        j                  d      z  d| j
                  d      | j                   d<   t        ddd	| j
                  d
      | j                   d
<   y | j                  dk(  rMt        ddd| j
                  d
      | j                   d
<   t        ddd| j
                  d      | j                   d<   y | j                  dk(  rMt        ddd| j
                  d      | j                   d<   t        ddd| j
                  d      | j                   d<   y | j                  d k(  ry t        d!| j                        )"NK-weightingg      @r   rf   g     p@
high_shelfg        g      ?g      C@	high_passzFenton/Lee 1g      @g     @`@g     @@peakingzFenton/Lee 2	high_selfzDash et al.g      ?g     b@gݡsgrˢE?g     @@DeMangCo"@giwh-?gCxG@high_shelf_DeMangح?g^JWC@high_pass_DeMancustomzInvalid filter class:)r   rn   r   r   sqrtr
   rP   )r   values     r   r   zMeter.filter_class   s&   "=0*3C2771:vtyyZf*gDMM,')23T499k)ZDMM+&>1*3C2771:vtyyZf*gDMM,')23UDII{)[DMM+&'0a
lE499V_'`DMM)$>1)23"''!*fdiiYe)fDMM+&)23T499k)ZDMM+&=0)23udiiQ\)]DMM+&'0j&RVR[R[]f'gDMM)$7*09-I[]oquqzqz  }O  1PDMM,-/8>PRceienen  qB  0CDMM+,8+4d6H6HIIr   N)rp   g?g      ?)__name__
__module____qualname____doc__r   rJ   rd   rO   propertyr   setter r   r   r   r      sO    &%PdB,H" " " J Jr   r   )	r)   numpyr    r   	iirfilterr   objectr   r   r   r   <module>r      s!        ]JF ]Jr   