关于肌电#信号处理#的问题,如何解决?

在PhySioNet下载了一个肌电数据库,注释文件看不懂是哪个部位的肌电,求解一般用的是哪个部位的肌电做的信号处理。
数据库连接:https://www.physionet.org/content/semg/1.0.0/
头文件:

img

我查看了PhySioNet提供的SEMGenerators数据库,它包含的299个样本是上肢肌电信号,采集部位主要在上臂的肱三头肌和肱二头肌。
上肢肌肉的肌电信号处理工作很多,主要有:

  1. 肌电控制的 prosthetic 手臂系统。通过识别不同的上肢肌肉活动,控制手臂的运动。
  2. 肌电信号的模式识别。识别不同的手部姿态和运动模式,可以用于控制机器人手等。
  3. 肌萎缩和疼痛检测。检测上肢肌电信号的变化,用于帕金森病和肌肉疼痛的检测与诊断。
  4. 人机交互。使用肌电传感器采集上肢的肌电信号,通过信号处理完成对外设的控制,实现无接触的人机交互。
    所以,使用这份数据库进行的研究,很有可能是基于上肢的肌电信号处理与控制方面的工作。
    该数据库提供的头文件semg.hea包含了信号的具体采集信息:
  • 采集部位:肱三头肌和肱二头肌
  • 采集频率:2048 Hz
  • 传感器类型:双极肌电传感器,直径1cm,间距3cm
  • AD转换:16位

肌电信号的数据理解

function NinaproMatrix = LoadNinaproDB( DataPath )
%Parameters:
%   DataPath: 原始数据路径
%Returns:
%   NinaproMatrix: 返回切割好的steady数据
%   NinaproTransientMatrix: 返回切割好的transient数据
NinaproMatrix = cell(1,27);
SubjectNum = 27;
 
%% 从每个subject的目录中读取三个exercise,并将数据和标签对照着取出来
for k = 1:SubjectNum
    CharSubject = ['s' num2str(k)];
    UpperSubject = upper(CharSubject);
    % 读取第一个Exercise
    FileName_E1 = [UpperSubject '_A1_E1.mat'];
    FileLocation_E1 = fullfile(DataPath, CharSubject, FileName_E1);
    load(FileLocation_E1);
    emg_E1 = emg;
    restimulus_E1 = restimulus;
    stimulus_E1 = stimulus;
    % 读取第二个Exercise
    FileName_E2 = [UpperSubject '_A1_E2.mat'];
    FileLocation_E2 = fullfile(DataPath, CharSubject, FileName_E2);
    load(FileLocation_E2);
    emg_E2 = [emg_E1;emg];
    for i=1:length(restimulus)
        if(restimulus(i) ~= 0)
            restimulus(i) = restimulus(i) + 12; % 从index=13开始
        end
    end
    restimulus_E2 = [restimulus_E1; restimulus];
    stimulus_E2 = [stimulus_E1;stimulus];
    % 读取第三个Exercise
    FileName_E3 = [UpperSubject '_A1_E3.mat'];
    FileLocation_E3 = fullfile(DataPath, CharSubject, FileName_E3);
    load(FileLocation_E3);
    emg_E3 = [emg_E2;emg];
    for i=1:length(restimulus)
        if(restimulus(i) ~= 0)
            restimulus(i) = restimulus(i) + 29; % 从index=30开始
        end
    end
    restimulus_E3 = [restimulus_E2;restimulus];
    stimulus_E3 = [stimulus_E2; stimulus];
    % 变换名称
    emg = emg_E3;
    restimulus = restimulus_E3;
    NumChannels = size(emg,2);   %通道数量
    NinaproMatrix{1,k} = restimulus; % cell的第一行表示label
    NinaproMatrix{2,k} = emg; % cell的第二行表示data
end

可以借鉴下
https://blog.csdn.net/zhangyuezjut/article/details/112834219

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
肌电信号是由肌纤维收缩所产生的电信号。肌电信号的处理通常分为预处理和特征提取两个部分。预处理包括滤波、去趋势、归一化等操作,目的是去除信号中的噪声和冗余信息。特征提取是对处理后的信号进行数学分析,提取出一些对于后续分析和应用有意义的特征,比如幅值、频率、时域参数和频域参数等。

对于使用的肌肉部位,一般在注释文件中会标注,但如果注释文件看不懂或者没有标注,我们可以参考文献中使用的部位或者肌肉生理学知识来确定。在数据处理之前,需要对数据进行预处理,包括滤波、去趋势、归一化等操作。下面是一个简单的肌电信号预处理的Python代码示例:

