Source code for neurokit2.emg.emg_amplitude
# -*- coding: utf-8 -*-
import numpy as np
from ..signal import signal_filter
[docs]
def emg_amplitude(emg_cleaned):
    """**Compute electromyography (EMG) amplitude**
    Compute electromyography amplitude given the cleaned respiration signal, done by calculating the
    linear envelope of the signal.
    Parameters
    ----------
    emg_cleaned : Union[list, np.array, pd.Series]
        The cleaned electromyography channel as returned by ``emg_clean()``.
    Returns
    -------
    array
        A vector containing the electromyography amplitude.
    See Also
    --------
    emg_clean, emg_rate, emg_process, emg_plot
    Examples
    --------
    .. ipython:: python
      import neurokit2 as nk
      import pandas as pd
      emg = nk.emg_simulate(duration=10, sampling_rate=1000, burst_number=3)
      cleaned = nk.emg_clean(emg, sampling_rate=1000)
      amplitude = nk.emg_amplitude(cleaned)
      @savefig p_emg_amplitude1.png scale=100%
      fig = pd.DataFrame({"EMG": emg, "Amplitude": amplitude}).plot(subplots=True)
      @suppress
      plt.close()
    """
    tkeo = _emg_amplitude_tkeo(emg_cleaned)
    amplitude = _emg_amplitude_envelope(tkeo)
    return amplitude 
# =============================================================================
# Taeger-Kaiser Energy Operator
# =============================================================================
def _emg_amplitude_tkeo(emg_cleaned):
    """Calculates the Teager–Kaiser Energy operator to improve onset detection, described by Marcos Duarte at
    https://github.com/demotu/BMC/blob/master/notebooks/Electromyography.ipynb.
    Parameters
    ----------
    emg_cleaned : Union[list, np.array, pd.Series]
        The cleaned electromyography channel as returned by `emg_clean()`.
    Returns
    -------
    tkeo : array
        The emg signal processed by the Teager–Kaiser Energy operator.
    References
    ----------
    - BMCLab: https://github.com/demotu/BMC/blob/master/notebooks/Electromyography.ipynb
    - Li, X., Zhou, P., & Aruin, A. S. (2007). Teager–Kaiser energy operation of surface EMG improves
    muscle activity onset detection. Annals of biomedical engineering, 35(9), 1532-1538.
    """
    tkeo = emg_cleaned.copy()
    # Teager–Kaiser Energy operator
    tkeo[1:-1] = emg_cleaned[1:-1] * emg_cleaned[1:-1] - emg_cleaned[:-2] * emg_cleaned[2:]
    # Correct the data in the extremities
    tkeo[0], tkeo[-1] = tkeo[1], tkeo[-2]
    return tkeo
# =============================================================================
# Linear Envelope
# =============================================================================
def _emg_amplitude_envelope(
    emg_cleaned, sampling_rate=1000, lowcut=10, highcut=400, envelope_filter=8
):
    """Calculate the linear envelope of a signal.
    This function implements a 2nd-order Butterworth filter with zero lag, described by Marcos Duarte
    at <https://github.com/demotu/BMC/blob/master/notebooks/Electromyography.ipynb>.
    Parameters
    ----------
    emg_cleaned : Union[list, np.array, pd.Series]
        The cleaned electromyography channel as returned by `emg_clean()`.
    sampling_rate : int
        The sampling frequency of `emg_signal` (in Hz, i.e., samples/second).
    lowcut : float
        Low-cut frequency for the band-pass filter (in Hz). Defaults to 10Hz.
    highcut : float
        High-cut frequency for the band-pass filter (in Hz). Defaults to 400Hz.
    envelope_filter : float
        Cuttoff frequency for the high-pass filter (in Hz). Defauts to 8Hz.
    Returns
    -------
    envelope : array
        The linear envelope of the emg signal.
    References
    ----------
    - BMCLab: https://github.com/demotu/BMC/blob/master/notebooks/Electromyography.ipynb
    """
    filtered = signal_filter(
        emg_cleaned,
        sampling_rate=sampling_rate,
        lowcut=lowcut,
        highcut=highcut,
        method="butterworth",
        order=2,
    )
    envelope = np.abs(filtered)
    envelope = signal_filter(
        envelope,
        sampling_rate=sampling_rate,
        lowcut=None,
        highcut=envelope_filter,
        method="butterworth",
        order=2,
    )
    return envelope