Ë
    �\;jç[  ã                   ó¦   — 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	m
Z
mZ ddlmZ d	d
gZdd„Zdd„Z	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 dd„Zy)é    N)Ú_C_ops)Úin_dynamic_modeé   )Úcheck_variable_and_dtype)ÚLayerHelper)Úfft_c2cÚfft_c2rÚfft_r2c)Ú
is_complexÚstftÚistftc                 ó0  — |dvrt        d|› d�«      ‚t        |t        «      r|dk  rt        d|› d�«      ‚t        |t        «      r|dk  rt        d|› d�«      ‚t        «       rI|| j                  |   kD  rt        d|› d	| j                  |   › d
�«      ‚t        j                  | |||«      S d}t        | dg d¢|«       t        |fi t        «       ¤Ž}|j                  d¬«      }|j                  |¬«      }|j                  |d| i|||dœd|i¬«       |S )a«
  
    Slice the N-dimensional (where N >= 1) input into (overlapping) frames.

    Args:
        x (Tensor): The input data which is a N-dimensional (where N >= 1) Tensor
            with shape `[..., seq_length]` or `[seq_length, ...]`.
        frame_length (int): Length of the frame and `0 < frame_length <= x.shape[axis]`.
        hop_length (int): Number of steps to advance between adjacent frames
            and `0 < hop_length`.
        axis (int, optional): Specify the axis to operate on the input Tensors. Its
            value should be 0(the first dimension) or -1(the last dimension). If not
            specified, the last axis is used by default.

    Returns:
        The output frames tensor with shape `[..., frame_length, num_frames]` if `axis==-1`,
            otherwise `[num_frames, frame_length, ...]` where

            `num_frames = 1 + (x.shape[axis] - frame_length) // hop_length`

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle import signal

            >>> # 1D
            >>> x = paddle.arange(8)
            >>> y0 = signal.frame(x, frame_length=4, hop_length=2, axis=-1)
            >>> print(y0)
            Tensor(shape=[4, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[0, 2, 4],
             [1, 3, 5],
             [2, 4, 6],
             [3, 5, 7]])

            >>> y1 = signal.frame(x, frame_length=4, hop_length=2, axis=0)
            >>> print(y1)
            Tensor(shape=[3, 4], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[0, 1, 2, 3],
             [2, 3, 4, 5],
             [4, 5, 6, 7]])

            >>> # 2D
            >>> x0 = paddle.arange(16).reshape([2, 8])
            >>> y0 = signal.frame(x0, frame_length=4, hop_length=2, axis=-1)
            >>> print(y0)
            Tensor(shape=[2, 4, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[[0 , 2 , 4 ],
              [1 , 3 , 5 ],
              [2 , 4 , 6 ],
              [3 , 5 , 7 ]],
             [[8 , 10, 12],
              [9 , 11, 13],
              [10, 12, 14],
              [11, 13, 15]]])

            >>> x1 = paddle.arange(16).reshape([8, 2])
            >>> y1 = signal.frame(x1, frame_length=4, hop_length=2, axis=0)
            >>> print(y1.shape)
            [3, 4, 2]

            >>> # > 2D
            >>> x0 = paddle.arange(32).reshape([2, 2, 8])
            >>> y0 = signal.frame(x0, frame_length=4, hop_length=2, axis=-1)
            >>> print(y0.shape)
            [2, 2, 4, 3]

            >>> x1 = paddle.arange(32).reshape([8, 2, 2])
            >>> y1 = signal.frame(x1, frame_length=4, hop_length=2, axis=0)
            >>> print(y1.shape)
            [3, 4, 2, 2]
    ©r   éÿÿÿÿúUnexpected axis: ú. It should be 0 or -1.r   zUnexpected frame_length: ú#. It should be an positive integer.úUnexpected hop_length: zKAttribute frame_length should be less equal than sequence length, but got (z) > (z).ÚframeÚx)Úint32Úint64Úfloat16Úfloat32Úfloat64©Úinput_param_name©ÚdtypeÚX)Úframe_lengthÚ
