skills/neurokit2/references/emg.md
Checked 2026-07-23 against NeuroKit2 0.2.13 stable runtime/source, the official EMG API, and human surface-EMG guidance.
Record muscle and task, electrode type/size/orientation/inter-electrode distance, reference, skin preparation, amplifier gain/range, hardware filters, unit, sampling rate, synchronization, posture/contraction, and artifact annotations. Follow a muscle-specific placement protocol such as SENIAM when applicable.
EMG amplitude depends on geometry, subcutaneous tissue, cross-talk, electrode contact, hardware, and contraction history. It is not a direct universal force scale.
signals, info = nk.emg_process(emg, sampling_rate=1000)
Pinned 0.2.13 default columns:
EMG_Raw, EMG_Clean, EMG_Amplitude,
EMG_Activity, EMG_Onsets, EMG_Offsets
info contained event-level EMG_Activity, EMG_Onsets, EMG_Offsets, and
sampling_rate. This is a default observation, not a universal schema.
clean = nk.emg_clean(emg, sampling_rate=1000, method="biosppy")
amplitude = nk.emg_amplitude(clean)
Important stable details:
emg_clean() currently offers biosppy and none.emg_amplitude() takes only the cleaned vector; it has no sampling_rate argument
in 0.2.13.A 100 Hz high-pass may be unsuitable for some surface-EMG endpoints and impossible at low sampling rates. Do not treat the package default as a universal acquisition standard. Set sampling rate above twice the highest retained frequency with transition band margin; surface EMG is commonly acquired around 1000–2000 Hz, but the study, hardware, muscle, and endpoint determine requirements.
Stable signature:
emg_activation(
emg_amplitude=None, emg_cleaned=None, sampling_rate=1000,
method="threshold", threshold="default", duration_min="default",
size=None, threshold_size=None, **kwargs
)
Use the correct input for the method:
threshold or mixture: pass emg_amplitude;pelt, biosppy, or silva: pass emg_cleaned.activity_signals, activity_info = nk.emg_activation(
emg_amplitude=amplitude,
sampling_rate=1000,
method="threshold",
threshold="default",
duration_min=0.05,
)
Return order is (activity_signals, info). The DataFrame has same-length
EMG_Activity, EMG_Onsets, and EMG_Offsets; the dict contains event indices.
duration_min is seconds. size semantics are method-specific.
Automatic thresholds are hypotheses, not ground truth. Tune/validate on independent labeled contractions or a prespecified baseline. Report threshold, window, smoothing, minimum duration, and false/missed activation performance.
Inspect and annotate:
Do not interpolate across a burst or activation onset. Segment long gaps, preserve a validity mask, and reject affected trials/windows under prespecified rules. Filtering cannot establish that a deflection came from the target muscle.
epochs = nk.epochs_create(
signals,
events,
sampling_rate=1000,
epochs_start=-0.1,
epochs_end=1.0,
baseline_correction=False,
)
event_features = nk.emg_eventrelated(epochs)
interval_features = nk.emg_intervalrelated(signals)
Documented event-related features include EMG_Activation,
EMG_Amplitude_Mean, EMG_Amplitude_Max, EMG_Amplitude_SD,
EMG_Amplitude_Max_Time, and EMG_Bursts. Interval analysis returns
EMG_Activation_N and EMG_Amplitude_Mean in the pinned official example.
Columns are conditional; inspect output.
For startle or rapid onset work, hardware latency, synchronization, filter group delay, rectification/smoothing, and onset-definition error can dominate the result.
Raw/envelope amplitude is usually not comparable across participants or sessions. Possible denominators include MVC, reference contraction, or within-participant standardization, but each changes the estimand.
If using MVC:
Normalization does not make electrode/site differences disappear.
NeuroKit2 EMG can support research on amplitude and detected activity. It does not provide validated motor-unit decomposition, neuromuscular diagnosis, fatigue monitoring, prosthetic control safety, rehabilitation decisions, or sleep scoring. Those require endpoint-specific acquisition, algorithms, standards, and independent validation.