Source code for features.hjorth_raw

"""
Reference:  B Hjorth
            EEG analysis based on time domain properties
            Electroencephalogr Clin Neurophysiol. 1970 Sep;29(3):306-10.
            DOI: 10.1016/0013-4694(70)90143-4
"""

from typing import TYPE_CHECKING
import numpy as np
from collections.abc import Sequence

from py_neuromodulation.utils.types import NMFeature

if TYPE_CHECKING:
    from py_neuromodulation import NMSettings


[docs] class Hjorth(NMFeature): def __init__( self, settings: "NMSettings", ch_names: Sequence[str], sfreq: float ) -> None: self.ch_names = ch_names
[docs] def calc_feature(self, data: np.ndarray) -> dict: var = np.var(data, axis=-1) deriv1 = np.diff(data, axis=-1) deriv2 = np.diff(deriv1, axis=-1) deriv1_var = np.var(deriv1, axis=-1) deriv2_var = np.var(deriv2, axis=-1) deriv1_mobility = np.sqrt(deriv2_var / deriv1_var) activity = np.nan_to_num(var) mobility = np.nan_to_num(np.sqrt(deriv1_var / var)) complexity = np.nan_to_num(deriv1_mobility / mobility) feature_results = {} for ch_idx, ch_name in enumerate(self.ch_names): feature_results[f"{ch_name}_RawHjorth_Activity"] = activity[ch_idx] feature_results[f"{ch_name}_RawHjorth_Mobility"] = mobility[ch_idx] feature_results[f"{ch_name}_RawHjorth_Complexity"] = complexity[ch_idx] return feature_results
class Raw(NMFeature): def __init__( self, settings: "NMSettings", ch_names: Sequence[str], sfreq: float ) -> None: self.ch_names = ch_names def calc_feature(self, data: np.ndarray) -> dict: feature_results = {} for ch_idx, ch_name in enumerate(self.ch_names): feature_results["_".join([ch_name, "raw"])] = data[ch_idx, -1] return feature_results