# -*- coding: utf-8 -*-
"""
biosppy.features.time_freq
--------------------------
This module provides methods to extract time-frequency features using
discrete wavelet decomposition.
:copyright: (c) 2015-2023 by Instituto de Telecomunicacoes
:license: BSD 3-clause, see LICENSE for more details.
"""
# Imports
# 3rd party
import numpy as np
import pywt
# local
from .. import utils
from ..signals import tools as st
[docs]def time_freq(signal=None, wavelet="db4", level=5):
"""Compute statistical metrics over the signal discrete wavelet transform
approximation and detail coefficients.
Parameters
----------
signal : array
Input signal.
wavelet: str
Type of wavelet. Default is db4 (Daubechies 4).
level: int
Decomposition level. Default is 5.
Returns
-------
dwt_app_{metric} : float
Statistical metrics over the approximation coefficients.
dwt_det{level}_{metric} : float
Statistical metrics over the detail coefficients at the specified level.
Notes
-----
Check biosppy.signals.tools.signal_stats for the list of available metrics.
"""
# check inputs
if signal is None:
raise TypeError("Please specify an input signal.")
# ensure numpy
signal = np.array(signal)
# initialize output
feats = utils.ReturnTuple((), ())
# compute wavelet
coeffs = compute_wavelet(signal=signal, wavelet=wavelet, level=level)
# compute stats
for coeff, coeff_name in zip(coeffs, coeffs.keys()):
signal_feats = st.signal_stats(coeff)
for stat_value, stat_name in zip(signal_feats, signal_feats.keys()):
feats = feats.append(stat_value, coeff_name + '_' + stat_name)
return feats
[docs]def compute_wavelet(signal=None, wavelet="db4", level=5):
"""Compute the approximation and highest detail coefficients of the signal
using the discrete wavelet transform.
Parameters
----------
signal : array
Input signal.
wavelet: str
Type of wavelet.
level: int
Decomposition level
Returns
-------
dwt_app : array
Approximation coefficients.
dwt_det{level} : array
Detail coefficients at the specified level.
"""
# check inputs
if signal is None:
raise TypeError("Please specify an input signal.")
# ensure numpy
signal = np.array(signal)
# wavelets
dwt_det = pywt.downcoef("d", signal, wavelet, level)
dwt_app = pywt.downcoef("a", signal, wavelet, level)
# output
args = (dwt_app, dwt_det)
names = ("dwt_app", f"dwt_det{level}")
return utils.ReturnTuple(args, names)