0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

给大家介绍一种信号波峰波谷的检测方法

FPGA之家 来源:最后一个bug 作者:bug菌 2022-07-15 09:11 次阅读

1、聊一聊

其实每个人在无助的时候都需要一句"Cry On My Shoulder!" 今天跟大家介绍一种波峰波谷的检测方法,不是很难,不过能够凸显数学在编程算法中的重要作用。

2、正文部分

波峰波谷用处

对于信号波峰波谷识别在嵌入式领域应该是非常广泛的,因为大部分的信号都处于一种时变的状态,信号在时域上处于一种类似于正弦波的波动状态。

比如计步软件就是通过IMU模块所采集的变化的波形状态来识别波峰波谷,最终估算你所走过步数;

poYBAGLQvuuAQc30AACT_VSdTeQ646.jpg

上图显示了一个典型的x-, y-和z-测量模式,对应于一个跑步者的垂直,向前和侧面加速度。无论如何佩戴计步器,至少有一个轴会有相对较大的周期性加速度变化,因此通过检测其波峰波谷等算法即可对于检测步行或跑步的单位周期至关重要。

poYBAGLQvwWAJnfoAACQItOSEpc614.jpg

还有在电力系统中的交流电压电流,我们需要通过检测波峰波谷来确定电压电流在交流周期中的最大最小值,从而动态调节系统参数来达到自适应的目的,所以波峰波谷的检测是非常有用的。

比较法识别

常规的设计办法为比较法 : 其中x表示当前采样点

波峰:f(x) > f(x−1) 且 f(x) > f(x+1)

波谷:f(x) < f(x−1) 且 f(x) < f(x+1)  

然而这样识别对于没有什么噪声,且每个采样点为不同的信号来说还是合适的,但在严苛的环境中还需要构造更多的判断条件来进行一些错误判断的规避,终究还是麻烦了一些,并且容易遗漏。

差分识别

在学生阶段我们就学习了导数的概念,如果一个函数一阶导数左右异号,那分别就是波峰或者波谷。而对于数字信号的处理通过采样都会变成离散信号,信号对时间的微分在离散域内即为差分。 在进行波形识别之前数据采集是必不可少的,其中最重要的是采样速率和精度,以便从采样信号中不失真的恢复原连续信号。(香农采样) 采样的过程中由于电子器件的杂讯等,数据难免会引入噪声,为了简化识别算法一般都会进行滤波处理,比如一些平滑处理等,然后才开始波峰波谷识别。

A、识别算法过程

1、获得采样点序列

2、进行差分处理

3、由于不在乎具体的差分幅值,把所有数据归一到-1,0,1

poYBAGLQvzmANzzcAAAS3AiVbH8693.jpg

4、差分值为0的点即为相同点,如果使用比较法则峰值检测可能失效,便需要更多的条件,而这里我们直接把相同点0置为前一个非0即可规避该问题。

poYBAGLQv0mAEs3MAAAWVIO10bM790.jpg

5、最终Diff再次进行差分,-2/+2即为波峰/波谷。

poYBAGLQv2WADrY9AACkzNnKljM736.jpg


