o
    xî‚i¼  ã                   @   sˆ  d Z ddlZddlZddlmZmZmZ ddlmZ de	de
fdd„Zd,de	de	de	de	def
dd„Zde	de	fdd„Zdeee	 eegee	 f dee dedededee fdd„Zdeee	df  dededeee	df  fdd„Zdee	 dededee	 fd d!„Zdee	 dedededee	 f
d"d#„Zdee	 dededee	 fd$d%„Zd&ee	 dee	 fd'd(„Zd)ee	 de	fd*d+„ZdS )-z
Various math utilities
é    N)ÚCallableÚListÚTuple)ÚerrorsÚinputNumÚreturnc                 C   s*   t | t| ƒƒrd|  }|S dt| ƒ }|S )Nz%dz%s)ÚiscloseÚintÚrepr)r   ÚretVal© r   ú\/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/praatio/utilities/my_math.pyÚnumToStr   s
   ÿr   ç›+¡†›„=ç        ÚaÚbÚrel_tolÚabs_tolc                 C   s(   t | | ƒt|tt | ƒt |ƒƒ |ƒkS ©N)ÚabsÚmax)r   r   r   r   r   r   r   r      s   (r   c                 C   s   t | |ƒp| |k S r   )r   )r   r   r   r   r   ÚlessThanOrEqual   s   r   Ú
filterFuncÚfeatureTimeListÚ
windowSizeÚindexÚuseEdgePaddingc                    sb   dd„ |D ƒ}‡ fdd„|D ƒ}| |||ƒ}t |ƒt |ƒkr#t d¡ ‡ fdd„t||ƒD ƒ}|S )a!  Filter time-stamped data values within a window

    filterFunc could be medianFilter() or znormFilter()

    It's ok to have other values in the list. eg
    featureTimeList: [(time_0, .., featureA_0, ..),
                      (time_1, .., featureA_1, ..),
                      ..]
    c                 S   s   g | ]}t |ƒ‘qS r   )Úlist©Ú.0Úrowr   r   r   Ú
<listcomp>,   ó    z(filterTimeSeriesData.<locals>.<listcomp>c                    ó   g | ]}|ˆ  ‘qS r   r   r   ©r   r   r   r"   -   r#   úsThe length of the time values {len(featureTimeList)} does not match the length of the data values {len(featValues)}c                    s4   g | ]\}}g |d ˆ … ¢|‘|ˆ d d … ¢‘qS ©Né   r   )r    ÚpiRowÚf0Valr%   r   r   r"   5   s    "ÿÿ)Úlenr   ÚArgumentErrorÚzip)r   r   r   r   r   Ú
featValuesÚ
outputListr   r%   r   ÚfilterTimeSeriesData   s   ÿ
þr0   .ÚfilterZeroValuesc                    sŒ   ‡ fdd„| D ƒ}|st |ƒ}ndd„ |D ƒ}t |¡‰t |¡‰‡‡fdd„|D ƒ}t| ƒt|ƒkr8t d¡ ‡ fdd„t| |ƒD ƒ}|S )aÉ  znormalize time series data

    The idea is to normalize each speaker separately to be able
    to compare data across several speakers for speaker-dependent
    data like pitch range

    To normalize a speakers data within a local window, use filterTimeSeriesData()

    filterZeroValues: if True, don't consider zero values in the mean and stdDev
      (recommended value for data like pitch or intensity, where zero values
       are not expected)
    c                    r$   r   r   r   r%   r   r   r"   L   r#   z)znormalizeSpeakerData.<locals>.<listcomp>c                 S   s   g | ]}|d kr|‘qS )Ú r   ©r    Úvalr   r   r   r"   Q   ó    c                    s$   g | ]}|d kr|ˆ  ˆ nd ‘qS )r   r   r3   ©ÚmeanValÚ	stdDevValr   r   r"   U   s    ÿr&   c                    s8   g | ]\}}t g |d ˆ … ¢|‘|ˆ d d … ¢ƒ‘qS r'   )Útuple)r    r)   r4   r%   r   r   r"   ^   s    &ÿÿ)ÚznormalizeDataÚ
