资源简介

此压缩包的主要内容为表面肌电端点检测研究,是基于短时能量及方差和作为双门限来获取信号端点的,与网上部分文献类似,但纠正了一些小错误,并加以改进,可作为表面肌电处理基础学习的一个参考; 同时,里面包含了3个表面肌电信号数据文档,可直接使用,还包含应用到的voicebox数据包(程序中有相应网址说明如何安装) 数据包包括:main.m(主程序),endpoint_detection.m(端点检测程序),2018083001-1.xlsx、2018083001-2.xlsx、2018083001-3.xlsx(3个表面肌电数据),voicebox.rar(工具包)

资源截图

代码片段和文件信息

function [x1x2] = endpoint_detection(x)
 
%%==运行程序之前先在命令窗口运行下段代码,用以添加voicebox工具箱==%%
%  cd D:\Program Files\MATLAB\R2010b\toolbox
%  path(‘ D:\Program Files\MATLAB\R2010b\toolbox\voicebox‘path)
%%==运行程序之前先在命令窗口运行上段代码,用以添加voicebox工具箱==%%
%注:voicebox工具箱的添加方式有两种,其中一种是永久的,具体方法详见:
%https://blog.csdn.net/jojozhangju/article/details/19337165

%幅度归一化到[-11],是为了加快数据收敛
%本试验使用的是4通道,根据具体情况可整体修改
x = double(x);
x(:1) = x(:1) / max(abs(x(:1)));        %01通道数据进行幅度归一化处理
x(:2) = x(:2) / max(abs(x(:2)));        %02通道数据进行幅度归一化处理
x(:3) = x(:3) / max(abs(x(:3)));        %03通道数据进行幅度归一化处理
x(:4) = x(:4) / max(abs(x(:4)));        %04通道数据进行幅度归一化处理
nx=length(x(:1));                         %获取01通道数据长度

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%这里使用的是加窗的方式,即将原来的数据分成多个小窗,并添加一定的窗移,这样就能这
%段信号从头到尾处理一遍
%常数设置
frameLen = 64;                             %帧长为64点,可按实际情况而定
frameInc = 20;                             %帧移为20点,可按实际情况而定
 
energy =0.02;                              %初始短时能量低门限,这个是自己随便
                                           %定的,仿真过程中可自行修改,查看下其规律
sum_s=0.3;                                 %表征波动的方差和低门限,这个同样是
                                           %自己随便定的

%对4通路开始信号分帧
channal1  = enframe(x(1:end-11) frameLen frameInc);%enframe为分帧函数,是对x(1:end-1)分帧,帧长frameLen,帧移frameInc
channal2  = enframe(x(1:end-12) frameLen frameInc);%返回值channal1是nf(帧数)x frameLen(帧长)的数组,每一行是一帧
channal3  = enframe(x(1:end-13) frameLen frameInc);
channal4  = enframe(x(1:end-14) frameLen frameInc);
nf = fix((nx-frameLen+frameInc)/frameInc);%nf帧数
% x_nf=nf;
energy_frame=zeros(1nf);                  
sum_s_frame=zeros(1nf);
channal_energy=zeros(14);%要与上面的数量一致,这里是4;
channal_sum_s=zeros(14);%要与上面的数量一致,这里是4;
for i=1:nf-1
    %求8路通道的每帧能量
    channal_energy(1)=sum(channal1(i:).^2);
    channal_energy(2)=sum(channal2(i:).^2);
    channal_energy(3)=sum(channal3(i:).^2);
    channal_energy(4)=sum(channal4(i:).^2);
    energy_frame(i)=sum(channal_energy)/64;%energy_frame数组存放着每帧数据的短时能量,因为之前的帧长是64,所以为了求每帧的帧长,则需要再除以一个64
    channal_sum_s(1)=sum((channal1(i:)-mean(channal1(i:))).^2);%这个原来网上常见的程序存在个小错误,此处已改正
    channal_sum_s(2)=sum((channal2(i:)-mean(channal2(i:))).^2);
    channal_sum_s(3)=sum((channal3(i:)-mean(channal3(i:))).^2);
    channal_sum_s(4)=sum((channal4(i:)-mean(channal4(i:))).^2);
    sum_s_frame(i)=sum(channal_sum_s)/64.0;%sum_s_frame数组存放着每帧数据的方差和
end

%调整能量门限
%说明,之前网上的程序使用的门限是energy、sum_s,这里进行了修改,通过研究发现
%energy对起止点选择不如sum_s的大,且可以选取不同的sum_s值,使得起点、终点的条件不同,更灵活一些
energy=min(energy0.02*max(energy_frame))%里面的0.02及下面的0.01、0.28是可以自己改的,如果可以的话,也可以采用自适应的方法,自动调整参数
sum_s1=min(sum_s0.01*max(sum_s_frame))
sum_s2=min(sum_s0.28*max(sum_s_frame))
%开始端点检测
x1=0;
x2=0;
for k=1:nf-1
    if energy_frame(k)>energy&sum_s_frame(k)>sum_s2
        x1=k;
        break;
    end
end
for m=x1:nf-1
    if energy

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     976526  2018-10-06 21:13  表面肌电端点检测研究主程序\2018083001-1.xlsx

     文件     355891  2018-10-05 23:45  表面肌电端点检测研究主程序\2018083001-2.xlsx

     文件     399416  2018-10-05 23:46  表面肌电端点检测研究主程序\2018083001-3.xlsx

     文件       3692  2018-10-14 10:18  表面肌电端点检测研究主程序\endpoint_detection.m

     文件       5684  2018-10-14 10:17  表面肌电端点检测研究主程序\main.m

     文件     619236  2018-10-14 09:32  表面肌电端点检测研究主程序\voicebox.rar

     目录          0  2018-10-14 10:24  表面肌电端点检测研究主程序

----------- ---------  ---------- -----  ----

              2360445                    7


评论

共有 条评论