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

    文章

    4760

    浏览量

    97129
  • 信号
    +关注

    关注

    11

    文章

    2902

    浏览量

    79659
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73123

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    泰克AFG31000信号发生器在充电桩检测中的应用方法及注意事项

    可靠工具。本文结合充电桩检测需求,介绍其应用方法及注意事项。 一、检测方法与步骤 1. 设备连接与基础配置 物理连接:通过BNC接口或以太网将AFG31000与充电桩待测模块连接,确保
    的头像 发表于 12-01 16:13 345次阅读
    泰克AFG31000<b class='flag-5'>信号</b>发生器在充电桩<b class='flag-5'>检测</b>中的应用<b class='flag-5'>方法</b>及注意事项

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 797次阅读
    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力<b class='flag-5'>实战</b>:YOLOv5目标<b class='flag-5'>检测</b>例程

    ADC 实战:如何精准读取传感器信号

    关键因素。今天,我们就从原理到实战,带你搞懂ADC,帮你精准读取传感器信号。一、ADC基础回顾ADC(Analog-to-DigitalConverter)是将连
    的头像 发表于 11-24 19:04 121次阅读
    ADC <b class='flag-5'>实战</b>:如何精准读取传感器<b class='flag-5'>信号</b>

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果
    的头像 发表于 11-10 15:58 858次阅读
    【RK3568 NPU<b class='flag-5'>实战</b>】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI<b class='flag-5'>检测</b>Demo,附完整流程与效果

    波峰焊设备的维护和保养方法

    能延长设备使用寿命,还能降低故障发生率,确保生产顺利进行。以下从设备各主要组成部分出发,结合晋力达波峰焊的优势,详细介绍波峰焊设备的维护和保养方法
    的头像 发表于 06-17 17:03 1211次阅读

    储能EMC整改:如何节省70%整改费用的实战方法

    深圳南柯电子|储能EMC整改:如何节省70%整改费用的实战方法
    的头像 发表于 06-03 11:28 696次阅读
    储能EMC整改:如何节省70%整改费用的<b class='flag-5'>实战</b><b class='flag-5'>方法</b>

    波峰焊技术入门:原理、应用与行业标准

    等问题。波峰焊技术的广泛应用波峰焊技术在电子制造行业具有广泛的应用,如计算机、通讯、消费类电子、汽车电子等领域。在手机制造中,主板上的部分元器件采用波峰焊连接,确保信号传输稳定;汽车电
    发表于 05-29 16:11

    PCBA 加工必备知识:选择性波峰焊和传统波峰焊区别大揭秘

    一站式PCBA加工厂家今天为大家讲讲PCBA加工选择性波峰焊与传统波峰焊有什么区别?选择性波峰焊与传统波峰焊的区别及应用。在PCBA加工中,DIP插件焊接是确保产品连接可靠性的重要工序
    的头像 发表于 05-08 09:21 1068次阅读

    一文搞懂波峰焊工艺及缺陷预防

    效果,需要考虑焊料配方、助焊剂、元件和PCB的匹配、工装设计及过程控制参数等因素。但是,当出现焊接不良时,可能有多个原因导致。下面介绍一些常见的波峰焊焊接不良、产生原因的分析方法及改善建议。   一、波峰焊工艺曲
    的头像 发表于 04-09 14:46 3042次阅读
    一文搞懂<b class='flag-5'>波峰</b>焊工艺及缺陷预防

    一文搞懂波峰焊工艺及缺陷预防

    效果,需要考虑焊料配方、助焊剂、元件和PCB的匹配、工装设计及过程控制参数等因素。但是,当出现焊接不良时,可能有多个原因导致。下面介绍一些常见的波峰焊焊接不良、产生原因的分析方法及改善建议。 一
    发表于 04-09 14:44

    波峰焊机与助焊剂的适配指南:初入行业必知的选择逻辑

    波峰焊工艺中,助焊剂与设备的匹配至关重要。波峰焊机主要有传统单波峰、双波峰、微型、氮气波峰四类,单波峰
    的头像 发表于 04-07 19:32 1071次阅读
    <b class='flag-5'>波峰</b>焊机与助焊剂的适配指南:初入行业必知的选择逻辑

    波峰焊点拉尖现象的成因与解决策略

    在电子制造领域,波峰焊是一种常见的焊接工艺,广泛应用于印刷电路板(PCB)的组装。然而,在波峰焊过程中,点拉尖现象是影响焊接质量的一个常见问题。点拉尖是指焊点上的焊料呈现乳石状或水柱形状,这种现象
    发表于 03-27 13:43

    实战分享:如何正确使用扫描机气密性检测仪提升检测效率

    在现代制造业中,扫描机气密性检测仪已经成为确保产品质量和性能的关键工具。正确使用这款设备不仅可以提高检测效率,还能降低生产成本,增强企业的市场竞争力。下面,我们就来分享一些实战技巧,帮助你更好地利
    的头像 发表于 01-13 15:11 662次阅读
    <b class='flag-5'>实战</b>分享:如何正确使用扫描机气密性<b class='flag-5'>检测</b>仪提升<b class='flag-5'>检测</b>效率

    断路器的检测方法

    断路器的检测方法多种多样,以下是一些常见的检测方法: 一、直观检查 直观检查是断路器检测的基础步骤,主要通过观察断路器的外观来判断其是否存在
    发表于 12-27 10:29

    LTC6087仿真结果发现输出电压出现削峰现象,低电压也达不到轨到轨,怎么解决?

    的差分信号波峰波谷被削平,蓝色线是同相输出的差分信号,仔细看波谷处也被削平了一部分,绿色是原始信号
    发表于 12-19 07:49