.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/08_simulate_intramuscular_emg.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_08_simulate_intramuscular_emg.py: Intramuscular EMG Signals ======================== This example demonstrates how to simulate **intramuscular EMG signals** using needle electrodes. It shows the complete pipeline from muscle model creation to EMG signal generation with realistic noise and motor unit detectability. .. note:: **Intramuscular EMG** (iEMG) is recorded using needle electrodes inserted directly into the muscle tissue. This provides high spatial resolution and allows for the detection of individual motor unit action potentials (MUAPs). Unlike surface EMG, intramuscular recordings can capture the activity of deeper motor units and provide better selectivity. Key Features: - **High spatial resolution**: Needle electrodes can detect individual MUAPs - **Deep muscle access**: Can record from muscles not accessible by surface electrodes - **Motor unit discrimination**: Individual motor units can be identified and tracked - **Realistic noise modeling**: Includes physiological noise and recording artifacts .. GENERATED FROM PYTHON SOURCE LINES 22-23 .. code-block:: Python :dedent: 1 .. GENERATED FROM PYTHON SOURCE LINES 25-27 Import Libraries ---------------- .. GENERATED FROM PYTHON SOURCE LINES 27-38 .. code-block:: Python import joblib import matplotlib import matplotlib.pyplot as plt import numpy as np import seaborn as sns from myogen import simulator from myogen.utils.currents import create_sinusoidal_current from myogen.utils.plotting.spikes import plot_spike_trains .. GENERATED FROM PYTHON SOURCE LINES 39-42 Define Parameters ----------------- .. GENERATED FROM PYTHON SOURCE LINES 42-51 .. code-block:: Python # Simulation parameters N_motor_units = 25 # Smaller number for faster computation recruitment_range = 50.0 # Electrode parameters inter_electrode_distance = 0.5 # mm electrode_position = (0.0, 0.0, 0.0) # mm (start of muscle) .. GENERATED FROM PYTHON SOURCE LINES 52-56 Generate Motor Unit Recruitment Thresholds ------------------------------------------- First, we generate the **recruitment thresholds** for the motor unit pool. .. GENERATED FROM PYTHON SOURCE LINES 56-69 .. code-block:: Python thresholds, _ = simulator.generate_mu_recruitment_thresholds( N=N_motor_units, recruitment_range__ratio=recruitment_range, deluca__slope=5, mode="combined", ) plt.figure() plt.plot(thresholds, "o") plt.tight_layout() plt.show() .. image-sg:: /auto_examples/images/sphx_glr_08_simulate_intramuscular_emg_001.png :alt: 08 simulate intramuscular emg :srcset: /auto_examples/images/sphx_glr_08_simulate_intramuscular_emg_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 70-74 Load Muscle Model ------------------- Load the **muscle model** with the generated recruitment thresholds. .. GENERATED FROM PYTHON SOURCE LINES 74-78 .. code-block:: Python muscle = joblib.load("results/muscle_model.pkl") muscle.length__mm = 30 .. GENERATED FROM PYTHON SOURCE LINES 79-83 Create Intramuscular Electrode Array ------------------------------------ Set up a **differential needle electrode** for intramuscular recordings. .. GENERATED FROM PYTHON SOURCE LINES 83-94 .. code-block:: Python electrode = simulator.IntramuscularElectrodeArray( num_electrodes=4, inter_electrode_distance__mm=inter_electrode_distance, differentiation_mode="consecutive", position__mm=electrode_position, orientation__rad=(-np.pi / 2, 0, -np.pi / 2), # perpendicular to muscle trajectory_distance__mm=0.125, # mm trajectory_steps=1, # number of steps ) .. GENERATED FROM PYTHON SOURCE LINES 95-99 Initialize Intramuscular EMG Simulator -------------------------------------- Create the **intramuscular EMG simulator** with the muscle model and electrode. .. GENERATED FROM PYTHON SOURCE LINES 99-107 .. code-block:: Python print("Initializing iEMG simulator...") iemg_sim = simulator.IntramuscularEMG( muscle_model=muscle, electrode_array=electrode, MUs_to_simulate=list(range(0, N_motor_units, 3)), ) .. rst-class:: sphx-glr-script-out .. code-block:: none Initializing iEMG simulator... .. GENERATED FROM PYTHON SOURCE LINES 108-112 Calculate Motor Unit Action Potentials -------------------------------------- Compute the **MUAPs** for each motor unit at the electrode positions. .. GENERATED FROM PYTHON SOURCE LINES 112-119 .. code-block:: Python print("Computing motor unit action potentials...") iemg_sim.simulate_muaps() print(f" - Generated MUAPs for {N_motor_units} motor units") print(f" - Electrode array with {electrode.num_electrodes} electrodes") .. rst-class:: sphx-glr-script-out .. code-block:: none Computing motor unit action potentials... Creating motor unit simulators: 0%| | 0/9 [00:00` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: 08_simulate_intramuscular_emg.py <08_simulate_intramuscular_emg.py>` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: 08_simulate_intramuscular_emg.zip <08_simulate_intramuscular_emg.zip>` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_