B、参考代码

  1#include
  2#include
  3#defineSAMPLE_MAX20
  4#definePV_MAX10
  5
  6floatSample[SAMPLE_MAX]={1,2,3,4,4,4,5,2,1,0,0,5,1,0,0,1,2,3,4,0};
  7floatSampleDiff[SAMPLE_MAX]={0};
  8
  9typedefstruct_tag_FindPV
 10{
 11intPos_Peak[PV_MAX];//波峰位置存储
 12intPos_Valley[PV_MAX];//波谷位置存储
 13intPcnt;//所识别的波峰计数
 14intVcnt;//所识别的波谷计数
 15}SFindPV;
 16
 17SFindPVstFindPV;
 18
 19/********************************************
 20*Fuction:initialFindPV
 21*Note:初始化相关数据
 22*******************************************/
 23voidinitialFindPV(void)
 24{
 25intIndex=0;
 26
 27for(Index=0;Index< SAMPLE_MAX;Index ++)
 28    {
 29        SampleDiff[Index] = 0;
 30    }
 31
 32    for(Index = 0; Index < PV_MAX;Index ++)
 33    {
 34        stFindPV.Pos_Peak[Index] = -1;
 35        stFindPV.Pos_Valley[Index] = -1;
 36    }
 37    stFindPV.Pcnt = 0;
 38    stFindPV.Vcnt = 0;
 39
 40}
 41
 42/********************************************
 43 *  Fuction : FindPV
 44 *  Note    : 找波峰波谷 
 45 *******************************************/ 
 46void FindPV(SFindPV *pFindPV,float *Sample)
 47{
 48    int i = 0;
 49
 50    //step 1 :首先进行前向差分,并归一化
 51    for(i= 0; i < SAMPLE_MAX - 1; i++)
 52    {
 53        if (Sample[i + 1] - Sample[i]>0)
 54SampleDiff[i]=1;
 55elseif(Sample[i+1]-Sample[i]< 0)
 56            SampleDiff[i] = -1;
 57        else
 58            SampleDiff[i] = 0;
 59    }
 60
 61    //step 2 :对相邻相等的点进行领边坡度处理
 62    for(i= 0; i < SAMPLE_MAX-1; i++)
 63    {
 64        if(SampleDiff[i] == 0)
 65        {
 66            if(i == (SAMPLE_MAX-2))
 67            {
 68                if (SampleDiff[i - 1] >=0)
 69SampleDiff[i]=1;
 70else
 71SampleDiff[i]=-1;
 72}
 73else
 74{
 75if(SampleDiff[i+1]>=0)
 76SampleDiff[i]=1;
 77else
 78SampleDiff[i]=-1;
 79}
 80
 81}
 82}
 83
 84//step3:对相邻相等的点进行领边坡度处理
 85for(i=0;i< SAMPLE_MAX-1; i++)
 86    {
 87        if(SampleDiff[i + 1] - SampleDiff[i] == -2) //波峰识别
 88        {
 89            pFindPV->Pos_Peak[pFindPV->Pcnt]=i+1;
 90pFindPV->Pcnt++;
 91}
 92elseif(SampleDiff[i+1]-SampleDiff[i]==2)//波谷识别
 93{
 94pFindPV->Pos_Valley[pFindPV->Vcnt]=i+1;
 95pFindPV->Vcnt++;
 96}
 97}
 98}
 99