hop_lengthÚaxisÚOut©ÚtypeÚinputsÚattrsÚoutputs)Ú
ValueErrorÚ
isinstanceÚintr   Úshaper   r   r   r   ÚlocalsÚinput_dtypeÚ"create_variable_for_type_inferenceÚ	append_op)	r   r!   r"   r#   ÚnameÚop_typeÚhelperr   Úouts	            úVG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/signal.pyr   r      sa  € ðT �7ÑÜÐ,¨T¨FÐ2IÐJÓKÐKä�l¤CÔ(¨L¸AÒ,=ÜØ'¨ ~Ð5XÐYó
ð 	
ô �j¤#Ô&¨*¸ª/ÜØ% j \Ð1TÐUó
ð 	
ô ÔØ˜!Ÿ'™' $™-Ò'ÜðØ(˜>¨¨q¯w©w°t©}¨o¸RðAóð ô �|‰|˜A˜|¨Z¸Ó>Ð>àˆÜ ØˆsÒGÈô	
ô ˜WÑ1¬«Ñ1ˆØ×"Ñ"°CÐ"Ó8ˆØ×7Ñ7¸eÐ7ÓDˆØ×ÑØØ˜�8à ,Ø(Øñð
 ˜C�Lð 	ô 		
ð €Jó    c                 ó†  — |dvrt        d|› d�«      ‚t        |t        «      r|dk  rt        d|› d�«      ‚d}t        «       rt	        j
                  | ||«      }|S t        | dg d	¢|«       t        |fi t        «       ¤Ž}|j                  d¬
«      }|j                  |¬«      }|j                  |d| i||dœd|i¬«       |S )aˆ	  
    Reconstructs a tensor consisted of overlap added sequences from input frames.

    Args:
        x (Tensor): The input data which is a N-dimensional (where N >= 2) Tensor
            with shape `[..., frame_length, num_frames]` or
            `[num_frames, frame_length ...]`.
        hop_length (int): Number of steps to advance between adjacent frames and
            `0 < hop_length <= frame_length`.
        axis (int, optional): Specify the axis to operate on the input Tensors. Its
            value should be 0(the first dimension) or -1(the last dimension). If not
            specified, the last axis is used by default.

    Returns:
        The output frames tensor with shape `[..., seq_length]` if `axis==-1`,
            otherwise `[seq_length, ...]` where

            `seq_length = (n_frames - 1) * hop_length + frame_length`

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.signal import overlap_add

            >>> # 2D
            >>> x0 = paddle.arange(16).reshape([8, 2])
            >>> print(x0)
            Tensor(shape=[8, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[0 , 1 ],
             [2 , 3 ],
             [4 , 5 ],
             [6 , 7 ],
             [8 , 9 ],
             [10, 11],
             [12, 13],
             [14, 15]])


            >>> y0 = overlap_add(x0, hop_length=2, axis=-1)
            >>> print(y0)
            Tensor(shape=[10], dtype=int64, place=Place(cpu), stop_gradient=True,
            [0 , 2 , 5 , 9 , 13, 17, 21, 25, 13, 15])

            >>> x1 = paddle.arange(16).reshape([2, 8])
            >>> print(x1)
            Tensor(shape=[2, 8], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ],
             [8 , 9 , 10, 11, 12, 13, 14, 15]])


            >>> y1 = overlap_add(x1, hop_length=2, axis=0)
            >>> print(y1)
            Tensor(shape=[10], dtype=int64, place=Place(cpu), stop_gradient=True,
            [0 , 1 , 10, 12, 14, 16, 18, 20, 14, 15])


            >>> # > 2D
            >>> x0 = paddle.arange(32).reshape([2, 1, 8, 2])
            >>> y0 = overlap_add(x0, hop_length=2, axis=-1)
            >>> print(y0.shape)
            [2, 1, 10]

            >>> x1 = paddle.arange(32).reshape([2, 8, 1, 2])
            >>> y1 = overlap_add(x1, hop_length=2, axis=0)
            >>> print(y1.shape)
            [10, 1, 2]
    r   r   r   r   r   r   Úoverlap_addr   )r   r   r   r   r   Úuint16r   r   r    )r"   r#   r$   r%   )r*   r+   r,   r   r   r9   r   r   r.   r/   r0   r1   )r   r"   r#   r2   r3   r5   r4   r   s           r6   r9   r9   ‘   s÷   € ðL �7ÑÜÐ,¨T¨FÐ2IÐJÓKÐKä�j¤#Ô&¨*¸ª/ÜØ% j \Ð1TÐUó
