Source code for dispel.providers.generic.tremor
"""Specific functionality for signal processing of the tremor detection."""
from typing import List, Optional
from dispel.processing import ProcessingStep
from dispel.processing.level import LevelFilterType, ProcessingStepGroup
from dispel.processing.modalities import SensorModality
from dispel.processing.transform import Add, Apply
from dispel.providers.generic.sensor import (
ExtractAverageSignalEnergy,
ExtractPowerSpectrumMeasures,
)
from dispel.signal.core import euclidean_norm, uniform_power_spectrum
[docs]
class PowerSpectrumDensity(Apply):
"""A transform step to compute the power spectrum of a signal.
Parameters
----------
data_set_id
The data set id on which the transformation is to be performed.
columns
The columns onto which the signal's tremor filter is applied.
new_data_set_id
The new ``id`` used for the :class:`~dispel.data.raw.RawDataSetDefinition`
.
level_filter
An optional :class:`~dispel.processing.level.LevelFilter` to determine
the levels to be transformed.
"""
[docs]
def __init__(
self,
data_set_id: str,
columns: Optional[List[str]] = None,
new_data_set_id: Optional[str] = None,
level_filter: Optional[LevelFilterType] = None,
):
columns = columns or list("xyz")
super().__init__(
data_set_id=data_set_id,
method=uniform_power_spectrum,
columns=columns,
new_data_set_id=new_data_set_id,
level_filter=level_filter,
)
[docs]
class TremorMeasures(ProcessingStepGroup):
r"""A group of tremor processing steps according a given data set.
Parameters
----------
sensor
The type of sensor on which the extraction is to be performed.
data_set_id
The data set id on which the transformation is to be performed ('accelerometer',
'gyroscope').
columns
The columns onto which the signal's tremor measures are to be extracted.
lower_bound
The lower bound of frequencies below which the signal is filtered.
upper_bound
The upper bound of frequencies above which the signal is filtered.
level_filter
An optional :class:`~dispel.processing.level.LevelFilter` to determine the levels
to be transformed. If no filter is provided, all levels will be transformed. The
``level_filter`` also accepts :class:`str`, :class:`~dispel.data.core.LevelId`\ s
and lists of either and passes them to a
:class:`~dispel.processing.level.LevelIdFilter` for convenience.
add_norm
An optional boolean to determine if the norm should be added to the columns.
Notes
-----
The lower and upper bound of the band filter values are set by default to 2.0 and
5.0.
"""
[docs]
def __init__(
self,
sensor: SensorModality,
data_set_id: str,
lower_bound: float = 2.0,
upper_bound: float = 5.0,
add_norm: bool = True,
add_average_signal: bool = True,
columns: Optional[List[str]] = None,
level_filter: Optional[LevelFilterType] = None,
):
# initialize the columns if they are not specified
columns = columns or list("xyz")
# initialize processing steps
steps: List[ProcessingStep] = []
# Define a new data set id specific to the power spectrum measures
power_spectrum_id = data_set_id
# Optional addition of the norm
if add_norm:
add_euclidean_norm = Add(
data_set_id=data_set_id, method=euclidean_norm, columns=columns
)
steps.append(add_euclidean_norm)
power_spectrum_id = add_euclidean_norm.new_data_set_id
all_columns = [*columns, "".join(columns)]
else:
all_columns = columns
# PSD Transformation
psd_step = PowerSpectrumDensity(
data_set_id=power_spectrum_id,
columns=all_columns,
)
steps.append(psd_step)
power_spectrum_id = psd_step.new_data_set_id
# Extraction
if add_average_signal:
steps.append(
ExtractAverageSignalEnergy(
sensor=sensor,
data_set_id=data_set_id,
columns=columns,
)
)
steps.append(
ExtractPowerSpectrumMeasures(
sensor=sensor,
data_set_id=power_spectrum_id,
columns=all_columns,
lower_bound=lower_bound,
upper_bound=upper_bound,
)
)
super().__init__(steps, level_filter=level_filter)