import numpy as np
from scipy.signal import butter, filtfilt

def butter_bandpass(lowcut, highcut, fs, order=4):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return b, a

def filter_emg(emg, lowcut, highcut, fs):
    b, a = butter_bandpass(lowcut, highcut, fs, order=4) # 4阶带通滤波器
    emg_filt = filtfilt(b, a, emg) # 应用滤波器
    return emg_filt

def center_emg(emg):
    emg_centered = emg - np.mean(emg) # 去趋势
    return emg_centered

def normalize_emg(emg):
    emg_norm = (emg - np.min(emg)) / (np.max(emg) - np.min(emg)) # 归一化
    return emg_norm

# 将上述函数组合成一个预处理函数
def preprocess_emg(emg, fs):
    emg_filt = filter_emg(emg, 20, 500, fs) # 带通滤波
    emg_centered = center_emg(emg_filt) # 去趋势
    emg_norm = normalize_emg(emg_centered) # 归一化
    return emg_norm

对于特征提取,可以使用时域特征或者频域特征。时域特征包括肌电信号的最大值、最小值、均值、标准差等,频域特征包括功率谱、频带能量等。下面是一个简单的特征提取代码示例:

import scipy.stats as stats
import scipy.fftpack as fftpack

def compute_rms(emg):
    emg_rms = np.sqrt(np.mean(emg**2)) # 均方根
    return emg_rms

def compute_mav(emg):
    emg_mav = np.mean(np.abs(emg)) # 平均绝对值
    return emg_mav

def compute_ssc(emg):
    emg_ssc = np.sum(np.abs(np.diff(np.sign(np.diff(emg)))))/len(emg) # 信号斜率变化统计特征
    return emg_ssc

def compute_waveform_length(emg):
    emg_wl = np.sum(np.abs(np.diff(emg))) # 波形长度
    return emg_wl

def compute_frequency_domain_features(emg, fs):
    emg_fft = fftpack.fft(emg) # 快速傅里叶变换
    emg_psd = np.abs(emg_fft)**2 # 功率谱密度
    freqs = fftpack.fftfreq(len(emg), 1.0/fs) # 频率变换
    emg_bp = np.sum(emg_psd[(freqs >= 20) & (freqs <= 500)]) # 特定频带的信号功率
    freq_mean = np.mean(freqs) # 平均频率
    freq_std = np.std(freqs) # 频率标准差
    fd_features = [emg_bp, freq_mean, freq_std] # 频域特征
    return fd_features

# 将上述函数组合成一个特征提取函数
def extract_emg_features(emg, fs):
    emg_rms = compute_rms(emg) # 均方根
    emg_mav = compute_mav(emg) # 平均绝对值
    emg_ssc = compute_ssc(emg) # 信号斜率变化统计特征
    emg_wl = compute_waveform_length(emg) # 波形长度
    fd_features = compute_frequency_domain_features(emg, fs) # 频域特征
    emg_features = [emg_rms, emg_mav, emg_ssc, emg_wl] + fd_features # 特征向量
    return emg_features

但是,不同的任务需要不同的特征,因此需要根据具体任务需要选择不同的特征。
如果我的回答解决了您的问题,请采纳!

根据我查阅的资料了解,该肌电数据库包含的是来自手臂(biceps和triceps)和手掌(thenar和hypothenar)两个部位的表面肌电信号数据。每个部位有多个不同的姿势和运动,每个运动在不同的试验和会话中记录了多个片段的信号。这些数据都是由采集器采集得到的原始EMG信号,需要进行预处理和特征提取后才能用于进一步的分析和应用。

从常见的应用场景来看,肌电信号在康复医学、人机交互和人体工程学等领域有着广泛的应用。例如,在康复医学中,肌电信号可以用于评估患者的神经肌肉控制能力,以及监测康复训练的进度和效果;在人机交互中,肌电信号可以用于手势识别、手指追踪和手指控制等应用;在人体工程学中,肌电信号可以用于评估人体疲劳和负荷水平,以及优化工作环境和工作方式等。

因此,不同研究领域和应用场景可能会选择不同的肌电信号来源和处理方法。在具体选择时,需要根据研究问题和应用需求来确定所需信号来源和处理方法,并且需要对不同来源和处理方法的优缺点进行评估和比较,选择最合适的方案。