
    wi(                     J    d dl Z d dlZddlmZ ddlmZ  G d de          ZdS )    N   )util)	IIRfilterc                   b    e Zd ZdZddZd Zd Zd Zed	             Z	e	j
        d
             Z	dS )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.
    K-weighting皙?      ?c                 L    || _         || _        || _        || _        g | _        d S N)ratefilter_class
block_sizeoverlapblockwise_loudness)selfr   r   r   r   s        `/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/pyloudnorm/meter.py__init__zMeter.__init__   s-    	($"$    c                 N   |                                 }t          j        || j        | j                   |j        dk    r"t          j        ||j        d         df          }|j        d         |j        d         }| j	        
                                D ]=\  }}t                    D ](}|                    |dd|f                   |dd|f<   )>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.          	           fd
|D             }ddd           n# 1 swxY w Y   || _        fdt3          |          D             t)          j                    5  t)          j        dt.          	           fdt                    D             ddd           n# 1 swxY w Y   ddt          j        t          j        fdt                    D                                 z  z   dz
  fdt3          |          D             t)          j                    5  t)          j        dt.          	           t          j        t          j        fdt                    D                                 ddd           n# 1 swxY w Y   t          j        d          5  ddt          j        t          j        fdt                    D                                 z  z   }ddd           n# 1 swxY w Y   |S )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)categoryc                     g | ]Id dt          j        t          j        fdt                    D                                 z  z   JS )&1      $@c                 6    g | ]}|         |f         z  S  r    ).0iGjzs     r   
<listcomp>z8Meter.integrated_loudness.<locals>.<listcomp>.<listcomp>Y   s)    1\1\1\A!A$1Q3-1\1\1\r   )nplog10sumrange)r!   r$   r#   numChannelsr%   s    @r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>Y   s\    pppcd$"&1\1\1\1\1\1\{I[I[1\1\1\*]*]!^!^^^pppr   c                 &    g | ]\  }}|k    |S r    r    )r!   r$   l_jGamma_as      r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>]   s"    ===UQscWnnqnnnr   c                 T    g | ]#t          j        fd D                       $S )c                 $    g | ]}|f         S r    r    r!   r$   r"   r%   s     r   r&   z8Meter.integrated_loudness.<locals>.<listcomp>.<listcomp>b   s!    #8#8#8qAacF#8#8#8r   r'   meanr!   r"   J_gr%   s    @r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>b   s<    VVVa27#8#8#8#8#8C#8#8#899VVVr   r   r   c                 2    g | ]}|         |         z  S r    r    r!   r"   r#   z_avg_gateds     r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>d   s&    2e2e2eQ1Q4+a.3H2e2e2er   c                 2    g | ]\  }}|k    |k    |S r    r    )r!   r$   r-   r.   Gamma_rs      r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>g   s*    PPPUQssW}}wqr   c                 T    g | ]#t          j        fd D                       $S )c                 $    g | ]}|f         S r    r    r1   s     r   r&   z8Meter.integrated_loudness.<locals>.<listcomp>.<listcomp>k   s!    :O:O:Oa1QqS6:O:O:Or   r2   r4   s    @r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>k   s=    1m1m1mUV"':O:O:O:O:O3:O:O:O2P2P1m1m1mr   )dividec                 2    g | ]}|         |         z  S r    r    r7   s     r   r&   z-Meter.integrated_loudness.<locals>.<listcomp>o   s&    3f3f3faAaD;q>4I3f3f3fr   )copyr   valid_audior   r   ndimr'   reshaper   _filtersitemsr*   apply_filterr   introundarangezerosr)   squarewarningscatch_warningssimplefilterRuntimeWarningr   	enumerater(   
nan_to_numarrayerrstate)r   data
input_data
numSamplesr   filter_stagechT_gr   stepT	numBlocksj_ranger"   r$   luLUFSr#   r.   r:   r5   r+   r%   r8   s                     @@@@@@@r   integrated_loudnesszMeter.integrated_loudness!   s   * YY[[
TY@@@?aJ1A!1Da0HIIJ &q) &q)
 -1M,?,?,A,A 	O 	O(\<K(( O O#/#<#<Z"=M#N#N
111R4  O (''o,W}"1s7sTz":<<Q>??	)Ay))HK	2333{## 	Z 	ZA Z Zq4x,ty899q4x!|,ty899ty1RVBIjQRSTQTUVQVFW<X<X5Y5YY!A#	Z $&& 	q 	q!(^DDDDpppppphopppA	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q #$ >===ill===$&& 	W 	W!(^DDDDVVVVV5CUCUVVVK	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W
 4"(262e2e2e2e2eRWXcRdRd2e2e2e+f+f"g"gggjnn QPPPPillPPP$&& 	p 	p!(^DDDD-1m1m1m1m1mZ_`kZlZl1m1m1m(n(nooK	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p [))) 	i 	iD28BF3f3f3f3f3fSXYdSeSe3f3f3f,g,g#h#hhhD	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i sJ    ,H88H<?H<88J<<K K ?AN''N+.N+APP!Pc           	      8   | j         }| j        }	 d| _         d| _        |                     |d          }|                     |           | j        st          d          ddd}d	}fd