100/********************************************
101*Fuction:main
102*Note:模拟查找波峰波谷
103*******************************************/
104intmain(intargc,char*argv[]){
105
106inti=0;
107
108initialFindPV();
109
110FindPV(&stFindPV,Sample);
111
112printf("Peak
");
113for(i=0;i< stFindPV.Pcnt;i++)
114    {
115        printf("-%d",stFindPV.Pos_Peak[i] + 1);  //加1是为了与上图横坐标一致 
116    }
117
118    printf("
Valley
");
119    for(i = 0 ;i< stFindPV.Vcnt;i++)
120    {
121        printf("-%d",stFindPV.Pos_Valley[i] + 1);
122    }
123
124    printf("

");
125    printf("欢迎关注:最后一个bug
");
126    return 0;
127}

pYYBAGLQv4iAHceZAAArVu74LYY266.jpg

2、最后

当然在实际的项目中为了更加稳定的识别波峰波谷可能会对波峰波谷的出现特点进行限制,从而进一步减少误识别,也有许多人使用数据拟合的办法来识别波峰波谷,那么识别的准确度就与所拟合的函数有关,通过数学方法对所拟合函数进行波峰波谷的求解,最终得到信号的波峰波谷,不过这样的拟合过程对平台的处理能力提出了一定的要求。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5057

    文章

    18964

    浏览量

    301819
  • 正弦波
    +关注

    关注

    11

    文章

    633

    浏览量

    55203
  • 计步器
    +关注

    关注

    4

    文章

    76

    浏览量

    19884

原文标题:信号波峰波谷二阶差分识别算法

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问buf602输出为什么波峰波谷凹进去了?

    buf602输出为什么波峰波谷凹进去了
    发表于 08-09 08:22

    在labview中如何检测定时长的波峰波谷..

    如图中 为实时采集的信号,只看蓝色部分,红色的线为当前时间线,如何设置个如图的黑色的时间窗,实时观测前面10ms内的数据,用以检测黑色时间段的 波峰
    发表于 06-23 09:44

    请问如何精确计算这个电路电源输出的波峰波谷

    请问各位专家,如何精确计算这个电路电源输出的波峰波谷,比较器搭建的电路类似迟滞比较器,,但是比较器正端没有串联电阻,无法按照迟滞比较器的公式计算。困惑了很久
    发表于 12-17 13:47

    请问如何解决ADC AD77xx数据采集出来正弦波波峰波谷缺陷问题?

    版主在逛其他网站的时候,看到个ADC AD77XX数据采集出来正弦波波峰波谷缺陷的问题 ,分享过来,供大家参考~ 也欢迎各位大侠就此问题展开讨论 差分正弦波输入到AD77xx 采集(
    发表于 01-18 14:15

    基于LabVIEW8.2的信号处理方法

    法[6]、小波变换法[7,8]、神经网络法[8]等。这些方法各有所长,但还没有一种堪称完美。在数据分析过程中,这些方法都要对时域内包括噪声在内的所有信号样本点进行
    发表于 04-17 09:40

    在DSP平台下对多路交流信号采样时采用的一种异步采样方法介绍

    本文介绍一种在DSP平台下对多路交流信号采样时采用的一种异步采样方法
    发表于 04-02 07:01

    大家介绍一种PCB设计复用方法

    本文介绍一种PCB设计复用方法,它是基于Mentor Graphics的印制电路板设计工具Board Station进行的。
    发表于 05-06 07:10

    大家介绍一种软件修正方法

    本文介绍一种三轴正交型传感器正交性的软件修正方法
    发表于 05-07 06:53

    介绍一种按键检测电路

    介绍一种按键检测电路
    发表于 01-18 07:41

    【Labview】识别标记波峰波谷

    查找波形的波峰波谷,在信号分析选板查找 Waveform Peak Detection 函数功能块,该函数输入波形输出和相关配置参数,第个输出是最值的所在位置数组,第二个是输出最值
    发表于 10-27 21:43

    一种基于BP网络的信号动态检测方法

    本文阐述了BP 网络在信号处理领域的基本原理、方法和模型。文中指出了传统信号检测方法的局限性,并利用BP 网络强大的学习、并行运算能力和非线
    发表于 08-06 08:51 19次下载

    一种用CPLD实现视频信号运动检测方法

    摘要: 介绍一种采用CPLD外加SRAM存储芯片,对ITU601格式数字视频信号进行运动检测方法。在此基础上,给出了
    发表于 06-20 14:31 735次阅读
    <b class='flag-5'>一种</b>用CPLD实现视频<b class='flag-5'>信号</b>运动<b class='flag-5'>检测</b>的<b class='flag-5'>方法</b>

    一种多点脉搏信号检测方法

    一种多点脉搏信号检测方法:
    发表于 03-30 15:41 22次下载
    <b class='flag-5'>一种</b>多点脉搏<b class='flag-5'>信号</b><b class='flag-5'>检测</b><b class='flag-5'>方法</b>

    信号波峰波谷的用处与检测方法及实战

    对于信号波峰波谷识别在嵌入式领域应该是非常广泛的,因为大部分的信号都处于一种时变的状态,信号在时
    的头像 发表于 03-21 11:16 6706次阅读
    <b class='flag-5'>信号</b><b class='flag-5'>波峰</b><b class='flag-5'>波谷</b>的用处与<b class='flag-5'>检测</b><b class='flag-5'>方法</b>及实战

    概述信号波峰波谷二阶差分识别算法

    1、聊聊 其实每个人在无助的时候都需要句"Cry On My Shoulder!"     今天跟大家介绍一种
    的头像 发表于 05-08 13:49 3751次阅读
    概述<b class='flag-5'>信号</b><b class='flag-5'>波峰</b><b class='flag-5'>波谷</b>二阶差分识别算法