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

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

3天内不再提示

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

FPGA之家 来源:CSDN技术社区 作者:最后一个bug 2021-03-21 11:16 次阅读

1、聊一聊

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

2、正文部分

1波峰波谷用处

对于信号波峰波谷识别在嵌入式领域应该是非常广泛的,因为大部分的信号都处于一种时变的状态,信号在时域上处于一种类似于正弦波的波动状态。比如计步软件就是通过IMU模块所采集的变化的波形状态来识别波峰波谷,最终估算你所走过步数;

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

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

2比较法识别

常规的设计办法为比较法 : 其中x表示当前采样点波峰:f(x) 》 f(x−1) 且 f(x) 》 f(x+1)波谷:f(x) 《 f(x−1) 且 f(x) 《 f(x+1)

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

3差分识别

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

A

识别算法过程

1、获得采样点序列

2、进行差分处理

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

4605a6be-8924-11eb-8b86-12bb97331649.png

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

4641fd08-8924-11eb-8b86-12bb97331649.png

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

465debd0-8924-11eb-8b86-12bb97331649.png

B

参考代码

1#include 《stdio.h》

2#include 《stdlib.h》

3#define SAMPLE_MAX 20

4#define PV_MAX 10

5

6float Sample[SAMPLE_MAX]={1,2,3,4,4,4,5,2,1,0,0,5,1,0,0,1,2,3,4,0};

7float SampleDiff[SAMPLE_MAX]={0};

8

9typedef struct _tag_FindPV

10{

11 int Pos_Peak[PV_MAX]; //波峰位置存储

12 int Pos_Valley[PV_MAX]; //波谷位置存储

13 int Pcnt; //所识别的波峰计数

14 int Vcnt; //所识别的波谷计数

15}SFindPV;

16

17SFindPV stFindPV;

18

19/********************************************

20 * Fuction : initialFindPV

21 * Note : 初始化相关数据

22 *******************************************/

23void initialFindPV(void)

24{

25 int Index = 0;

26

27 for(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)

54 SampleDiff[i] = 1;

55 else if (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)

69 SampleDiff[i] = 1;

70 else

71 SampleDiff[i] = -1;

72 }

73 else

74 {

75 if (SampleDiff[i + 1] 》= 0)

76 SampleDiff[i] = 1;

77 else

78 SampleDiff[i] = -1;

79 }

80

81 }

82 }

83

84 //step 3 :对相邻相等的点进行领边坡度处理

85 for(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;

90 pFindPV-》Pcnt++;

91 }

92 else if(SampleDiff[i + 1] - SampleDiff[i] == 2) //波谷识别

93 {

94 pFindPV-》Pos_Valley[pFindPV-》Vcnt] = i + 1;

95 pFindPV-》Vcnt++;

96 }

97 }

98}

99

100/********************************************

101 * Fuction : main

102 * Note : 模拟查找波峰波谷

103 *******************************************/

