基于Matlab的表面肌电信号处理软件设计与开发
生活随笔
收集整理的這篇文章主要介紹了
基于Matlab的表面肌电信号处理软件设计与开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 簡介
研究目的通過使用Matlab平臺,實現運動生物力學研究中常用的表面肌電(s EMG)信號處理方法,為不會使用編程進行表面肌電(s EMG)信號數據處理的體育科研人員在表面肌電(s EMG)信號的處理過程中提供一個高效、簡單的處理軟件。研究方法通過對運動人體科學文獻中常用的表面肌電信號(s EMG)處理方法進行總結,并獲取進行表面肌電信號處理時常用的處理方法的算法,然后利用Matlab編程語言對各處理方法進行實現,并且實現為交互式的GUI軟件。通過與現有商用軟件處理結果的比較,對實現的各方法在數據處理過程中的準確性進行驗證。然后將其應用到實驗室的表面肌電(s EMG)信號數據處理當中,通過招募無編程基礎的人員使用實驗室的商業軟件和本軟件分別進行相同的數據處理過程,比較兩者的效率。結果Matlab編寫完成了一套涵蓋表面肌電信號(s EMG)在體育科學研究中處理基本功能的軟件。
2 部分代碼
%liqiang 2006.4.2%reference:Modeling of surface myoelectric signals.I.Model implementation%tripole model of SFAP?%點電極在終板區(end_plate)右邊%function sfap=SFAP_tri(dist_x,dist_y,dist_z,kab,vel)的改進:終板區左右肌纖維長度是不同的?function sfap=SFAP_tri_jm(dist_x,dist_y,dist_z,kab,vel,len_fiber,fiberL,fiberR,SampleRate)%function sfap=SFAP_tri_improve(0,5,10,0.303,4,100,-20,0)%input:% dist_x,dist_y,dist_z 為點電極的坐標(嚴格按照參考文獻的坐標)% kab: kab=a/b,且0=<kab<1, b=7(default)% vel: 肌纖維的傳導速度(與肌纖維直徑有關)% len_fiber:肌纖維的半長(基長len_fiber=100mm)% fiberL:肌纖維左邊長度變化,(基長為100mm)% fiberR:肌纖維右邊長度變化,(基長為100mm)%output:% sfap:單纖維動作電位?pre=1/(SampleRate/1000);%pre=0.5; %precision產生電位的分辨率,越小分辨率越高,但數據越長 %單獨研究動作電位時,應該設置高分辨率pre=0.01; %研究肌電信號時,應該設置低分辨率pre=1(采樣率為1kHz),以滿足計算; %pre=0.5時,對應的采樣率為2kHz?%clear%kab=0.303; %輸入比值 kab=a/b%vel=4; %輸入參數%dist_x=0;dist_y=5;dist_z=10;?delta_r=0.063;delta_z=0.33;delta=delta_z/delta_r;%len_fiber=100;%肌纖維半長len_fiberL=len_fiber+fiberL;len_fiberR=len_fiber+fiberR;??b=7; %spacinga=kab*b;I2=388;I3=kab*I2;I1=I2-I3;?%step1%1 電極子的產生過程%%generation%I1傳輸t=0:pre:a/vel-pre;ra1=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*t).^2);%向右ra2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z).^2);ra3=ra2;rb1=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*t).^2);%向左rb2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z).^2);rb3=rb2;sfap=(-I1./ra1+I2./ra2-I3./ra3-I3./rb3+I2./rb2-I1./rb1)/(2*pi*delta_r);?%I2傳輸t=a/vel:pre:b/vel-pre;ra1=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*t).^2);ra2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*t+a).^2);ra3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z).^2); %向右?rb1=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*t).^2);rb2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*t-a).^2);rb3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z).^2); %向左?temp=(-I1./ra1+I2./ra2-I3./ra3-I3./rb3+I2./rb2-I1./rb1)./(2*pi*delta_r);sfap=[sfap,[temp]];clear temp?clear ra1 ra2 ra3 rb1 rb2 rb3%step2%2 整個電極子的傳輸過程%由于肌纖維左右長度的不同,下面分別考慮左右電極子的傳輸過程%右邊極子的傳輸和消失過程%開始產生I3%%transmissiontR=b/vel:pre:len_fiberR/vel-pre;r1=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR).^2);r2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR+a).^2);r3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR+b).^2);%右邊電極子的消失過程,%%extinction%I1在肌鍵(肌纖維末端)處恒定,I2和I3向肌鍵移動tR1=len_fiberR/vel:pre:(len_fiberR+a)/vel-pre;ra1=zeros(1,length(tR1));ra1(1:end)=sqrt((dist_x^2+dist_y^2)*delta+(len_fiberR-dist_z).^2);ra2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR1+a).^2);ra3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR1+b).^2); %向右%I1和I2在肌鍵(肌纖維末端)處恒定,I3向肌鍵移動%tR2=(len_fiberR+a)/vel:pre:(len_fiberR+b-a)/vel;tR2=(len_fiberR+a)/vel:pre:(len_fiberR+b)/vel;raa1=zeros(1,length(tR2));raa1(1:end)=sqrt((dist_x^2+dist_y^2)*delta+(len_fiberR-dist_z).^2);raa2=raa1;raa3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z-vel.*tR2+b).^2);%向右?%對右邊極子的組合Re1=[r1 ra1 raa1]; %I1Re2=[r2 ra2 raa2]; %I2Re3=[r3 ra3 raa3]; %I3?%左邊極子的傳輸和消失過程%%transmissiontL=b/vel:pre:len_fiberL/vel-pre;r4=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL-b).^2);r5=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL-a).^2);r6=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL).^2);%%extinction%I1在肌鍵(肌纖維末端)處恒定,I2和I3向肌鍵移動tL1=len_fiberL/vel:pre:(len_fiberL+a)/vel-pre;rb1=zeros(1,length(tL1));rb1(1:end)=sqrt((dist_x^2+dist_y^2)*delta+(len_fiberL+dist_z).^2);rb2=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL1-a).^2);rb3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL1-b).^2); %向左%I1和I2在肌鍵(肌纖維末端)處恒定,I3向肌鍵移動%tL2=(len_fiberL+a)/vel:pre:(len_fiberL+b-a)/vel;tL2=(len_fiberL+a)/vel:pre:(len_fiberL+b)/vel;rbb1=zeros(1,length(tL2));rbb1(1:end)=sqrt((dist_x^2+dist_y^2)*delta+(len_fiberL+dist_z).^2);rbb2=rbb1;rbb3=sqrt((dist_x^2+dist_y^2)*delta+(dist_z+vel.*tL2-b).^2); %向左?%對左邊極子的組合Le1=[r6 rb1 rbb1]; %I1Le2=[r5 rb2 rbb2]; %I2Le3=[r4 rb3 rbb3]; %I3?%step3%根據肌纖維左右長度的不同,計算產生的動作電位fiber_right=length(Re3);fiber_left=length(Le3);?if fiber_right<=fiber_left temp=(-I1./Re1+I2./Re2-I3./Re3-I3./Le3(1:fiber_right)+I2./Le2(1:fiber_right)-I1./Le1(1:fiber_right))./(2*pi*delta_r); sfap=[sfap,[temp]]; clear temp temp=(-I3./Le3(fiber_right+1:end)+I2./Le2(fiber_right+1:end)-I1./Le1(fiber_right+1:end))./(2*pi*delta_r); sfap=[sfap,[temp]]; clear tempelse temp=(-I1./Re1(1:fiber_left)+I2./Re2(1:fiber_left)-I3./Re3(1:fiber_left)-I3./Le3+I2./Le2-I1./Le1)./(2*pi*delta_r); sfap=[sfap,[temp]]; clear temp temp=(-I1./Re1(fiber_left+1:end)+I2./Re2(fiber_left+1:end)-I3./Re3(fiber_left+1:end))./(2*pi*delta_r); sfap=[sfap,[temp]]; clear tempendtemp=sfap;sfap=zeros(1,length(temp)+1);sfap(1:length(temp))=temp;?3 仿真結果
4 參考文獻
[1]李向明. 基于Matlab的表面肌電信號處理軟件設計與開發[D]. 上海體育學院.
博主簡介:擅長智能優化算法、神經網絡預測、信號處理、元胞自動機、圖像處理、路徑規劃、無人機等多種領域的Matlab仿真,相關matlab代碼問題可私信交流。
部分理論引用網絡文獻,若有侵權聯系博主刪除。
總結
以上是生活随笔為你收集整理的基于Matlab的表面肌电信号处理软件设计与开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL查询select语句详解
- 下一篇: 远程控制python