ð 	
ð €GäÔÜ× Ñ   J°Ó5ˆð" €Jô 	!ØØÚIØô		
ô ˜WÑ1¬«Ñ1ˆØ×"Ñ"°CÐ"Ó8ˆØ×7Ñ7¸eÐ7ÓDˆØ×ÑØØ˜�8Ø!+°TÑ:Ø˜C�Lð	 	ô 	
ð €Jr7   c
           	      óÜ  — t        | j                  «      }
|
dv s
J d|
› �«       ‚|
dk(  r| j                  d«      } |€t        |dz  «      }|dkD  sJ d|› d�«       ‚|€|}t	        «       r5d|cxk  r| j                  d	   k  sn J d
| j                  d	   › d|› d�«       ‚d|cxk  r|k  sn J d|› d|› d�«       ‚|�>t        |j                  «      dk(  rt        |«      |k(  s:J d|› d|j                  › d�«       ‚t        j                  |f| j                  ¬«      }||k  r>||z
  dz  }||z
  |z
  }t
        j                  j                  j                  |||gd¬«      }|ra|dv sJ d|› d�«       ‚|dz  }t
        j                  j                  j                  | j                  d	«      ||g|d¬«      j                  d	«      } t        | ||d	¬«      }|j                  g d¢¬«      }t        j                  ||«      }|rdnd}t        |«      r	|rJ d«       ‚t        | «      st!        |dd	|d||	¬«      }nt#        |dd	|d|	¬ «      }|j                  g d¢¬«      }|
dk(  r|j%                  d«       |S )!a@  

    Short-time Fourier transform (STFT).

    The STFT computes the discrete Fourier transforms (DFT) of short overlapping
    windows of the input using this formula:

    .. math::
        X_t[f] = \sum_{n = 0}^{N-1} \text{window}[n]\ x[t \times H + n]\ e^{-{2 \pi j f n}/{N}}

    Where:
    - :math:`t`: The :math:`t`-th input window.
    - :math:`f`: Frequency :math:`0 \leq f < \text{n_fft}` for `onesided=False`,
    or :math:`0 \leq f < \lfloor \text{n_fft} / 2 \rfloor + 1` for `onesided=True`.
    - :math:`N`: Value of `n_fft`.
    - :math:`H`: Value of `hop_length`.

    Args:
        x (Tensor): The input data which is a 1-dimensional or 2-dimensional Tensor with
            shape `[..., seq_length]`. It can be a real-valued or a complex Tensor.
        n_fft (int): The number of input samples to perform Fourier transform.
        hop_length (int, optional): Number of steps to advance between adjacent windows
            and `0 < hop_length`. Default: `None` (treated as equal to `n_fft//4`)
        win_length (int, optional): The size of window. Default: `None` (treated as equal
            to `n_fft`)
        window (Tensor, optional): A 1-dimensional tensor of size `win_length`. It will
            be center padded to length `n_fft` if `win_length < n_fft`. Default: `None` (
            treated as a rectangle window with value equal to 1 of size `win_length`).
        center (bool, optional): Whether to pad `x` to make that the
            :math:`t \times hop\_length` at the center of :math:`t`-th frame. Default: `True`.
        pad_mode (str, optional): Choose padding pattern when `center` is `True`. See
            `paddle.nn.functional.pad` for all padding options. Default: `"reflect"`
        normalized (bool, optional): Control whether to scale the output by `1/sqrt(n_fft)`.
            Default: `False`
        onesided (bool, optional): Control whether to return half of the Fourier transform
            output that satisfies the conjugate symmetry condition when input is a real-valued
            tensor. It can not be `True` if input is a complex tensor. Default: `True`
        name (str, optional): The default value is None. Normally there is no need for user
            to set this property. For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        The complex STFT output tensor with shape `[..., n_fft//2 + 1, num_frames]`
        (real-valued input and `onesided` is `True`) or `[..., n_fft, num_frames]`
        (`onesided` is `False`)

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.signal import stft

            >>> # real-valued input
            >>> x = paddle.randn([8, 48000], dtype=paddle.float64)
            >>> y1 = stft(x, n_fft=512)
            >>> print(y1.shape)
            [8, 257, 376]

            >>> y2 = stft(x, n_fft=512, onesided=False)
            >>> print(y2.shape)
            [8, 512, 376]

            >>> # complex input
            >>> x = paddle.randn([8, 48000], dtype=paddle.float64) + \
            ...         paddle.randn([8, 48000], dtype=paddle.float64)*1j
            >>> print(x.shape)
            [8, 48000]
            >>> print(x.dtype)
            paddle.complex128

            >>> y1 = stft(x, n_fft=512, center=False, onesided=False)
            >>> print(y1.shape)
            [8, 512, 372]

    )r   é   z9x should be a 1D or 2D real tensor, but got rank of x is r   r   Né   z"hop_length should be > 0, but got Ú.r   z"n_fft should be in (0, seq_length(ú)], but got ú"win_length should be in (0, n_fft(z8expected a 1D window tensor of size equal to win_length(z), but got window with shape ©r-   r   r<   Úconstant©ÚpadÚmode)rB   Úreflectz5pad_mode should be "reflect" or "constant", but got "z".ÚNLC)rD   rE   Údata_format)r   r!   r"   r#   ©r   r<   r   ©ÚpermÚorthoÚbackwardzBonesided should be False when input or window is a complex Tensor.T)r   Únr#   ÚnormÚforwardÚonesidedr2   ©r   rN   r#   rO   rP   r2   )Úlenr-   Ú	unsqueezer,   r   ÚpaddleÚonesr   ÚnnÚ
