采集前臂四块不同肌肉的表面肌电信号

#加载相关模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
data1=pd.read_excel('wq20.xlsx',sheetname=1)
data2=pd.read_excel('zs20.xlsx',sheetname=1)
data3=pd.read_excel('n20.xlsx',sheetname=1)
data4=pd.read_excel('w20.xlsx',sheetname=1)
data1.columns=['ch1','ch2','ch3','ch4']
data2.columns=['ch1','ch2','ch3','ch4']
data3.columns=['ch1','ch2','ch3','ch4']
data4.columns=['ch1','ch2','ch3','ch4']
names=locals()
for i in range(1,5):plt.figure()plt.plot(names['data%s'%i])

握拳

张手

手腕内翻

手腕外翻

将四通道的肌肉电信号汇总求其绝对值平均值,利用移动窗口法,取若干连续时间序列对应的信号强度求局域平均,若其后若干点的均值都超过一定阈值,则视为一个动作开始,反之若其后若干点的局域均值都小于阈值,则视为一个动作结束

def get_mean_semg(data):mean_semg=[]for i in range(len(data)-1):mean_semg.append((data.ch1[i]+data.ch2[i]+data.ch3[i]+data.ch4[i])/4)return mean_semgfor i in range(1,5):names['mean_semg_%s'%i]=get_mean_semg(names['data%s'%i])plt.figure()plt.plot(names['mean_semg_%s'%i])plt.ylim(0,5)plt.savefig('a%s'%i,dpi=400)

握拳

张手

内翻

外翻

def get_move_window(mean_semg):mean_semg_arr=np.array(mean_semg)return pd.rolling_mean(mean_semg_arr,window=800)def get_break(data,i,thre,windowlenth):for i in range(i,i+windowlenth):if data[i]<thre:return 0return 1for i in range(1,5):names['move_averge_%s'%i]=get_move_window(names['mean_semg_%s'%i])names['sta_%s'%i]=[]names['end_%s'%i]=[]thre=1.1windowlenth=800for j in range(len(names['move_averge_%s'%i])-1):if get_break(names['move_averge_%s'%i],j,thre,windowlenth)==0 and get_break(names['move_averge_%s'%i],j+1,thre,windowlenth)==1:names['sta_%s'%i].append(j)if get_break(names['move_averge_%s'%i],j,thre,windowlenth)==1 and get_break(names['move_averge_%s'%i],j+1,thre,windowlenth)==0:names['end_%s'%i].append(j)

获取平均值起始点,并将对应时间点作用于原始信号上,对四通道信号进行行动段提取,并将长度较小的部分过滤,视为噪音

for i in range(1,5):names['period_%s'%i]=[]names['sta_filt_%s'%i]=[]names['end_filt_%s'%i]=[]for j in range(len(names['sta_%s'%i])):names['period_%s'%i].append(names['end_%s'%i][j]-names['sta_%s'%i][j])for k in range(len(names['period_%s'%i])):if names['period_%s'%i][k]>5000:names['sta_filt_%s'%i].append(names['sta_%s'%i][k])names['end_filt_%s'%i].append(names['end_%s'%i][k])
for i in range(1,len(sta_filt_1)+1):names['data1_cut%s'%i]=data1[sta_filt_1[i-1]:end_filt_1[i-1]]
for i in range(1,len(sta_filt_2)+1):names['data2_cut%s'%i]=data2[sta_filt_2[i-1]:end_filt_2[i-1]]
for i in range(1,len(sta_filt_3)+1):names['data3_cut%s'%i]=data3[sta_filt_3[i-1]:end_filt_3[i-1]]
for i in range(1,len(sta_filt_4)+1):names['data4_cut%s'%i]=data4[sta_filt_4[i-1]:end_filt_4[i-1]]plt.figure(figsize=(50,3))
for i in range(1,21):plt.subplot2grid((1,20),(0,i-1),colspan=1).plot(names['data1_cut%s'%i])plt.ylim(0,10)plt.title('fist')
plt.figure(figsize=(50,3))
for i in range(1,22):plt.subplot2grid((1,21),(0,i-1),colspan=1).plot(names['data2_cut%s'%i])plt.ylim(0,10)plt.title('open')
plt.figure(figsize=(50,3))
for i in range(1,25):plt.subplot2grid((1,24),(0,i-1),colspan=1).plot(names['data3_cut%s'%i])plt.ylim(0,10)plt.title('toright')
plt.figure(figsize=(50,3))
for i in range(1,21):plt.subplot2grid((1,20),(0,i-1),colspan=1).plot(names['data4_cut%s'%i])plt.ylim(0,10)plt.title('toleft')

