python对肌电信号进行简单的手势识别_python肌电信号标记

49 阅读6分钟

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])


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fa7179c1e1e540bca0cf634319efd3f6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=HUlzXNDPdy9RtTr59iZFpwlLjzY%3D)


握拳


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2797a9c75e9448e48c63861d2744d5df~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=4AVUQjSjG%2BpSy6WlHZxe78VYyUE%3D)


张手


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/01f3aaf5378f45f8a3695876bff20e73~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=ulzbVMRJipM2dE%2FBGzVBKBd1mDg%3D)


手腕内翻


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ea7fa21e8f364417b26e0165130deb07~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=zX216sptEMtCGXKU7LW87VSVdCY%3D)


手腕外翻


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


 



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_semg

for 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)


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/eacb41e33e7d49bda8d53abfd12ac88b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=Iqf04u6o%2FvfD5hZecDV%2BCGYS7H0%3D)


握拳


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/696868304415448883e3ee5f89f7a9c7~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=ZkSTmQjBRmJdxw5rsU7IBmE703Y%3D)


张手


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/772f36460f254b82a5ef8aaa7e1dc697~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=9lthZ%2FwEQozeOUZo%2F3FZbVpq6Z0%3D)


内翻


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7f556c3c59a5425b9016d18a74e576e9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=MK8lBg6hvs2w%2FWazcA6FwDpRMtQ%3D)


外翻


 



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 0 return 1

for 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.1 windowlenth=800 for 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')


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a9f4068b89834224becd4db5643e1b39~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=j8HrlB6PNEeSxURQfJl1K%2FA21%2Bw%3D)


握拳


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9ed5de80928c4d7181ba1779bd61488f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=dQRQJ8jpEshn2ADRhGYIPO0tBCE%3D)


张手


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b8598babed1f4325b167f3d90e684062~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=HpFcDL%2B5vc0yK9IUJu4t4S5zYdw%3D)


内弯


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/66e918f610a54070907c618d6c153d34~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1770800379&x-signature=Rz46aOGopRTSG3vDhMFmKRWdS3g%3D)


外翻


对各通道行动段求区间的平均值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() 学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

了解详情:docs.qq.com/doc/DSnl3ZG…