sEMG分析

表面肌电信号(sEMG)介绍 表面肌电信号(Surface Electromyography)是众多生物电信号中的一种,也是相对来说最容易获取的一种电生理信号。将电极片放置在人体的皮肤表面,可以记录到皮肤表面因肌肉收缩而产生的微弱的电位差,而这个微弱的电位信号通过肌电采集电路的放大和转换就形成了可用作处理的表面肌电信号。sEMG是及其微弱的,下面是肌电与常见电源的电压值比较。 采集sEMG的装置很多,国内外均有比较成熟的产品在售,例如美国的Delsys、Noraxon、瑞典的MYON、德国FREEEMG(下图从左到右) 国内 阅读详情
AI摘要

该文详细介绍了肌电信号(sEMG)的产生、特点,以及基于sEMG的动作意图识别。在肌电信号采集过程中,需要考虑信号的微弱性、干扰因素,并通过滤波和陷波技术改善。随后,文章展示了sEMG的静态和动态显示方法,并讨论了预处理滤波去噪的重要性,包括使用IIR陷波器和数字滤波器。接着,提取了多种时域特征,如IAV、RMS等,用于特征选择。最后,提到了使用LDA、KNN等分类器进行动作识别的应用,如康复系统和下肢动作识别。

1肌电信号

肌电信号的产生

表面肌电信号是由多个运动单元发放的动作电位序列,在皮肤表面呈现的时间和空间上综合叠加的结果

在这里插入图片描述
在这里插入图片描述
肌电信号特点

(1)sEMG是一维时间动作电位序列

(2)sEMG是交流信号,幅值一般和肌肉运 动力度成正比

(3)sEMG是一种非平稳的微电信号,其幅值在 0~1.5mv,有用信号频率位于 0~500HZ,主要能量集中在 20~150HZ

(4)SEMG一般比肢体运动超前 30~150ms产生,可以进行运动提前判断
在这里插入图片描述
基于sEMG的动作意图识别
在这里插入图片描述

2肌电信号采集

(1)sEMG是微弱电信号,易受到心电信号和工频噪声的干扰,需要很高的共模抑制比,用模拟滤波器和双T陷波器将信号滤波放大到0~5V
(2)将电极、放大滤波电路、陷波电路封装在一起,加屏蔽层保护,降低传导耦合的干扰
(3)采集方式:探针式、电极片式
(4)已有sEMG采集系统:美国Delsys生产的Trigno、加拿大Thought生产的Myoscan
在这里插入图片描述
肌电信号采集电路图
在这里插入图片描述
sEMG静态显示

clc
clear

addpath(genpath(pwd));   %% 将当前文件夹下的所有文件夹都包括进调用函数的目录
data=load('201801111534zhangaidong.mat');
ch1=data.data(:,1);
ch2=data.data(:,2);

% Hd=IIR_notchFilter(2000,50);
% ch1=filter(Hd,ch1);                   % 陷波后
% ch2=filter(Hd,ch2);
N=size(ch1,1);

figure(1);
plotHandlesEMG = zeros(2,1);
axesHandlesEMG = zeros(2,1);

for i = 1:2
    axesHandlesEMG(i) = subplot(2,1,i);   
    plotHandlesEMG(i) = plot(axesHandlesEMG(i),0,'-y','LineWidth',1);
    set(axesHandlesEMG(i),'XGrid','on','YGrid','on','XLimMode', 'manual','YLimMode', 'manual');
    set(axesHandlesEMG(i),'Color',[.15 .15 .15],'XLim', [0 N],'YLim', [-.0005 .0005]);
    title(sprintf('EMG %i', i)); 
end

set(plotHandlesEMG(1), 'Ydata', ch1); 
set(plotHandlesEMG(2), 'Ydata', ch2); 

sEMG动态显示

function dynamicShow_6ch
addpath(genpath(pwd));   %% 将当前文件夹下的所有文件夹都包括进调用函数的目录
load('20170927_xinhongyu.mat');
global plotHandlesEMG flag ch1 ch2 ch3 ch4 ch5 ch6;
ch1 = p3_open_ch1;
ch2 = p3_open_ch2;
ch3 = p3_grasp_ch1;
ch4 = p3_grasp_ch2;
ch5 = p3_snooze_ch1;
ch6 = p3_snooze_ch2;

flag=1;
t = timer('Period', 0.1, 'ExecutionMode', 'fixedSpacing', 'TimerFcn', {@updatePlots, plotHandlesEMG});
figure('CloseRequestFcn', {@localCloseFigure,t});