functionalrD   Úsqueezer   Ú	transposeÚmultiplyr   r
   r   Úsqueeze_)r   Ún_fftr"   Ú
win_lengthÚwindowÚcenterÚpad_modeÚ
normalizedrQ   r2   Úx_rankÚpad_leftÚ	pad_rightÚ
pad_lengthÚx_framesrO   r5   s                    r6   r   r   ö   s  € ôn �—‘‹\€FØð ñ ð Lð 
CÀ6À(ÐKóLð ð
 �‚{Ø�K‰K˜‹NˆàÐÜ˜ !™“_ˆ
à˜Š>ÐMÐ?À
¸|È1ÐMÓMˆ>àÐØˆ
äÔà�Ô$˜Ÿ™ ™Ô$ð	Rà/°·±¸±¨}¸LÈÈÈqÐQó	RØ$ð 	
ˆJÔ˜%ÔðMà	+¨E¨7°,¸z¸lÈ!ÐLóMØð Ðä�—‘Ó Ò"¤s¨6£{°jÒ'@ð	àEÀjÀ\ÐQnÐou×o{Ño{Ðn|Ð|}Ð~ó	Ø@ô —‘ J =¸¿¹Ô@ˆà�EÒØ˜JÑ&¨1Ñ,ˆØ˜JÑ&¨Ñ1ˆ	Ü—‘×%Ñ%×)Ñ)Ø˜ 9Ð-°Jð *ó 
ˆñ Øð 
ñ 
ð 	Pð CÀ8À*ÈBÐOó	Pð 
ð
 ˜a‘Zˆ
ä�I‰I× Ñ ×$Ñ$Ø�K‰K˜‹OØ˜ZÐ(ØØð	 %ó 
÷
 ‰'�"‹+ð 	
ô �q u¸È"ÔM€HØ×!Ñ!Úð "ó €Hô �‰˜x¨Ó0€Há ‰7 j€DÜ�(Ôáð	PàOó	PØô �aŒ=ÜØØØØØØØô
‰ô Ø˜$ R¨d¸DÀtô
ˆð �-‰-šYˆ-Ó
'€Cà�‚{Ø�‰�QŒà€Jr7   c                 ó0  — t        | dddgd«       t        | j                  «      }|dv s
J d|› �«       ‚|dk(  r| j                  d«      } |€t	        |d
z  «      }|€|}d|cxk  r|k  sn J d|› d|› d�«       ‚d|cxk  r|k  sn J d|› d|› d�«       ‚| j                  d   }| j                  d   }t        «       rF|r(||dz  dz   k(  s9J dj                  |dz  dz   |«      «       ‚||k(  sJ dj                  ||«      «       ‚|�Gt        |j                  «      dk(  rt        |«      |k(  s…J dj                  ||j                  «      «       ‚| j                  t        j                  t        j                  fv rt        j                  nt        j                  }t        j                  |f|¬«      }||k  r>||z
  dz  }||z
  |z
  }t        j                  j                  j                  |||gd¬«      }| j!                  g d¢¬«      } |rdnd}|	r|rJ d«       ‚t#        | d	d|dd	¬«      }n;t%        |«      rJ d«       ‚|du r| d	d	…d	d	…d	|dz  dz   …f   } t'        | d	d|dd	¬«      }t        j(                  ||«      j!                  g d¢¬«      }t+        ||d¬ «      }t+        t        j,                  t        j(                  ||«      j                  d«      |dg¬!«      j!                  ddg¬«      |d¬ «      }|€!|r?|d	d	…|dz  |dz   …f   }||dz  |dz    }n |r|dz  }nd}|d	d	…|||z   …f   }||||z    }t        «       r:|j/                  «       j1                  «       j3                  «       d"k  rt5        d#«      ‚||z  }|dk(  r|j7                  d«       |S )$aò  
    Inverse short-time Fourier transform (ISTFT).

    Reconstruct time-domain signal from the giving complex input and window tensor when
    nonzero overlap-add (NOLA) condition is met:

    .. math::
        \sum_{t = -\infty}^{\infty} \text{window}^2[n - t \times H]\ \neq \ 0, \ \text{for } all \ n

    Where:
    - :math:`t`: The :math:`t`-th input window.
    - :math:`N`: Value of `n_fft`.
    - :math:`H`: Value of `hop_length`.

        Result of `istft` expected to be the inverse of `paddle.signal.stft`, but it is
        not guaranteed to reconstruct a exactly realizable time-domain signal from a STFT
        complex tensor which has been modified (via masking or otherwise). Therefore, `istft`
        gives the `[Griffin-Lim optimal estimate] <https://ieeexplore.ieee.org/document/1164317>`_
        (optimal in a least-squares sense) for the corresponding signal.

    Args:
        x (Tensor): The input data which is a 2-dimensional or 3-dimensional **complex**
            Tensor with shape `[..., n_fft, num_frames]`.
        n_fft (int): The size of Fourier transform.
        hop_length (int, optional): Number of steps to advance between adjacent windows
            from time-domain signal and `0 < hop_length < win_length`. Default: `None` (
            treated as equal to `n_fft//4`)
        win_length (int, optional): The size of window. Default: `None` (treated as equal
            to `n_fft`)
        window (Tensor, optional): A 1-dimensional tensor of size `win_length`. It will
            be center padded to length `n_fft` if `win_length < n_fft`. It should be a
            real-valued tensor if `return_complex` is False. Default: `None`(treated as
            a rectangle window with value equal to 1 of size `win_length`).
        center (bool, optional): It means that whether the time-domain signal has been
            center padded. Default: `True`.
        normalized (bool, optional): Control whether to scale the output by :math:`1/sqrt(n_{fft})`.
            Default: `False`
        onesided (bool, optional): It means that whether the input STFT tensor is a half
            of the conjugate symmetry STFT tensor transformed from a real-valued signal
            and `istft` will return a real-valued tensor when it is set to `True`.
            Default: `True`.
        length (int, optional): Specify the length of time-domain signal. Default: `None`(
            treated as the whole length of signal).
        return_complex (bool, optional): It means that whether the time-domain signal is
            real-valued. If `return_complex` is set to `True`, `onesided` should be set to
            `False` cause the output is complex.
        name (str, optional): The default value is None. Normally there is no need for user
            to set this property. For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A tensor of least squares estimation of the reconstructed signal(s) with shape
        `[..., seq_length]`

    Examples:
        .. code-block:: python

            >>> import numpy as np
            >>> import paddle
            >>> from paddle.signal import stft, istft

            >>> paddle.seed(0)

            >>> # STFT
            >>> x = paddle.randn([8, 48000], dtype=paddle.float64)
            >>> y = stft(x, n_fft=512)
            >>> print(y.shape)
            [8, 257, 376]

            >>> # ISTFT
            >>> x_ = istft(y, n_fft=512)
            >>> print(x_.shape)
            [8, 48000]

            >>> np.allclose(x, x_)
            True
    r   Ú	complex64Ú
