基于数据波动性的分割算法

我们常见的分割算法有很多种,比如能量法,包络线法之类的,但这些算法难以实现实时分割,今天我给大家分享一个原创的分割算法,是在以前项目中用过的,这两天加以优化,最中整理了一个MATLAB版本的,给大家分享一下。

算法的原理简单介绍一下:

这里给出了一段肌音信号(已经分割好了),是用加速度传感器在手上采集的,每次完成一次动作,就会产生一个数据波动,如果我们需要分析这样一段信号的特征,需要先将这些信号分割出来。

 

我们在分析时,主要任务时提取出信号帧起始点对应的数据索引,这里我写了一个分割函数:

function [ST, EN] = SignalDivision(A)

%%宏定义
AF1 = 2;    %放大因子,计算ADD
AF2 = 16;    %放大因子,延申长度
AF3 = 3.5;    %放大因子,判断Frame
MAE = 0.95; %移动平均系数

%%中间变量
L = max(size(A));
AS = MeanAverSlope_3(A);
Sigma = std(A);
ADD = AF1 * (Sigma / AS);
JF = false;
FF = false;
Counter = 1;
Index = 1;
MA = 0;

st = zeros(1, L);
en = zeros(1, L);
ST = zeros(1, L);
EN = zeros(1, L);

DATA_P = zeros(1, L - 1);
DATA_A = zeros(1, L - 2);
DATA_P(1) = A(1);
for i = 2 : L - 1
    DATA_P(i) = DATA_P(i-1) * MAE + A(i) * (1 - MAE); %移动平均
    DATA_A(i-1) = abs(A(i) - DATA_P(i));
    if DATA_A(i-1) > Sigma && ~JF
        JF = true;
        st(Counter) = i - ADD * AF2;
        if ~FF
            ST(Index) = st(Counter);
            FF = true;
        end
    elseif abs(DATA_A(i-1) < Sigma) && JF
        JF = false;
        en(Counter) = i + ADD * AF2;
        sep = en(Counter) - st(Counter);
        Counter = Counter + 1;
    end
    if JF
        if DATA_A(i-1) > MA
            MA = DATA_A(i-1);
        end
    elseif FF
        if i - en(Counter - 1) >sep
            EN(Index) = en(Counter - 1);
            FF = false;
            if MA > Sigma * AF3
                Index = Index + 1;
            end
            MA = 0;
        end
    end
end

ST(ST==0)=[];
EN(EN==0)=[];
function [AS] = MeanAverSlope_3(A)

L = max(size(A));
ALS = zeros(L-1, 1);
for i = 2:L
    ALS(i-1) = abs((A(i) - A(i-1)));
end

AS = mean(ALS);

这个函数主要工作机制是:

1,计算整个波段的数据波动性,用一个“平均斜率”的参数表征,即MeanAverSlope_3 函数的功能,然后再利用公式计算数据的标准差(C/C++的朋友可以自己写一个计算标准差的函数),ADD是断点延伸长度,因为我们判定产生动作的位置比较靠近数据峰值,因此起点需要往前扩展一定距离,终点往后扩展,而ADD即为扩展的长度。

2,利用移动平均的思想消除低频噪音,这些无效的信号往往是由于手的缓慢移动等因素而产生的。我们可以对比消除前后的数据图形:

消除前:

消除后:

对比过后,是不是就感觉这样一处理分割起来就简单多了

3,判断数据的跳动性,当数据跳动值大于Sigma时,判定数据有跳动,记录当前对应点的索引值,当一段时间之内还有其他值也大于Sigma时,刷新这个时间,如果没有,则判定该跳动结束,并记录结束位置的索引。然而该跳动是否由手的动作而产生还是环境噪音产生,我们还需要对其进行二次判定,当这段截取的信号中最大跳动值大于阈值 AF3*Sigma 时,才判定该动作有效,否则判定是环境因素产生的噪音。

4,整理数据帧的起始索引,存放于两个向量中,并删除其他数据值为0的点(一开始预分配了内存)

至此,我们的数据分割就完成了,接下来就是怎么用的问题了,由于我们对于数据是一个一个导入处理的(在一个大的for循环中),而不是一段一段或者整段处理,因此该算法具有实时性,非常适合在嵌入式设备中应用。

