肌电信号的识别Word文档格式.docx
《肌电信号的识别Word文档格式.docx》由会员分享,可在线阅读,更多相关《肌电信号的识别Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
比较不同动作下肌电信号特征,根据设定阈值给出动作状态,设计相应的信号分析及显示界面。
2、基于肌电信号分析结果,通过串口发送命令给单片机系统,根据肌电信号动作状态控制相应的数码管或LED发光显示。
3、扩展:
也可通过动作模式驱动电机转动或其他控制输出模块。
工
作
量
软件编程与硬件调试相结合,绘制设计流程图,编制相应软件界面,实现单片机控制与信号处理任务的综合应用
考
资
料
1)《微型计算机控制系统》赖寿宏,机械工业出版社(教材)
2)《单片机及应用》李大友,高等教育出版社(教材)
3)《信号处理原理及应用》谢平等机械工业出版社(教材)
4)《Matlab程序设计及其在信号处理中的应用》聂祥飞等西南交通大学出版社
周次
第一周
第二周
应
完
成
内
容
熟悉伟福单片机编程环境,调试单片机各基本功能模块;
熟悉matlab信号处理工具箱,信号处理系统基本功能模块学习和调试
单片机系统与信号处理系统综合进行硬件调试,
撰写课程设计报告
指导教
师签字
基层教学单位主任签字
第一章摘要………………………………………………………………2
第二章系统总体设计方案…………………………………………………3
第三章肌电信号的时域参数处理及其分析……………………………4
第四章肌电信号的频域处理方法及其分析……………………………7
3.1FFT分析……………………………………………………………7
3.2功率谱分析…………………………………………………………8
3.3倒谱分析……………………………………………………………9
3.4平均功率频率MPF和中值频率…………………………………10
第五章Matlab程序及GUI…………………………………………………11
第六章系统整体调试及结果说明………………………………………24
第七章学习心得…………………………………………………………24
参考文献……………………………………………………………………25
第一章摘要
肌电信号是产生肌肉力的电信号根源,它是肌肉中很多运动单元动作电位在时间和空间上的叠加,反映了神经,肌肉的功能状态,在基础医学研究、临床诊断和康复工程中有广泛的应用。
其种类重要有两种:
一,临床肌电图检查多采用针电极插入肌肉检测肌电图,其优点是干扰小,定位性好,易识别,但由于它是一种有创伤的检测方法,其应用收到了一定的限制。
二,表面肌电则是从人体皮肤表面通过电极记录下来的神经肌肉活动时发放的生物电信号,属于无创伤性,操作简单,病人易接受,有着广泛的应用前景。
主要应用领域有:
一,仿生学。
提出肌肉生理模型来判别肌肉的动作以来,电子假肢的研究进入了新的发展时期,过去电子假肢的控制靠使用者人为开关和选择运动模式来完成,现在则可通过检测人体残肢表面肌电信号,提取出肢体的动作特征,来自动控制假肢运动,利用残肢表面肌电信号的肌电假肢研制在国内外都取得较大进展。
二,康复工程。
如利用表面肌电信号提取出的特征作为功能性电刺激的控制信号,帮助瘫痪的肢体恢复运动功能。
通过检测表面肌电信号,并将其作为反馈信号提供给病人和医生,便于进行合理的治疗和训练。
三,运动医学。
表面肌电信号在运动医学中也可发挥重要作用,通过检测运动员运动时的表面肌电信号,及时反映出肌肉的疲劳和兴奋状态,有助于建立科学的训练方法。
本次课程设计的主要任务就是对微弱的肌电信号进行时域和频域的处理及分析,运用数字处理及matlab的知识进行“屈”和“伸”动作识别。
然后通过串口将数据发送到单片机下行微机进行显示。
第二章系统总体设计方案
根据课程设计要求在上微机利用matble分析肌电信号并处理,基于肌电信号分析结果,通过串口发送命令给单片机系统,根据肌电信号动作状态控制相应的数码管显示。
并增加了扩展模块,通过动作模式驱动电机转动或其他控制输出模块。
通过分析上位机matlab中对信号处理的结果,我们可以得到一系列的信号特征值,其中我们选取了具有代表意义积分肌电值来进行处理,并给出对于屈伸动作的阈值。
通过对阈值的判断,使数码管显示积分肌电值,使点阵模块显示相应的“屈”和“伸”字样,使电机根据动作进行正反转,蜂鸣器在“屈”动作是发出鸣响。
最后,将上微机的处理数据通过串口通信发送到下微机显示,得到动作识别的要求。
第三章肌电信号的时域参数处理及其分析
(1)均值:
对于一组随机变量来说,均值是一个很重要的数值特征,用来描述一组变量的平均水平。
其严格的数学定义非常简单,就是一个随机变量关于概率测度的积分。
因此,在此处,均值表示肌电信号的平均水平。
公式如下:
(2)方差:
方差是各个数据与平均数之差的平方的平均数。
在数理统计和概率论中,方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
在此处,研究信号的随机变量和均值之间的偏离程度有着很重要的意义。
其求解公式如下:
(3)标准差:
标准差也称均方差,是各数据偏离平均数的距离的平均数,它是离均差平方和平均后的方根,用u表示。
标准差是方差的算术平方根。
标准差能反映一个数据集的离散程度。
所以能很好的反映肌电信号的离散程度。
求解公式如下:
(4)积分肌电值IEMG:
积分肌电值就是对所有信号取绝对值后尽心均值的求解,由于对肌电信号直接求均值,均值近似为零,无法表征信号间的差异。
若对肌电信号取绝对值后再进行均值运算后,均值恒大于零,因而可用于提取肌电信号的特征。
(5)均方根RMS:
均方根就是一组数据的平方和除以数据的个数再开方,均方根是最理想的平方滤波方式的典型,让滤波更平滑,更大限度的滤掉噪声。
因此,对肌电信号求均方根,可以滤除信号中的噪声,使滤波后的信号更平滑、更明显。
(6)原始信号的时域及上述参数值的Matlab程序
clear;
closeall;
a=load('
qu.txt'
);
//('
shen.txt'
N=10000;
b=0:
N-1;
axis([0,10000,-1,1]);
plot(b,a);
xlabel('
时间(s)'
ylabel('
被测变量y'
gridon;
fprintf('
\n数据基本信息:
\n'
)
printf('
均值=%7.5f\n'
mean(a));
标准差=%7.5f\n'
sqrt(var(a)));
方差=%7.5f\n'
var(a));
积分肌电值IEMG=%7.5f\n'
mean(abs(a)));
均方根有效值RMS=%7.5f\n'
sqrt(mean(a.^2)));
屈信号数据基本信息:
均值=0.03502
标准差=0.05775
方差=0.00334
积分肌电值IEMG=0.05437
均方根RMS=0.17246
伸信号数据基本信息:
均值=0.00337
标准差=0.24421
方差=0.05964
积分肌电值IEMG=0.12826
均方根RMS=0.19993
第四章肌电信号的频域处理方法及其分析
3.1FFT分析:
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。
有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。
这就是很多信号分析采用FFT变换的原因。
另外,FFT可以将一个信号的频谱提取出来。
采样得到的数字信号FFT变换。
N个采样点,经过FFT之后,就可以得到N个点的FFT结果。
为了方便进行FFT运算,通常N取2的整数次方。
假设采样频率为Fs,信号频率F,采样点数为N。
那么FFT之后结果就是一个为N点的复数。
每一个点就对应着一个频率点。
这个点的模值,就是该频率值下的幅度特性。
而每个点的相位就是在该频率下的信号的相位。
如果要要提高频率分辨率,就需要增加采样点数,也即采样时间。
频率分辨率和采样时间是倒数关系。
Matlab实现:
/'
y=fft(a,1024);
%做1024点傅立叶变换
fs=1000;
N=length(y);
mag=abs(y);
f=(0:
N-1)/N*fs;
figure;
plot(f,mag);
%幅频谱
频率'
幅值'
title('
(屈/伸)肌电幅频'
plot(f,angle(y));
%相频谱
相位'
(屈/伸)肌电相频'
3.2功率谱分析:
功率谱是信号或噪声的自相关函数的傅里叶变换。
如果一确定信号平均功率为有限的,则该信号的自相关函数存在,如随机信号或随机噪声是由二阶随机平稳函数表示的,则其自相关函数存在。
为了更好得描述能量信号、功率信号,我们引入能量谱密度和功率谱密度概念。
能量谱密度、功率谱密度函数表示信号的能量、功率密度随频率变化的情况。
通过研究功率谱密度,可以帮助了解信号的功率分布情况,确定信号的频带等。
信号的功率谱即上述FFT分析后,幅频值mag的平方再除以2得到。
功率密度谱虽然描述了随机信号的功率在各个不同频率上的分布,但因为它仅与幅度频谱有关,没有相位信息,所以从已知功率谱还难以完整地恢复原来的功率信号。
)
%做1024点傅里叶变换
power1=(mag.^2)/2;
%周期图法求功率谱
plot(f,power1);
频谱'
功率谱'
(屈/伸)肌电信号功率谱'
3.3倒谱分析:
倒谱是信号的傅里叶变换谱经对数运算后再进行的傅里叶反变换或者功率谱的对数值的逆傅氏变换称为倒谱。
倒频谱函数C(q)(powercepstrum)其数学表达式为:
C(q)=|IF(log(s(f)))|^2。
其中,s(f)是信号s(t)的傅里叶变换,log()为取对数,IF为逆傅里叶变换。
Matlab实现:
前100点的倒谱变化比较明显,所以取前100点波形图。
y=fft(a,1024);
%做1024点傅里叶变换
w=rceps(a);
%求倒谱
n=[1:
100];
plot(n,w(1:
100));
时间'
ylabel('
倒谱'
(屈/伸)肌电信号倒谱'
3.4平均功率频率MPF和中值频率MF:
平均功率频率是总功率除以总时间。
中值频率是各个时间段的功率的平均值。
Matlab实现:
a=load('
%做10000点傅里叶变换
power=(mag.^2)/2;
ss=sum(power);
M2=0.5*ss;
df=fs/N;
M1=0.5*df*(sum(power(1:
N-1))+sum(power(2:
N)));
MPF=M1/M2;
MF=M2/2;
第五章Matlab程序及GUI
MATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。
同时由于MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为肌电信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便地完成肌电信号的处理和分析,再通过GUI界面设计,显示信号处理后的结果,方便简明。
打开GUI设计界面,根据要求添加相应的按钮,并对按钮进行定义,调整界面整体布局,将界面运行,会产生相应的程序。
在程序中,寻找相应的按钮定义,在定义下添加该按钮要实现的功能函数。
然后对整个程序进行调试验证。
得到可视化GUI界面及功能的实现。
程序如下:
functionvarargout=untitled20(varargin)
%UNTITLED20M-fileforuntitled20.fig
%UNTITLED20,byitself,createsanewUNTITLED20orraisestheexisting
%singleton*.
%
%H=UNTITLED20returnsthehandletoanewUNTITLED20orthehandleto
%theexistingsingleton*.
%UNTITLED20('
CALLBACK'
hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinUNTITLED20.Mwiththegiveninputarguments.
Property'
'
Value'
...)createsanewUNTITLED20orraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforeuntitled20_OpeningFunctiongetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtountitled20_OpeningFcnviavarargin.
%*SeeGUIOptionsonGUIDE'
sToolsmenu.Choose"
GUIallowsonlyone
%instancetorun(singleton)"
.
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpuntitled20
%LastModifiedbyGUIDEv2.501-Jul-201316:
55:
28
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
@untitled20_OpeningFcn,...
gui_OutputFcn'
@untitled20_OutputFcn,...
gui_LayoutFcn'
[],...
gui_Callback'
[]);
ifnargin&
&
ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforeuntitled20ismadevisible.
functionuntitled20_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstountitled20(seeVARARGIN)
%Choosedefaultcommandlineoutputforuntitled20
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesuntitled20waitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=untitled20_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%---Executesonbuttonpressinqu.
functionqu_Callback(hObject,eventdata,handles)
%hObjecthandletoqu(seeGCBO)
a=load('
axes(handles.axes1);
plot(a);
xlabel('
ylabel('
title('
(屈)原始信号'
gridon;
A=mean(a);
%平均值
B=std(a);
%标准差
C=Var(a);
%方差
D=mean(abs(a));
%积分机电值
E=sqrt(mean(a.^2));
%均方根有效值RMS
y=fft(a,10000);
fs=1000;
N=length(y);
mag=abs(y);
f=(0:
power=(mag.^2)/10000;
%功率谱
ss=sum(power);
M2=0.5*ss;
df=fs/N;
M1=0.5*df*(sum(power(1:
F=M1/M2;
G=M2/2;
%[A,B,C,D,E,F]=index_calculation(a);
%设置显示
A1=A*100000;
A2=round(A1);
A3=A2/100000;
%round函数是对数据取整,以此限制数据的有效位
set(handles.pingjunzhi,'
string'
num2str(A3));
B1=B*100000;
B2=round(B1);
B3=B2/100000;
set(handles.biaozhuncha,'
num2str(B3));
C1=C*100000;
C2=round(C1);
C3=C2/100000;
set(handles.fangcha,'
num2str(C3));
D1=D*100000;
D2=round(D1);
D3=D2/100000;
set(handles.jifenjidianzhi,'
num2str(D3));
E1=E*100000;
E2=round(E1);
E3=E2/100000;
set(handles.junfanggen,'
num2str(E3));
F1=F*100000;
F2=round(F1);
F3=F2/100000;
set(han