complex128r   )r<   é   z<x should be a 2D or 3D complex tensor, but got rank of x is r<   r   Nr=   z'hop_length should be in (0, win_length(r?   r>   r@   r   éþÿÿÿr   zQfft_size should be equal to n_fft // 2 + 1({}) when onesided is True, but got {}.zIfft_size should be equal to n_fft({}) when onesided is False, but got {}.zZexpected a 1D window tensor of size equal to win_length({}), but got window with shape {}.rA   rB   rC   rI   rJ   rL   rM   zSonesided should be False when input(output of istft) or window is a complex Tensor.FrR   zGData type of window should not be complex when return_complex is False.)r   r"   r#   )r   Úrepeat_timesg•dyáý¥=zäAbort istft because Nonzero Overlap Add (NOLA) condition failed. For more information about NOLA constraint please see `scipy.signal.check_NOLA`(https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.check_NOLA.html).)r   rS   r-   rT   r,   r   Úformatr   rU   r   ri   r   rV   rW   rX   rD   rZ   r   r   r	   r[   r9   ÚtileÚabsÚminÚitemr*   r\   )r   r]   r"   r^   r_   r`   rb   rQ   ÚlengthÚreturn_complexr2   rc   Ún_framesÚfft_sizeÚwindow_dtyperd   re   rO   r5   Úwindow_envelopÚstarts                        r6   r   r   §  s]  € ôr ˜Q  k°<Ð%@À'ÔJä�—‘‹\€FØð ñ ð Oð 
FÀfÀXÐNóOð ð
 �‚{Ø�K‰K˜‹NˆàÐÜ˜ !™“_ˆ
àÐØˆ
ð 	
ˆJÔ$˜*Ô$ðWà	0°°¸LÈÈÐTUÐVóWØ$ð 	
ˆJÔ˜%ÔðMà	+¨E¨7°,¸z¸lÈ!ÐLóMØð �w‰w�r‰{€HØ�w‰w�r‰{€HäÔÙà˜E Q™J¨™NÒ*ðàb×iÑiØ˜‘
˜Q‘ óóØ*ð ˜EÒ!ðàZ×aÑaØ�xóóØ!ð
 Ðä�—‘Ó Ò"¤s¨6£{°jÒ'@ð	
àg×nÑnØ˜Ÿ™ó
ó	
Ø@ð �w‰wœ6Ÿ>™>¬6×+;Ñ+;Ð<Ñ<ô �NŠNä—‘ð 	ô
 —‘ J =¸ÔEˆà�EÒØ˜JÑ&¨1Ñ,ˆØ˜JÑ&¨Ñ1ˆ	ä—‘×%Ñ%×)Ñ)Ø˜ 9Ð-°Jð *ó 
ˆð 	
�‰Úð 	ó 	€Añ !‰7 j€Dááð	aà`ó	aØô ˜˜T¨°¸uÈ4ÔP‰äØô
ð 	UàTó	Uð 
ð �uÑØ’!’QÐ(˜% 1™* q™.Ð(Ð(Ñ)ˆAÜ˜˜T¨°¸uÈ4ÔPˆä
�/‰/˜#˜vÓ
&×
0Ñ
0Úð 1ó €Cô Ø
˜*¨2ô€Cô !Ü
�+‰+Ü�o‰o˜f fÓ-×7Ñ7¸Ó:Ø" A˜ô
÷ ‰)Ø�Q�ð ó 
ð Øô	€Nð €~ÙØ’a˜% 1™*¨%°1©*¨Ð5Ð5Ñ6ˆCØ+¨U°a©Z¸UÀa¹Z¸=ÐI‰NáØ˜Q‘J‰EàˆEà’!�U˜U V™^Ð+Ð+Ñ,ˆØ'¨°¸±Ð?ˆô Ô˜^×/Ñ/Ó1×5Ñ5Ó7×<Ñ<Ó>ÀÒFÜð só
ð 	
ð �Ñ
€Cà�‚{Ø�‰�QŒà€Jr7   )r   N)NNNTrF   FTN)	NNNTFTNFN)rU   r   Úpaddle.frameworkr   Úbase.data_feederr   Úbase.layer_helperr   Úfftr   r	   r
   Útensor.attributer   Ú__all__r   r9   r   r   © r7   r6   Ú<module>r�      s€   ðó Ý Ý ,å 6Ý *ß *Ñ *Ý (ð Øð€ópófbðP ØØØØØØØ	ónðh ØØØØØØØØ	ôXr7   