Source code for syncopy.specest.wavelet

# -*- coding: utf-8 -*-
#
# Time-frequency analysis with wavelets
#

# Builtin/3rd party package imports
import numpy as np
import logging
import platform

# Local imports
from syncopy.specest.wavelets import cwt


[docs]def wavelet(data_arr, samplerate, scales, wavelet): """ Perform time-frequency analysis on multi-channel time series data using a wavelet transform Parameters ---------- data_arr : 2D :class:`numpy.ndarray` Uniformly sampled multi-channel time-series The 1st dimension is interpreted as the time axis samplerate : float Samplerate of `data_arr` in Hz scales : 1D :class:`numpy.ndarray` Set of scales to use in wavelet transform. wavelet : callable Wavelet function to use, one of :data:`~syncopy.specest.const_def.availableWavelets` Returns ------- spec : :class:`numpy.ndarray` Complex time-frequency representation of the input data. Shape is (len(scales),) + data_arr.shape """ logger = logging.getLogger("syncopy_" + platform.node()) logger.debug( f"Running wavelet transform on data with shape {data_arr.shape} and samplerate {samplerate}." ) spec = cwt(data_arr, wavelet=wavelet, widths=scales, dt=1 / samplerate, axis=0) return spec
[docs]def get_optimal_wavelet_scales(scale_from_period, nSamples, dt, dj=0.25, s0=None): """ Local helper to compute an "optimally spaced" set of scales for wavelet analysis Parameters ---------- scale_from_period : func Function to convert periods to Wavelet specific scales. nSamples : int Sample-count (i.e., length) of time-series that is analyzed dt : float Time-series step-size; temporal spacing between consecutive samples (1 / sampling rate) dj : float Spectral resolution of scales. The choice of `dj` depends on the spectral width of the employed wavelet function. For instance, ``dj = 0.5`` is the largest value that still yields adequate sampling in scale for the Morlet wavelet. Other wavelets allow larger values of `dj` while still providing sufficient spectral resolution. Small values of `dj` yield finer scale resolution. s0 : float or None Smallest resolvable scale; should be chosen such that the equivalent Fourier period is approximately ``2 * dt``. If `None`, `s0` is computed to satisfy this criterion. Returns ------- scales : 1D :class:`numpy.ndarray` Set of scales to use in the wavelet transform, ordered from high(low) scale(frequency) to low(high) scale(frequency) Notes ----- The calculation of an "optimal" set of scales follows [ToCo98]_. This routine is a local auxiliary method that is purely intended for internal use. Thus, no error checking is performed. .. [ToCo98] C. Torrence and G. P. Compo. A Practical Guide to Wavelet Analysis. Bulletin of the American Meteorological Society. Vol. 79, No. 1, January 1998. See also -------- syncopy.specest.wavelet.wavelet : :meth:`~syncopy.shared.computational_routine.ComputationalRoutine.computeFunction` performing time-frequency analysis using non-orthogonal continuous wavelet transform """ # Compute `s0` so that the equivalent Fourier period is approximately ``2 * dt``` if s0 is None: s0 = scale_from_period(2 * dt) # Largest scale J = int((1 / dj) * np.log2(nSamples * dt / s0)) scales = s0 * 2 ** (dj * np.arange(0, J + 1)) # we want the low frequencies first return scales[::-1]