| j        D             }t          |          dk    rt          j        || _         || _        S t          |          }t          j	        t          j
        dt          j        |d                              |z  }dt          j        |          z  fd|D             }	t          |	          dk    rt          j        || _         || _        S t          j        |	|          }
t          j        |	|          }||
z
  }||| _         || _        S # || _         || _        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
   _   c                      g | ]
}|k    |S r    r    )r!   x	ABS_THRESs     r   r&   z(Meter.loudness_range.<locals>.<listcomp>   s    UUUaa9nnnnnr   r   c                 &    g | ]}|z   k    |S r    r    )r!   rf   	REL_THRESstl_integrateds     r   r&   z(Meter.loudness_range.<locals>.<listcomp>   s)    ___aqNU^D^?^?^?^?^?^r   )r   r   _append_silencer`   r   
ValueErrorlenr'   nanr)   powerr=   r(   
percentile)r   rS   original_block_sizeoriginal_overlapPRC_LOWPRC_HIGHstl_absgated_vecn	stl_powerstl_relgated_vecstl_perc_lowstl_perc_highLRArg   ri   rj   s                @@@r   loudness_rangezMeter.loudness_ranges   s   , #o<)	,!DODL''3'GGD$$T**** @ !>???IIGH  VUUU4+BUUU #$$))v& 2DO+DLL# $%%ArxBI6F,K,KLLMMPQQI"(9"5"55N_____+;___ #$$))v 2DO+DLL =)97CCLM*:HEEM,.C 2DO+DLL 2DO+DL++++s   B	F	 +BF	 
0F	 	Fc                    t          || j        z            }t          j        |          }t	          |j                  dk    rt          j        ||f          }nct	          |j                  dk    r<|j        d         }t          j        ||f          }t          j        ||fd          }nt          d          |S )Nr      r   )axiszInvalid shape for audio data)rF   r   r'   rI   rm   r   concatenaterl   )r   rS   rb   num_silence_samplessilencenew_audio_datanum_channelss          r   rk   zMeter._append_silence   s    !"6"BCC(.// tz??a^T7O<<NN__!!:a=Lh 3\BCCG^T7O!DDDNN;<<<r   c                     | j         S r   )_filter_class)r   s    r   r   zMeter.filter_class   s    !!r   c                 L   i | _         || _        | j        dk    rWt          ddt          j        d          z  d| j        d          | j         d<   t          ddd	| j        d
          | j         d
<   d S | 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<   d S | j        dk    rWt          ddt          j        d          z  d| j        d          | j         d<   t          ddd	| j        d
          | j         d
<   d S | j        dk    rBt          ddd| j        d
          | j         d
<   t          ddd| j        d          | j         d<   d S | j        dk    rBt          ddd| j        d          | j         d<   t          ddd| j        d          | j         d<   d S | j        d k    rd S t          d!| j                  )"Nr   g      @r   r~   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:)rC   r   r   r'   sqrtr   rl   )r   values     r   r   zMeter.filter_class   s>   "=00*3C271::vtyZf*g*gDM,')23T49k)Z)ZDM+&&&>11*3C271::vtyZf*g*gDM,')23UDI{)[)[DM+&'0a

lE49V_'`'`DM)$$$>11)23"'!**fdiYe)f)fDM+&)23T49k)Z)ZDM+&&&=00)23udiQ\)])]DM+&'0j&RVR[]f'g'gDM)$$$7**09-I[]oquqz  }O  1P  1PDM,-/8>PRceien  qB  0C  0CDM+,,,8++D4d6HIIIr   N)r   r	   r
   )__name__
__module____qualname____doc__r   r`   r|   rk   propertyr   setterr    r   r   r   r      s         &% % % %P P PdB, B, B,H  " " " X" J J J J Jr   r   )	rK   numpyr'    r   	iirfilterr   objectr   r    r   r   <module>r      s                          ]J ]J ]J ]J ]JF ]J ]J ]J ]J ]Jr   