plotHandlesEMG = zeros(6,1);
axesHandlesEMG = zeros(6,1);
for i = 1:6
    axesHandlesEMG(i) = subplot(3,2,i);   
    plotHandlesEMG(i) = plot(axesHandlesEMG(i),0,'b','LineWidth',1);
    set(axesHandlesEMG(i),'XGrid','on','YGrid','on','XLimMode', 'manual','YLimMode', 'manual');
    set(axesHandlesEMG(i),'XLim', [0 2000],'YLim', [-.00005 .00005]);
    title(sprintf('EMG %i', i)); 
end
drawnow
start(t);

function updatePlots(obj, Event,tmp)
global plotHandlesEMG flag ch1 ch2 ch3 ch4 ch5 ch6;
data_ch1 = ch1(flag:flag+2000);   
data_ch2 = ch2(flag:flag+2000);
data_ch3 = ch3(flag:flag+2000);   
data_ch4 = ch4(flag:flag+2000);
data_ch5 = ch5(flag:flag+2000);   
data_ch6 = ch6(flag:flag+2000);

flag=flag+200;
set(plotHandlesEMG(1), 'Ydata', data_ch1); 
set(plotHandlesEMG(2), 'Ydata', data_ch2); 
set(plotHandlesEMG(3), 'Ydata', data_ch3); 
set(plotHandlesEMG(4), 'Ydata', data_ch4); 
set(plotHandlesEMG(5), 'Ydata', data_ch5); 
set(plotHandlesEMG(6), 'Ydata', data_ch6); 
drawnow

function localCloseFigure(figureHandle,~,t)
stop(t);
delete(t);
delete(figureHandle);

3预处理滤波去噪

经由肌电采集系统得到的原始肌电信号如图所示,肌电采集的频率为2000HZ,EMG1表示一秒内肌肉的动作电位序列,EMG2表示一秒内肌肉静息时的电位序列。由肌电采集系统得到的肌电信号虽然经过了硬件上的滤波、去噪等一系列的处理,但是仍然存在工频噪声、尖峰幅值等干扰,现在对得到的原始肌电信号进行软件滤波处理。
在这里插入图片描述
对原始肌电信号进行FFT变换,得到信号的单边振幅谱如图所示,可以看到50HZ的工频干扰很大,现在采用IIR数字陷波器,得到陷波后的信号单边振幅谱如图所示,消除工频干扰后,肌电信号的主要频率集中在0-500HZ,尤其是在10-300HZ。
在这里插入图片描述
由于肌电信号的主要频率集中在10-300HZ,现在对肌电信号进行软件数字滤波,常用的数字滤波器有巴特沃兹滤波器和切比雪夫滤波器。

巴特沃兹滤波器比切比雪夫滤波器具有更平滑的滤波特性
切比雪夫滤波器在过渡带的衰减更快,虽然频率响应的幅频特性没有巴特沃兹滤波器的好,但是与理想滤波器频率响应曲线之间的误差小。
在这里插入图片描述
经过滤波后的肌电信号更加平滑,去除了高频尖峰的干扰。
在这里插入图片描述

4特征提取与选择

为了保证特征的连续性,通常采用设置时间窗+增量窗的方式提取特征
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时域特征

