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