握拳

张手

内弯

外翻

对各通道行动段求区间的平均值MAV,可以看出对于不同的动作,MAV值区别明显,可以作为特征向量对信号进行特征提取

mav_fist=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(20)])
for i in range(1,21):mav_fist.loc[i-1,'ch1']=names['data1_cut%s'%i].ch1.mean()mav_fist.loc[i-1,'ch2']=names['data1_cut%s'%i].ch2.mean()mav_fist.loc[i-1,'ch3']=names['data1_cut%s'%i].ch3.mean()mav_fist.loc[i-1,'ch4']=names['data1_cut%s'%i].ch4.mean()
mav_open=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(21)])
for i in range(1,22):mav_open.loc[i-1,'ch1']=names['data2_cut%s'%i].ch1.mean()mav_open.loc[i-1,'ch2']=names['data2_cut%s'%i].ch2.mean()mav_open.loc[i-1,'ch3']=names['data2_cut%s'%i].ch3.mean()mav_open.loc[i-1,'ch4']=names['data2_cut%s'%i].ch4.mean()
mav_toright=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(24)])
for i in range(1,25):mav_toright.loc[i-1,'ch1']=names['data3_cut%s'%i].ch1.mean()mav_toright.loc[i-1,'ch2']=names['data3_cut%s'%i].ch2.mean()mav_toright.loc[i-1,'ch3']=names['data3_cut%s'%i].ch3.mean()mav_toright.loc[i-1,'ch4']=names['data3_cut%s'%i].ch4.mean()
mav_toleft=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(20)])
for i in range(1,21):mav_toleft.loc[i-1,'ch1']=names['data4_cut%s'%i].ch1.mean()mav_toleft.loc[i-1,'ch2']=names['data4_cut%s'%i].ch2.mean()mav_toleft.loc[i-1,'ch3']=names['data4_cut%s'%i].ch3.mean()mav_toleft.loc[i-1,'ch4']=names['data4_cut%s'%i].ch4.mean()
plt.figure(figsize=(20,5))
mav_fist_ax=plt.subplot2grid((1,4),(0,0),colspan=1)
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch1,c='r')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch2,c='g')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch3,c='b')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch4,c='y')
mav_open_ax=plt.subplot2grid((1,4),(0,1),colspan=1)
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch1,c='r')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch2,c='g')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch3,c='b')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch4,c='y')
mav_toright_ax=plt.subplot2grid((1,4),(0,2),colspan=1)
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch1,c='r')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch2,c='g')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch3,c='b')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch4,c='y')
mav_toleft_ax=plt.subplot2grid((1,4),(0,3),colspan=1)
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch1,c='r')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch2,c='g')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch3,c='b')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch4,c='y')

mav_fist['action']=0
mav_open['action']=1
mav_toright['action']=2
mav_toleft['action']=3
sumup=mav_fist.append([mav_open,mav_toright,mav_toleft],ignore_index=True)
y=sumup.actionx=sumup.drop(['action'],axis=1)
from sklearn.model_selection import train_test_splitimport xgboost as xgb
train_x,test_x,train_y,test_y=train_test_split(x.as_matrix(),y.as_matrix(),test_size=0.2)
xg_train=xgb.DMatrix(train_x,label=train_y)
xg_test=xgb.DMatrix(test_x,label=test_y)
param = {}param['objective'] ='multi:softmax'param['eta']=0.1
param['max_depth']=6
param['silent']=1
param['nthread']=4
param['num_class']=4
watchlist = [(xg_train, 'train'), (xg_test, 'test')]
num_round=5
bst = xgb.train(param, xg_train, num_round, watchlist)
pred = bst.predict(xg_test)

对四个不同的手势进行数字命名,通过xgboost进行训练分析,16个测试样的预测结果正确率为100%

更多Python视频、源码、资料加群683380553免费获取

转载至:https://zhuanlan.zhihu.com/p/41073513

