肌电信号的数据理解
目錄
一、基于自采肌電數據的理解
二、基于Ninapro肌電數據的理解
本文主要是解釋說明肌電數據,只有理解了數據的格式和意義,才能更進一步的去處理數據,從自采的肌電數據角度和Ninapro公共數據集的角度來理解數據。
一、基于自采肌電數據的理解
這里用于采集設備的肌電設備是基于國產的ELONI肌電儀,主要的參數是16通道(袖套/貼片電極兼容),采樣率1000-2000Hz,帶通濾波器范圍是20Hz-500Hz,陷波濾波器濾除50Hz的工頻噪聲。所保存的數據格式如下所示:
這是一個txt文件,18列,N行。用Matlab讀取這個文件成一個變量
filename = 'EMG20190093003113.txt'; data_all = importdata(filename);這段數據的解釋為每一行表示為每隔0.001s讀取的sample,1-16列對應的是16個通道的數據,第17位和第18位是數據的時間同步位,因為設備采用雙藍牙來處理數據,兩個同步位一致表示數據有效(僅僅是本設備)。上述的信號大概采集了86s的數據。在實際應用中,需要剔除17和18列的數據,因此處理完的數據大小是: [N Samples] x [16 Channels]。每個通道產生的值都是電位幅值,可以表征信號強度的。我們取出其中一個通道的信號繪圖如下:
這個信號比較容易理解,當然了,越是容易理解的數據,對于學習者而言若容易建立信心,如果大家能夠有自己的設備去采集自己的數據的話,那樣理解的更加透徹。
二、基于Ninapro肌電數據的理解(DB1)
Ninapro(全稱Non-Invasive Adaptive Prosthetics)數據集是目前表面肌電研究領域比較有代表性的公開數據集,該數據經過不斷的拓展,目前已經發展到DB9了,下載網址是www.ninapro.hevs.cn,特別注意要先登錄才能有下載權限。Ninapro數據集中包含了健康受試者和殘肢患者的數據,用于采集的傳感器包括肌電傳感器、數據手套、力傳感器、傾角儀、3軸加速度計等,當然不是所有DB都用到了所有的傳感器,對于DB1,只用到了肌電和數據手套。本文具體對DB1進行說明。
DB1中的具體參數:
受試者:27個健康人
采集動作:52個動作(不含rest),分為:
(A)12個基本的手指動作
(B)8個基本手部動作(等長和等張收縮)
(C)9個基本的手腕動作
(D)23個抓握和功能性動作
采集裝置參數:
(A)運動學數據:融合了22個傳感器的Cyberglove II dataglove(數據手套),目的是用于手指位置信息,該設備將這22個關節角度表示為8位值,平均分辨率小于1度,具體取決于受試者手的大小、手套的正確佩戴以及所考慮關節的旋轉范圍。除了Cyberglove之外,還提供了標準的商用的2軸的傾角儀,附著在受試者的手腕上,用于手機手腕方向。
(B)表面肌電數據:十個通道(差分雙電極)的OttoBock MyoBock,提供了對采集信號的放大、帶通濾波和校正(rectified)。原始肌電信號的帶寬為15-500Hz。
采集方式:
用戶保持特定坐姿,面向演示屏幕,將EMG電極、數據手套和傾角儀穿戴在右手上,用戶根據演示屏幕上的動作重復特定的動作。在經過預先的訓練之后,每一類的動作將會連續進行10次重復來收集數據。每次動作將持續5s,兩個動作之間有3s的休息時間。在規整數據的時候,四個動作類別將會被歸納到3個exercise中,其中第二個和第三個類別將被分組到exercise 2中。請注意,為了誘發重復的、幾乎無意識的運動,序列是有意不隨機化的。
數據說明:
每個subject的數據都有三個文件組成:S1_A1_E1.mat,S1_A1_E2.mat,S1_A1_E3.mat,分別包含了exercise 1 - 3的動作數據。
加載其中一個mat文件如下:
主要說明一下repetition,rerepetition,stimulus,restimulus。其中rerepetition和restimulus都是經過矯正后的數據,畢竟在采集過程中總會存在人的反應時間和軟件延遲的影響。
上面左圖是repetition(exercise 1,一共12個動作),可以看出來采集方式是每個動作重復采集10次,縱軸數值表征的是每個動作的重復Index。上面右圖是restimulus(exercise 1,一共12個動作),這個比較重要,可以看做是label,數值由1-12標記。
上圖是emg數據中第1個通道的時序圖,一共12個動作,每個動作重復10次,因此原則上圖中應該有120個脈沖(動作)。
數據讀取(MATLAB):
function NinaproMatrix = LoadNinaproDB( DataPath ) %Parameters: % DataPath: 原始數據路徑 %Returns: % NinaproMatrix: 返回切割好的steady數據 % NinaproTransientMatrix: 返回切割好的transient數據 NinaproMatrix = cell(1,27); SubjectNum = 27;%% 從每個subject的目錄中讀取三個exercise,并將數據和標簽對照著取出來 for k = 1:SubjectNumCharSubject = ['s' num2str(k)];UpperSubject = upper(CharSubject);% 讀取第一個ExerciseFileName_E1 = [UpperSubject '_A1_E1.mat'];FileLocation_E1 = fullfile(DataPath, CharSubject, FileName_E1);load(FileLocation_E1);emg_E1 = emg;restimulus_E1 = restimulus;stimulus_E1 = stimulus;% 讀取第二個ExerciseFileName_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開始endendrestimulus_E2 = [restimulus_E1; restimulus];stimulus_E2 = [stimulus_E1;stimulus];% 讀取第三個ExerciseFileName_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開始endendrestimulus_E3 = [restimulus_E2;restimulus];stimulus_E3 = [stimulus_E2; stimulus];% 變換名稱emg = emg_E3;restimulus = restimulus_E3;NumChannels = size(emg,2); %通道數量NinaproMatrix{1,k} = restimulus; % cell的第一行表示labelNinaproMatrix{2,k} = emg; % cell的第二行表示data end讀取的數據格式是2x27 cell。第一行表示label,第二行表示data,每一列表示一個subject。當然,對數據的讀取方式還有很多種。
?
總結
- 上一篇: 在启动HDFS时,针对集群中nameno
- 下一篇: 机器学习之支持向量机(SVM)总结