function feature = fARC(data)  
    % - ARC - Auto Regression Model Coefficients

    order = 6;              
    f = real(lpc(data,order)');    %real()取复数的实数部分 lpc():Linear prediction filter coefficients
    feature = -f(order+1,:);       %首项默认为1,从第二项开始
end

function feature = fIAV(data)
    % - IAV - Integrated Absolute Value
    feature = sum(abs(data))/length(data);
end

function feature = fLogD(data)
    feature = exp(mean(log(abs(data))));
end

function feature = fMAV(data)
    % - MAV - Mean Absolute Value
    feature = mean(abs(data));
end

function feature = fMAX(data)
    feature = max(abs(data));
end

function feature = fNZM(data)
    % - NZM - Non Zero Median 非0中位数
    data_nonzero = data(find(data ~= 0));
    feature = median(data_nonzero); 
end

function feature = fRMS(data)
    % - RMS - Root Mean Square
    feature = sqrt(mean(data.^2));  
end

function feature = fSSC(data)
    % - SSC - Slope Sign Change, number times
    DeadZone = 10e-7;
    data_size = length(data);
    feature = 0;

    if data_size == 0
        feature = 0;
    else
        for j=3:data_size
            difference1 = data(j-1) - data(j-2);
            difference2 = data(j-1) - data(j);
            Sign = difference1 * difference2;
            if Sign > 0
                if abs(difference1)>DeadZone || abs(difference2)>DeadZone
                    feature = feature + 1;
                end
            end
        end
        feature = feature/data_size;
    end
end

function feature = fVAR(data)
    feature = var(data);
end

function feature = fWA(data)
    % - WA - Willison Amplitude
    Threshold = 10e-7;
    data_size = length(data);
    feature = 0;
    if data_size == 0
        feature = 0;
    else
        for i=2:data_size
            difference = data(i) - data(i-1);
            if abs(difference)>Threshold
                feature = feature + 1;
            end
        end
        feature = feature/data_size;
    end
end

function feature = fWL(data)
    % - WL - Waveform Length
    feature = sum(abs(diff(data)))/length(data);
end

function feature = fZC(data)
    % - ZC - Zero Crossing
    DeadZone = 10e-7;
    data_size = length(data);
    feature = 0;

    if data_size == 0
        feature = 0;
    else
        for i=2:data_size
            difference = data(i) - data(i-1);
            multy      = data(i) * data(i-1);
            if abs(difference)>DeadZone && multy<0
                feature = feature + 1;
            end
        end
        feature = feature/data_size;
    end
end

频域特征

function feature = fFMD(data)
    % - MDF - Median Frequency
    % 未陷波滤波
    Fs = 2000;           
    feature = medfreq(data, Fs);    % medfreq()计算中值频率,2015a版本才有
end

function feature = fFME(data)
    % - MNF - Mean Frequency

    %未陷波滤波
    Fs = 2000; 
    feature = meanfreq(data, Fs);
end

function feature = fPSD(data)
    % PSD  Power Spectral Density 功率谱密度估计

   [b,a]=butter(2,[0.01,0.5]);           
   x= filter(b,a,data);

   Nfft     =  512;
   window   = hanning(256);
   noverlap = 128;
   Fs       = 2000;

   [pxx,f]=pwelch(x,window,noverlap,Nfft,Fs);
   feature = pxx;    %得到的是一组数据257维
end

在这里插入图片描述
特征提取

clear
clc

addpath(genpath(pwd));  

% 获取一维数据
load('mll.mat');
CH1   = double(mll_snooze_ch1);
CH2   = double(mll_snooze_ch2);
N = size(CH1,1);

%选择时间窗1秒(2000个点),增量窗0.1秒(200个点)
N = N/200;
for i=0:N-10
    ch1 = CH1(200*i+1:200*i+2000,:);
    ch2 = CH2(200*i+1:200*i+2000,:);

    % 提取常规时域特征,每个通道11个特征,总共22个特征
    A(1) = fIAV(ch1);   B(1) = fIAV(ch2);
    A(2) = fLogD(ch1);  B(2) = fLogD(ch2);
    A(3) = fMAV(ch1);   B(3) = fMAV(ch2);
    A(4) = fMAX(ch1);   B(4) = fMAX(ch2);
    A(5) = fNZM(ch1);   B(5) = fNZM(ch2);
    A(6) = fRMS(ch1);   B(6) = fRMS(ch2);
    A(7) = fSSC(ch1);   B(7) = fSSC(ch2);
    A(8) = fVAR(ch1);   B(8) = fVAR(ch2);
    A(9) = fWA(ch1);    B(9) = fWA(ch2);
    A(10)= fWL(ch1);    B(10)= fWL(ch2);
    A(11)= fZC(ch1);    B(11)= fZC(ch2);

    % 保存特征在TXT文件中
    fid = fopen('features/timef/zzzzzz.txt','a');
    for j=1:10
        fprintf(fid,'%g\t',A(j));
        fprintf(fid,'%g\t',B(j));
    end
    fprintf(fid,'%g\t',A(11));
    fprintf(fid,'%g\n',B(11));
    fclose(fid);
end

5分类

在这里插入图片描述
在这里插入图片描述
常用:LDA、KNN、SVM、ANN、MLP
康复系统、各个演示系统的分类模型均是ANN
网络结构:三层(输入层:通道数*特征数、隐含层、输出层:类别数)

完成的工作:
(1)偏瘫患者手部(张手、闭手、放松)三类识别
(2)正常人(12动作在线识别)6电极
(3)下肢6动作在线识别(6电极)
踝关节上拉、下勾;膝关节前伸、后拉;髋关节内收、外展
————————————————
版权声明:本文为优快云博主「九方先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/malele4th/article/details/79361526

【python数据处理基础】--数据读取、清洗数据 python 数据处理实战目录数据读取清洗数据合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目录 随着网络数据的爆发式的增长,数据处理工作日益显示出它的重要性,我们的目的是从大量的杂乱无章的数据中找出对我们的工作有益的数据或者发现数据的某 阅读详情

相关推荐

sEMG时域特征在肌肉活动分析中的应用与实现

本文深入探讨了表面肌电信号(sEMG)时域特征在肌肉活动分析中的应用与实现。通过解析MAV、RMS、VAR、ZC和WAMP五大核心时域特征,结合Python和MATLAB代码示例,详细介绍了信号处理全流程及工程优化技巧。文章还分享了在康复医学、运动科学和人机交互等领域的典型应用案例,为相关研究人员和工程师提供实用指导。

weixin_28223453的博客 241

什么是肌电信号?

肌电信号又称为EMG  EMG(electromyography)是一种生物电流信号,它产生于任意组织器官,一般是一种时间和一系列的振幅、频率和波形函数 。肌电信号是伴随肌肉收缩动作产生的一种生物电信号,采集皮肤表面的肌电信号称为表面肌电信号sEMG。  sEMG信号是人体表面肌肉通过收缩产生的生物电流。 神经系统控制肌肉的活动(收缩或者放松),在表面皮肤不同的肌肉纤维运动单元在同一时间产生相...

qq_27318693的博客 1万+

sEMG频域特征对性别与皮下脂肪的敏感性分析:从实验设计到统计验证

表面肌电信号(sEMG)分析是生物医学工程和运动科学中的基础技术,通过时域、频域等特征提取来评估肌肉活动状态。其核心原理在于,sEMG信号反映了运动单位的电生理活动,而频域特征(如中值频率、平均功率频率)能有效表征肌肉疲劳和神经驱动模式的变化。理解这些特征的稳健性对于提升模型泛化能力和临床应用的可靠性至关重要。在实际工程中,研究者常发现模型性能受人口统计学因素干扰,例如性别和皮下脂肪厚度可能作为“混杂变量”影响信号频谱。皮下脂肪层相当于一个生物滤波器,可能衰减高频信号成分,导致频域特征产生系统性偏差;而性别

weixin_34072296的博客 317

表面肌电信号处理流程——基于肌电信号分类的特征抽取的设计

肌电图(EMG)信号是一种生物信息,在许多领域被用于帮助人们研究人类的肌肉运动。尤其在仿生手方面应用的非常重要,它可以通过人体肌肉的信号变化来说明某一时刻进行的活动。肌电图是一个非常复杂的信号,所以处理它是至关重要的。肌电信号的处理过程分为采集、特征提取和分类等步骤。但有时候收集肌电信号的通道过多会对信号的准确性有所干扰,所以本文在特征提取方面考虑到特征抽取这种方法。使用传统方法主成分分析和支持向量机特征消除法来对信号进行降维,提出一种新方法相关性热力图法。用这三种方法来消除肌电信号特征,三种分类算法验证。

哈哈的博客 1万+

sEMG信号特征如何受性别与皮下脂肪影响:147个特征敏感性分析

表面肌电信号是生物医学信号处理领域的关键技术,广泛应用于康复工程、人机交互和假肢控制。其原理是通过表皮电极采集肌肉活动产生的电信号,进而提取时域、频域和非线性特征来解码运动意图。在工程实践中,信号质量直接影响系统性能,而皮下组织厚度作为一个基础物理变量,会像低通滤波器一样衰减信号并改变其频谱特性,从而对特征提取的可靠性构成挑战。本文聚焦于性别与皮下脂肪这两个常见协变量,深入剖析它们对sEMG信号特征的复合影响机制,特别是对均方根值、中值频率等核心时频特征的敏感性,为构建更鲁棒、公平的肌电应用系统提供实验设计

weixin_31062533的博客 258

35、基于sEMG的手指运动估计与HD - sEMG信号非线性分析

本博客主要探讨了基于sEMG信号的手指运动估计和HD-sEMG信号的非线性分析在肌肉衰老研究中的应用。研究中构建并比较了GRU和A-ConvGRU模型在手指关节角度预测方面的性能,结果显示A-ConvGRU在准确性与训练效率方面显著优于传统GRU模型。此外,通过对HD-sEMG信号的非线性特征(如时间可逆性、样本熵等)分析,揭示了肌肉衰老在神经肌肉活动中的体现,为理解年龄相关肌肉功能退化提供了新视角。研究成果对假肢控制、临床康复及衰老相关的神经肌肉疾病研究具有重要意义。

yhn456789的博客 233

sEMG项目总结(5)sEMG分析

sEMG分析 目录 sEMG分析 目录 1肌电信号 2肌电信号采集 3预处理滤波去噪 4特征提取与选择 5分类 1肌电信号 肌电信号的产生 表面肌电信号是由多个运动单元发放的动作电位序列,在皮肤表面呈现的时间和空间上综合叠加的结果 肌电信号特点 (1)sEMG是一维时间动作电位序列 (2)sEMG是交流信号,幅值一般和肌肉运 动力度成正比 (...

malele4th 3万+

8、基于sEMG信号特征分析与移动钱包安全的研究

本文研究了表面肌电(sEMG)信号特征分析与移动钱包安全两个重要领域。在sEMG信号分析中,通过信号采集、预处理、特征提取与选择,结合模糊熵和方差分析(ANOVA)方法,确定了与手部动作具有线性关系的有效特征(如ZC、meanf和WA),为假肢手的精准控制提供了技术支持。在移动钱包安全方面,提出了一种混合技术,旨在解决密钥托管问题并提供公平的加密环境,为移动支付安全提供了新的解决方案。研究结果表明,sEMG信号的有效特征可显著提升假肢手控制的准确性和响应速度,而移动钱包的混合安全技术有望增强交易的安全性和适

qsc9012345的博客 58

【肌电信号】基于带通滤波时域和频域的表面肌电信号SEMG特征分析附Matlab代码

表面肌电信号(SEMG)是一种反映肌肉活动的重要生理信号,其时域和频域特征包含了丰富的肌肉收缩信息。本文旨在探讨基于带通滤波的SEMG信号特征分析方法,分别从时域和频域两个角度提取特征参数,并结合Matlab代码进行实现。1. 引言表面肌电信号(SEMG)是指将电极放置在皮肤表面,记录肌肉纤维产生的电活动信号。SEMG信号在运动控制、康复训练、假肢控制等领域有着广泛的应用。由于SEMG信号容易受到噪声干扰,且其特征提取方法多种多样,如何有效地提取SEMG信号特征并应用于实际问题成为一个重要的研究课题。

matlab_dingdang的博客 1046

sEMG时频联合分析实战:从信号预处理到临床可解释指标

表面肌电信号(sEMG)是一种低信噪比、非平稳的生物电信号,其分析需兼顾时域特征(如RMS、ZC)与频域特征(如MF、MPF)的生理耦合关系。原理上,时域预处理为频域分析提供干净输入,而频域结果又反向优化时域窗口策略,形成闭环分析逻辑。该技术显著提升肌肉疲劳判别、假肢控制响应和康复评估可靠性,广泛应用于运动科学、神经康复与人机交互领域。本文聚焦真实sEMG数据中的工频干扰抑制、运动伪迹剔除及MF/RMS耦合解读等关键实践环节,提供MATLAB可复现的参数依据与临床映射方法。

weixin_29191081的博客 245

基于STM32与FFT的肌肉疲劳检测系统:从sEMG信号采集到频域分析实践

在嵌入式系统与生物医学工程交叉领域,信号采集与处理是核心基础。其原理在于通过传感器将物理或生理信号转换为电信号,再经由模拟前端调理和模数转换,供微控制器进行数字化分析。这项技术的价值在于能将复杂的专业检测设备微型化、智能化与低成本化,极大地拓展了其在便携式健康监测、可穿戴设备等场景的应用。本文聚焦于利用表面肌电信号(sEMG)进行肌肉疲劳状态评估这一具体应用。通过设计高共模抑制比的仪表放大电路与抗干扰滤波网络,结合STM32的ADC与DMA实现高保真数据采集。算法的核心在于运用快速傅里叶变换(FFT)将时域

weixin_29163797的博客 308

sEMG时域特征在肌肉活动分析中的关键作用

本文深入探讨了sEMG时域特征在肌肉活动分析中的关键作用。文章详细解析了MAV、RMS、VAR、ZC、WAMP等核心时域特征如何将原始的肌电信号转化为量化指标,从而精准评估肌肉激活水平、疲劳状态及收缩模式。这些特征为运动科学、康复医学及假肢控制等领域提供了客观、量化的分析工具,是解读肌肉“电语言”不可或缺的翻译官。

grape的博客 475

表面肌电信号(EMG)采集与预处理

本文档主要讲解了表面肌电信号在人的生活生命中的重要性,并介绍了信号产生的原理及主要特征。以及采集信号的前端放大滤波电路的选择和信号预处理方法,文中有插图,对相关知识起到辅助功能,简单明了。

上一篇: 使用浅层神经网络拟合数据(利用matlab神经网络工具箱)
下一篇: 机械臂的backdrivability
lihe2021
博客等级 码龄10年 264粉丝 81原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值