Source code for neurokit2.emg.emg_clean
# -*- coding: utf-8 -*-
from warnings import warn
import numpy as np
import pandas as pd
import scipy.signal
from ..misc import NeuroKitWarning, as_vector
from ..signal import signal_detrend
[docs]
def emg_clean(emg_signal, sampling_rate=1000, method="biosppy"):
"""**Preprocess an electromyography (emg) signal**
Clean an EMG signal using a set of parameters. Only one method is available at the moment.
* **BioSPPy**: fourth order 100 Hz highpass Butterworth filter followed by a constant
detrending.
Parameters
----------
emg_signal : Union[list, np.array, pd.Series]
The raw EMG channel.
sampling_rate : int
The sampling frequency of ``emg_signal`` (in Hz, i.e., samples/second).
Defaults to 1000.
method : str
The processing pipeline to apply. Can be one of ``"biosppy"`` or ``"none"``.
Defaults to ``"biosppy"``. If ``"none"`` is passed, the raw signal will be returned without
any cleaning.
Returns
-------
array
Vector containing the cleaned EMG signal.
See Also
--------
emg_amplitude, emg_process, emg_plot
Examples
--------
.. ipython:: python
import pandas as pd
import neurokit2 as nk
emg = nk.emg_simulate(duration=10, sampling_rate=1000)
signals = pd.DataFrame({"EMG_Raw": emg, "EMG_Cleaned":nk.emg_clean(emg, sampling_rate=1000)})
@savefig p_emg_clean1.png scale=100%
fig = signals.plot()
@suppress
plt.close()
"""
emg_signal = as_vector(emg_signal)
# Missing data
n_missing = np.sum(np.isnan(emg_signal))
if n_missing > 0:
warn(
"There are " + str(n_missing) + " missing data points in your signal."
" Filling missing values by using the forward filling method.",
category=NeuroKitWarning,
)
emg_signal = _emg_clean_missing(emg_signal)
method = str(method).lower()
if method in ["none"]:
clean = emg_signal
elif method in ["biosppy"]:
clean = _emg_clean_biosppy(emg_signal, sampling_rate=sampling_rate)
else:
raise ValueError(
"NeuroKit error: emg_clean(): 'method' should be one of 'biosppy' or 'none'."
)
return clean
# =============================================================================
# Handle missing data
# =============================================================================
def _emg_clean_missing(emg_signal):
emg_signal = pd.DataFrame.pad(pd.Series(emg_signal))
return emg_signal
# =============================================================================
# BioSPPy
# =============================================================================
def _emg_clean_biosppy(emg_signal, sampling_rate=1000):
# Parameters
order = 4
frequency = 100
frequency = (
2 * np.array(frequency) / sampling_rate
) # Normalize frequency to Nyquist Frequency (Fs/2).
# Filtering
b, a = scipy.signal.butter(N=order, Wn=frequency, btype="highpass", analog=False)
filtered = scipy.signal.filtfilt(b, a, emg_signal)
# Baseline detrending
clean = signal_detrend(filtered, order=0)
return clean