104int main(int argc, char *argv[]) {

105

106 int i = 0;

107

108 initialFindPV();

109

110 FindPV(&stFindPV,Sample);

111

112 printf(“Peak

”);

113 for(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}

2、最后

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

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

    关注

    23

    文章

    4612

    浏览量

    92883
  • 信号
    +关注

    关注

    11

    文章

    2791

    浏览量

    76756
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68600

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

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

收藏 人收藏

    评论

    相关推荐

    TAS5715调节两个DRC,输出波型的波峰波谷变得很难看,为什么?

    为什么我用DEMO板调试只有DRC1有作用,DRC2没有作用(两个DRC都有ENABLE),还有调DRC的时候,输出波型的波峰波谷变得很难看,现在遇到的问题是我做程序低音力度不够 ,不知道还有没有其它的原因。还有AD模式和BD模式有什么区别
    发表于 11-06 07:29

    波峰焊VS选择性波峰焊:技术差异与应用对比

    在电子制造业中,焊接技术扮演着至关重要的角色。其中,波峰焊与选择性波峰焊作为两种主要的焊接方式,各自具有独特的特点和适用范围。本文将从工作原理、应用领域、焊接精度、效率与成本等几个方面,详细探讨
    的头像 发表于 10-08 11:16 790次阅读

    将TL084的输出端与反向输入端相接作为电压跟随器,电压跟随的效果不好怎么处理?

    我将TL084的输出端与反向输入端相接作为电压跟随器。同相端输入信号为15kHz,5V的正弦波。可是电压跟随的效果不好,有正弦波的波峰波谷有1V的偏差,是我芯片TL084选的有问题吗?哪种芯片比较适合做电压跟随器?
    发表于 09-23 06:37

    LM675的gain过低时为什么会产生自激?

    请教大家一个问题,这个电路中如果RX1大于5K时,输入信号为20KHz,输出信号波峰波谷会添加4MHz的信号。随着RX1的增大,输出
    发表于 09-20 06:00

    opa820小信号100mv以下的信号经过同相放大,下面的波峰会削平,如何解决?

    信号100mv以下的信号经过同相放大,下面的波峰会削平,后级处理占空比会改变。反而是1v峰峰值的信号会灭有这个问题,改变放大倍数也不能解决。 左边输入端是一个高通滤波器,用于滤除电
    发表于 08-30 06:21

    opa657激光电路怎么消除信号上的那个小波峰

    opa657激光电路怎么消除信号上的那个小波峰
    发表于 08-20 07:52

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

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

    普源示波器测量相位差的原理和方法

    的原理和方法,并通过实例演示其应用。 一、普源示波器测量相位差的原理和方法 普源示波器测量相位差的原理基于信号的时间差。当两个信号在同一时间起点上开始时,它们的相位差为0;当两个
    的头像 发表于 05-07 15:07 1411次阅读
    普源示波器测量相位差的原理和<b class='flag-5'>方法</b>

    什么是波峰焊,如何使PCBA组装自动焊接

    波峰焊是一种焊接工艺,通过将熔融的液态焊料形成特定的焊料波,将元器件插入PCB并使其通过焊料波峰,从而实现焊点焊接。这种工艺借助泵的作用,将焊料槽液面上的焊料形成波峰,然后将PCB置放在传送链上
    发表于 03-05 17:57

    机器视觉中如何选择合适波长的光源

    。光是一种电磁波,它以波动的形式传播。如下图所示,在传播过程中光波的一个完整波周期的长度,即从一个波峰(或波谷)到相邻波峰(或波谷)之间的距离λ就是波长。通常用纳米(
    的头像 发表于 02-27 15:40 689次阅读
    机器视觉中如何选择合适波长的光源

    利用ADG508F与分压电阻输出正弦阶梯波信号波峰波谷出现断界情况是什么原因

    利用ADG508F与分压电阻输出正弦阶梯波信号波峰波谷出现断界情况是什么原因
    发表于 02-24 16:46

    PCBA波峰焊期间发生焊料飞溅的原因有哪些?

    一站式PCBA智造厂家今天为大家讲讲PCBA波峰焊加工发生焊料飞溅的原因有哪些?产生焊料飞溅的原因及应对方法。PCBA波峰焊是一种常用的电子制造工艺。在该过程中,由于高温而导致的焊膏飞溅是一个绕
    的头像 发表于 02-18 09:53 451次阅读

    波峰焊接工艺制程的问题及解决方法分析

    一站式PCBA智造厂家今天为大家讲讲PCBA波峰焊有哪些工艺难点?PCBA波峰焊接工艺问题解决方。在电子制造过程中,PCBA(印刷电路板组装)是一个非常关键的环节。波峰焊是PCBA过程中最重要也最常
    的头像 发表于 01-30 09:24 655次阅读

    信号灯的气密性检测方法

    随着科技的发展,信号灯在交通、航海、航空等各个领域的应用越来越广泛。为了保证信号灯的稳定性和安全性,对其气密性的检测显得尤为重要。本文将介绍信号灯的气密性
    的头像 发表于 01-27 11:26 468次阅读
    <b class='flag-5'>信号</b>灯的气密性<b class='flag-5'>检测</b><b class='flag-5'>方法</b>

    什么是波峰焊?波峰焊接缺陷原因分析及对策

    什么是波峰焊?波峰焊接缺陷原因分析及对策
    的头像 发表于 01-15 10:07 1065次阅读
    什么是<b class='flag-5'>波峰</b>焊?<b class='flag-5'>波峰</b>焊接缺陷原因分析及对策