statisticsÚmeanÚstdevr+   r   r,   r-   )r   r   r1   r.   ÚfeatValuesNoZeroesr/   r   )r   r7   r8   r   ÚznormalizeSpeakerData=   s"   


ÿÿ
þr?   ÚdistÚwindowc                 C   s   t tj| ||ƒS )au  median filter each value in a dataset; filtering occurs within a given window

    Median filtering is used to "smooth" out extreme values.  It can be useful if
    your data has lots of quick spikes.  The larger the window, the flatter the output
    becomes.
    Given:
    x = [1 1 1 9 5 2 4 7 4 5 1 5]
    medianFilter(x, 5, False)
    >> [1 1 1 2 4 5 4 4 4 5 1 5]
    )Ú_stepFilterr;   Úmedian)r@   rA   r   r   r   r   ÚmedianFilterf   s   rD   c           
      C   s~   dd„ }|st || ||ƒ}|S g }g }t| ƒD ]\}}	|	dkr%| |	¡ q| |¡ qt ||||ƒ}|D ]}| |d¡ q4|S )a`  z-normalize each value in a dataset; normalization occurs within a given window

    If you suspect that events are sensitive to local changes, (e.g. local changes in pitch
    are more important absolute differences in pitch) then using windowed
    znormalization is appropriate.

    See znormalizeData() for more information on znormalization.
    c                 S   s,   | t t| ƒd ƒ }|t | ¡ t | ¡ S )Nç       @)r	   r+   r;   r<   r=   )ÚvalListÚ	valToNormr   r   r   ÚznormalizeCenterVal€   s   z.znormWindowFilter.<locals>.znormalizeCenterValr   )rB   Ú	enumerateÚappendÚinsert)
r@   rA   r   r1   rH   ÚfilteredOutputÚzeroIndexListÚnonzeroValListÚir4   r   r   r   ÚznormWindowFiltert   s    ñÿrP   c                 C   s
  t t |d ¡ƒ}t|ƒ}g }t|ƒD ]o}g }|s%d|| kry|| |k ryg }	|| g}
g }d}td|d ƒD ]6}|| |krI|dkrF|}n|}n|| }|| }| || ¡ || dk rad}n|| }|	 d|| ¡ q7|	|
 | }| |ƒ}n|| }| |¡ q|S )NrE   r   r(   )r	   ÚmathÚfloorr+   ÚrangerJ   rK   )r   r@   rA   r   ÚoffsetÚlengthÚ
returnListÚxÚdataToFilterÚ
preContextÚcurrentContextÚpostContextÚlastKnownLargeIndexÚyÚlargeIndexValueÚsmallIndexValueÚvaluer   r   r   rB   ™   s8   ÿ
rB   rF   c                    s4   | dd… } t  | ¡‰ t  | ¡‰‡ ‡fdd„| D ƒS )a7  Given a list of floats, return the z-normalized values of the floats

    The formula is: z(v) = (v - mean) / stdDev
    In effect, this scales all values to the range [-4, 4].
    It can be used, for example, to compare the pitch values of different speakers who
    naturally have different pitch ranges.
    Nc                    s   g | ]}|ˆ  ˆ ‘qS r   r   r3   r6   r   r   r"   Õ   r5   z"znormalizeData.<locals>.<listcomp>)r;   r<   r=   )rF   r   r6   r   r:   É   s   

r:   ÚintensityValuesc                 C   s(   dd„ | D ƒ} t | ƒt| ƒ }t |¡S )z7Return the root mean square for the input set of valuesc                 S   s   g | ]}|d  ‘qS )é   r   r3   r   r   r   r"   Ú   r#   zrms.<locals>.<listcomp>)Úsumr+   rQ   Úsqrt)ra   r7   r   r   r   ÚrmsØ   s   
re   )r   r   )Ú__doc__rQ   r;   Útypingr   r   r   Úpraatio.utilitiesr   ÚfloatÚstrr   Úboolr   r   r	   r   r0   r?   rD   rP   rB   r:   re   r   r   r   r   Ú<module>   sj     ÿþýüû
ú!ÿÿÿ
þ")ÿÿÿÿ
þ%ÿÿÿ
þ0