我们看一下对肌音信号的分割效果:

最后,我要感谢吴荣耀同学,在研究这个算法的时候他帮助了我很多。

觉得有帮助的话记得点赞转发哦!

原文地址:https://www.cnblogs.com/showtime20190824/p/11760793.html

时间: 2024-11-10 13:04:10

基于数据波动性的分割算法的相关文章

基于区域增长(RegionGrowing)的分割算法——参照pcl源码

不想做只会调API的程序员,进而重写了pcl::RegionGrowing类(然而还是基于了pcl的数据结构,哎,学习有点迷茫). 分割,顾名思义,按照一定的规律将点云分成一类类的.方便于接下来对点云的操作处理.不同的应用方向会用到不同的分割方法.本篇介绍的基于区域增长的算法,最终达到的理想效果是 点云按照估计的曲率聚类,但本人做了一些小的demo示例之后其实对于实际的应用还是一头雾水(也可能是比较菜吧 /emoji sad/)然而该算法的思想却是可以给做别的提供一些思路. 算法思想:首先根据点

基于Matlab的标记分水岭分割算法

转自:http://blog.sina.com.cn/lyqmath 1 综述 Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins"(

新的学习路径、学习想法和思路的头脑风暴:基于泰迪云课程,对数据分析和数据建模,机器学习算法进行统筹,接着是基于大数据的数据挖掘、进度、

新的学习路径.学习想法和思路的头脑风暴:基于泰迪云课程,对数据分析和数据建模,机器学习算法进行统筹,接着是基于大数据的数据挖掘.进度. 泰迪云代码已经下载,对相关内容进行应用和学习 想通视频之后对代码进行研究 专家经验.优秀经验工程师经验转化. 从论文中第三四大章,读取 设计和解决问题流程 找论文.使用benchmark 上有收录论文.找到论文.不建议自己先去想. 以后一定 偏分析,偏挖掘.偏决策的.不是执行者,执行者是最low的,最强的解决方案,都按论文来找. 高端会议.每年会出来十多篇研究成

mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储

摘自:http://blog.fens.me/mahout-recommendation-api/ 测试程序:RecommenderTest.java 测试数据集:item.csv 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 测试程序:org.conan.mymahout.recommendation.job.RecommenderTest.

(转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)

  转自:http://zengzhaozheng.blog.51cto.com/8219051/1557054 一.概述 这2个月研究根据用户标签情况对用户的相似度进行评估,其中涉及一些推荐算法知识,在这段时间研究了一遍<推荐算法实践>和<Mahout in action>,在这里主要是根据这两本书的一些思想和自己的一些理解对分布式基于ItemBase的推荐算法进行实现.其中分两部分,第一部分是根据共现矩阵的方式来简单的推算出用户的推荐项,第二部分则是通过传统的相似度矩阵的方法来

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

Mahout实现基于用户的协同过滤算法

Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中. package com.mahout.helloworlddemo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.

通用高校排课算法研究----3.基于时间片优先级排课算法

通用高校排课算法研究----3.基于时间片优先级排课算法 3   基于时间片优先级排课算法描述与分析 排课问题实质上是时间.教师.班级.教室.课程这五维关系的冲突问题,要合理的解决这个问题首先要了解排课中的一些基本原则以及排课的一些基本要求. 3.1排课中的基本原则 在课程的编排中应遵循一定的规则, 只有按照基本规则来进行课程的编排才能够减少冲突的发生, 这些基本规则主要有以下几条: 1) 同一班级的学生在同一时间(某些特定的选修课时间除外) 不能安排两门课程 2) 同一教师在同一时间不能安排两

分水岭分割算法

建立不同目标间的分水岭(涨水法). 分水岭计算步骤: 1.设待分割图象为f(x,y),其梯度图象为g(x,y) 2.用M1, M2, -, MR表示g(x, y)中各局部极小值的象素,位置,C(Mi)为与Mi对应的区域中的象素坐标集合 3.用n表示当前灰度阈值,T[n]代表记为(u,v)的象素集合,g(u,v)<n, 4.对Mi所在的区域,其中满足条件的坐标集合Cn(Mi)可看作一幅二值图象 令 S 代表T[n]中的连通组元集合,对每个连通组元 ,s∈S[n],有3种可能性: (1) S ∩ C