Gesture Recognition and Biometrics ElectroMyogram (GRABMyo) 1.1.0

File: <base>/grabmyo_convert_wfdb_to_mat.py (4,730 bytes)
"""
This script will read the .dat and .hea files downloaded locally to
to your hard drive. The downloaded files are organzied in 3 folders
'Session 1','Session 2' and 'Session 3'. Each folder contains 119 data
files (.dat) and 119 header files (.hea).

signal properties
total channels = 28 (16 forearm + 12 wrist)
sampling frequency = 2048 Hz
bandpass filtering (hardware) = 10Hz-500Hz


In order to run this script make sure the above three folders are and
a fileconversion function 'rdwfdb.m' are in the same directory


output %%%%%%%%%
Main Folder: 'Output BM'
Folders: 'Session 1_converted','Session 2_converted', 'Session 3_converted',
Each folder: 43 .mat files
VarOut: DATA_FOREARM, DATA_WRIST (7x17 cell matrices)
DATA_FOREARM: each cell: 5secs*sampfreq x Nchannels numeric array
DATA_WRIST: each cell: 5secs*sampfreq x Nchannels numeric array

Forearm Electrode Configuration %%%%%%%%%
 1  2  3  4  5  6  7  8
 9 10 11 12 13 14 15 16

Wrist Electrode Configuration %%%%%%%%%
 1  2  3  4  5  6
 7  8  9 10 11 12

Written by Ashirbad Pradhan
email: ashirbad.pradhan@uwaterloo.ca
"""

# Your Python code starts here


import sys
import os
import wfdb
from scipy.io import savemat

# Add paths for Session1, Session2, and Session3
session_paths = ['Session1', 'Session2', 'Session3']
for session_path in session_paths:
    sys.path.append(os.path.join(os.getcwd(), session_path))

# Obtain the total number of subjects
nsub = len(
    os.listdir(os.path.join(os.getcwd(), 'Session1'))) - 2  # Assuming number of subjects are the same in all sessions
nsession = 3
ngesture = 16  # Total number of gestures
ntrials = 7  # Total number of trials

# Define output folder
output_folder = 'Output BM'
if not os.path.exists(output_folder):
    os.mkdir(output_folder)
else:
    while True:
        print(f"Found existing folder in: {os.getcwd()}")
        cont = input("Overwrite it (Y/N)? ").upper()
        if cont in ('Y', 'N'):
            if cont == 'Y':
                print("Overwriting")
                import shutil

                shutil.rmtree(output_folder)
                os.mkdir(output_folder)
                break
            else:
                print("Exiting Script!")
                sys.exit()

import os
import numpy as np

foldername = []
filename = []
flag = 0
count = 0

# Define channel mappings for forearm and wrist
forearm_channels = np.concatenate((np.ones(8), np.ones(8), np.zeros(8), np.zeros(8)))
wrist_channels = np.concatenate(
    (np.zeros(8), np.zeros(8), np.zeros(1), np.ones(6), np.zeros(2), np.ones(6), np.zeros(1)))
indices = [i for i, x in enumerate(wrist_channels) if x == 1]
print(indices)
# Define data_forearm and data_wrist lists before the loop


# Create a 7x17 array of 2D matrices
matrices_forearm = np.empty((7, 17), dtype=object)
matrices_wrist = np.empty((7, 17), dtype=object)
# Populate each element with a 2D matrix (for demonstration, using zero data)
for i in range(7):
    for j in range(17):
        matrices_forearm[i, j] = np.zeros((10240, 16), dtype=np.float64)
        matrices_wrist[i, j] = np.zeros((10240, 12), dtype=np.float64)

foldername = []
filename = []
flag = 0
count = 0

for isession in range(1, nsession + 1):  # Total number of sessions per participant
    converted_folder = f"Session{isession}_converted"
    os.makedirs(os.path.join("Output BM", converted_folder), exist_ok=True)

    for isub in range(1, nsub + 1):
        foldername = f"session{isession}_participant{isub}"

        for igesture in range(1, ngesture + 2):  # +1 to include rest gesture
            for itrial in range(1, ntrials + 1):
                filename = f"session{isession}_participant{isub}_gesture{igesture}_trial{itrial}"
                filepath = os.path.join(os.getcwd(), f"Session{isession}", foldername, filename)

                # Load WFDB data
                record = wfdb.rdrecord(filepath)

                # Extract signals and other information
                data_emg = record.p_signal
                fs = record.fs

                # Extract forearm and wrist data based on channel mappings
                data_forearm = data_emg[:, forearm_channels.astype(bool)]
                data_wrist = data_emg[:, wrist_channels.astype(bool)]

                # Assuming DATA_FOREARM and DATA_WRIST are lists
                matrices_forearm[itrial - 1, igesture - 1] = data_forearm
                matrices_wrist[itrial - 1, igesture - 1] = data_wrist

        count += 1
        print(f"Converted: {count} of {nsub * nsession} files")
        # Create a dictionary to hold the data

        savemat(os.path.join("Output BM", converted_folder, f"{foldername}.mat"),
                {"DATA_FOREARM": matrices_forearm, "DATA_WRIST": matrices_wrist})