python对肌电信号进行简单的手势识别相关推荐

  1. 读论文-----基于单通道表面肌电信号的手势识别 Hand Gestures Recognition Based on One-Channel Surface EMG Signal

    Hand Gestures Recognition Based on One-Channel Surface EMG Signal 摘要 本文提出了一个利用OpenBCI采集两种手势信号的数据并解码信 ...

  2. 循环神经网络(RNN)简单介绍及实现(基于表面肌电信号)

    循环神经网络(RNN) 文章目录 循环神经网络(RNN) 一.介绍 二.python实现(LSTM) 三.总结 一.介绍   以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接 ...

  3. 基于表面肌电信号的手势识别——深度学习方法

    文章目录 基于表面肌电信号的手势识别--深度学习方法 1.方法和代码 2.数据下载 基于表面肌电信号的手势识别--深度学习方法 1.方法和代码 https://github.com/malele4th ...

  4. matlab肌电信号平滑滤波_BCIduino 滤波和频谱计算操作

    本文介绍用 python 对航弈生物 BCIduino 放大器脑电/肌电数据进行滤波及频谱计算,介绍如何用 python mne 对 fif 格式保存的脑电数据进行读取和简单的滤波,并用numpy 对 ...

  5. linux python 信号,Python模块之信号(signal)

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  6. 【python】通过信号机制对子进程进行控制

    在python中,使用多进程可以绕过GIL的限制从而充分利用多核CPU来加速任务.但如果对进程处理不当,就容易造成僵尸进程或孤儿进程,从而造成系统资源的浪费. 本文分析了在python中可能会生成这两 ...

  7. 肌电信号特征提取的代码

    肌电信号特征提取的代码可以使用 Python 编写.具体实现可以使用 numpy 和 scipy 库进行数据处理,使用 matplotlib 库进行数据可视化,使用 scikit-learn 库进行特 ...

  8. python处理扭振信号

    python处理扭振信号 一.概述 二.扭振分析流程 三.关键算法解释 3.1 模拟方波信号 a.简单方波信号 b.简单复杂信号 3.2 瞬时转速计算 3.3 扭转角计算 3.4 谐次分析 四.代码实 ...

  9. python对语音信号读取、分帧、加窗

    python对语音信号读取.分帧.加窗 一.读入音频信号 语音信号有三个重要的参数:声道数.取样频率和量化位数. 声道数:单声道或者双声道 采样频率:一秒钟对声音采样的次数,例如10000HZ代表一秒 ...

最新文章

  1. java排序为什么会出现多次排序结果不一样_并发理论基础:指令重排序问题
  2. C++知识点23——使用C++标准库(顺序容器list的其他操作)
  3. 新手站长们如何利用10分钟的时间内多写高质量的原创量?
  4. java opencv bytearray转mat_OpenCV开发中的内存管理问题
  5. defer 被调用时机
  6. MFC的程序,不想显示窗口,任务栏里也不显示
  7. layui选项卡嵌套选项卡_在ProtoPie中使用嵌套组件构建选项卡栏
  8. [Leetcode][第337题][JAVA][打家劫舍3][递归][动态规划]
  9. Visual Studio 2012 Ultimate旗舰版序列号
  10. PDE14 heat equation intuition
  11. grub.conf解析
  12. VS2017下载地址和安装教程(图解)
  13. 2022年最新前端面试题(大前端时代来临卷起来吧小伙子们..持续维护走到哪记到哪)
  14. 郑大第九届校赛正式赛(1819: 加加加!(油))
  15. 项目管理: Alpha,Beta,RC,GA,Release
  16. [FirefoxOS_调试]Firefox OS调试开发系列视频教程
  17. python返回绝对值的函数_Python中用于返回绝对值的abs()方法
  18. win10电脑底下一排图标没了怎么办
  19. 云主机是不是服务器?云主机和服务器有什么区别?
  20. android手机加密失败怎么办,安卓刷机教程_安卓手机TWRP-Recovery模式图文刷机指导...

热门文章

  1. Smooth Freehand Drawing on iOS
  2. 【Tools】IDApatch工具安装——keypatch
  3. 【css】CSS position(定位)属性
  4. 工业现场总线 linux 服务器,基于Linux的现场总线无线通信卡的实现
  5. pasa查看mysql_某AutoEq数据库的解读及其使用
  6. Densely Connected Convolutional Networks
  7. nginx本地服务器的搭建(保姆式教学)
  8. html 隐藏域 用什么标签,html中隐藏域hidden的做用介绍及使用示例
  9. 企业电子邮箱注册哪个好?如何注册电子邮箱?
  10. fastboot 模式下刷入Recovery