U
    ?h#                     @   s   d dl mZmZ ddlmZmZmZmZ ddlm	Z	m
Z
 dgZd dlZzd dlZejZejZW nP ek
r   zd dlZejZejZW n" ek
r   ejZdd ZY nX Y nX dddZdS )    )floorceil   )DiscreteContinuousWaveletContinuousWaveletWavelet_check_dtype)integrate_waveletscale2frequencycwtNc                 C   s   dt t|  S )a  Round up size to the nearest power of two.

            Given a number of samples `n`, returns the next power of two
            following this number to take advantage of FFT speedup.
            This fallback is less efficient than `scipy.fftpack.next_fast_len`
               )r   nplog2)n r   ;/var/www/html/venv/lib/python3.8/site-packages/pywt/_cwt.pynext_fast_len   s    r         ?convc                 C   s  t | }tj| |d} t|tj}t|ttfs:t|}t	|rPt
|g}t	|sdtd|jrn|n|}tjt|f| j |d}	d}
t||
d\}}|jrt|n|}|jjdkr|n|}tj||d}tj|| jjd}|dkrd}d}n|d	kstd
| jdkr@| d|} | j}| d| jd f} t|D ]6\}}|d |d  }t||d |d   d ||  }|t}|d |jkrt||jk |}|| ddd }|d	krT| jdkrt| |}nht| j}|d  |jd 7  < t |}tj||d}t!| jd D ]"}t| | |||ddf< q.nxt"| jd |j d }||krt#j$| |dd}|}t#j$||dd}t#j%|| dd}|dd| jd |j d f }t&| tj'|dd }|	jjdkr|j}|jd | jd  d }|dkr8|dt(|t)| f }n|dk rPtd*|| jdkrr||}||d}||	|df< qHt+|||
}t	|rt
|g}|| }|	|fS )aH  
    cwt(data, scales, wavelet)

    One dimensional Continuous Wavelet Transform.

    Parameters
    ----------
    data : array_like
        Input signal
    scales : array_like
        The wavelet scales to use. One can use
        ``f = scale2frequency(wavelet, scale)/sampling_period`` to determine
        what physical frequency, ``f``. Here, ``f`` is in hertz when the
        ``sampling_period`` is given in seconds.
    wavelet : Wavelet object or name
        Wavelet to use
    sampling_period : float
        Sampling period for the frequencies output (optional).
        The values computed for ``coefs`` are independent of the choice of
        ``sampling_period`` (i.e. ``scales`` is not scaled by the sampling
        period).
    method : {'conv', 'fft'}, optional
        The method used to compute the CWT. Can be any of:
            - ``conv`` uses ``numpy.convolve``.
            - ``fft`` uses frequency domain convolution.
            - ``auto`` uses automatic selection based on an estimate of the
              computational complexity at each scale.

        The ``conv`` method complexity is ``O(len(scale) * len(data))``.
        The ``fft`` method is ``O(N * log2(N))`` with
        ``N = len(scale) + len(data) - 1``. It is well suited for large size
        signals but slightly slower than ``conv`` on small ones.
    axis: int, optional
        Axis over which to compute the CWT. If not given, the last axis is
        used.

    Returns
    -------
    coefs : array_like
        Continuous wavelet transform of the input signal for the given scales
        and wavelet. The first axis of ``coefs`` corresponds to the scales.
        The remaining axes match the shape of ``data``.
    frequencies : array_like
        If the unit of sampling period are seconds and given, than frequencies
        are in hertz. Otherwise, a sampling period of 1 is assumed.

    Notes
    -----
    Size of coefficients arrays depends on the length of the input array and
    the length of given scales.

    Examples
    --------
    >>> import pywt
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> x = np.arange(512)
    >>> y = np.sin(2*np.pi*x/32)
    >>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
    >>> plt.matshow(coef) # doctest: +SKIP
    >>> plt.show() # doctest: +SKIP
    ----------
    >>> import pywt
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> t = np.linspace(-1, 1, 200, endpoint=False)
    >>> sig  = np.cos(2 * np.pi * 7 * t) + np.real(np.exp(-7*(t-0.4)**2)*np.exp(1j*2*np.pi*2*(t-0.4)))
    >>> widths = np.arange(1, 31)
    >>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
    >>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
    ...            vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())  # doctest: +SKIP
    >>> plt.show() # doctest: +SKIP
    )dtypezaxis must be a scalar.
   )	precisioncfftr   Nr   zmethod must be 'conv' or 'fft'r   r   )axis.g       @zSelected scale of {} too small.),r   r   ZasarrayZresult_typeZ	complex64
isinstancer   r   r   ZisscalararrayZ	AxisErrorZcomplex_cwtemptysizeshaper	   Zconjr   kindreal
ValueErrorndimZswapaxesZreshape	enumerateZarangeZastypeintextractZconvolvelisttupleranger   	fftmoduler   Zifftsqrtdiffr   r   formatr
   )datascalesZwaveletZsampling_periodmethodr   dtZdt_cplxZdt_outoutr   Zint_psixZdt_psiZsize_scale0Zfft_dataZdata_shape_preiscalestepjZint_psi_scaler   Z
conv_shaper   Z
size_scaleZfft_wavZcoefdZfrequenciesr   r   r   r   %   s    L



&


"
 


)r   r   r   )mathr   r   Z_extensions._pywtr   r   r   r   Z
_functionsr	   r
   __all__numpyr   Z	scipy.fftZscipyr   r+   r   ImportErrorZscipy.fftpackZfftpackr   r   r   r   r   <module>   s"   


