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

    文章

    4817

    浏览量

    98866
  • 信号
    +关注

    关注

    12

    文章

    2953

    浏览量

    80543
  • 代码
    +关注

    关注

    30

    文章

    4985

    浏览量

    74578

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析ADL5502:450 MHz至6000 MHz波峰因数检测

    深入解析ADL5502:450 MHz至6000 MHz波峰因数检测器 在射频和微波领域,准确测量信号波峰因数对于确保系统性能和稳定性至关重要。今天,我们将深入探讨Analog De
    的头像 发表于 05-23 15:20 502次阅读

    燃爆南京!FH8626V300L 人形检测模型嵌入式部署全链路实战

    ,以人形检测模型部署与优化为核心实战项目,聚焦视觉AI检测在嵌入式平台的落地全流程,带你用半天时间,动手走通从模型训练到嵌入式部署的完整链路。培训硬件平台:富瀚微电
    的头像 发表于 05-07 17:44 1541次阅读
    燃爆南京!FH8626V300L 人形<b class='flag-5'>检测</b>模型嵌入式部署全链路<b class='flag-5'>实战</b>

    实操手记:FSVA7信号与频谱分析仪的实战应用与技术体验

    实战经验,其兼具低相位噪声、宽分析带宽与多功能集成的特性,贴合中高频段复杂测试场景的需求,尤其在5G相关测试、微弱信号检测等场景中,展现出较强的实用性。
    的头像 发表于 04-30 14:32 200次阅读
    实操手记:FSVA7<b class='flag-5'>信号</b>与频谱分析仪的<b class='flag-5'>实战</b>应用与技术体验

    AI落地培训 | 人形检测模型嵌入式部署全链路实战

    流程与部署实战”免费培训!本次培训以人形检测模型部署与优化为核心实战项目,聚焦视觉AI检测在嵌入式平台的落地全流程,提供硬件,动手实操,带你在半天时间内走通从模型
    的头像 发表于 04-10 18:41 339次阅读
    AI落地培训 | 人形<b class='flag-5'>检测</b>模型嵌入式部署全链路<b class='flag-5'>实战</b>

    AI模型训练与部署实战 | 线下免费培训

    流程与部署实战”免费培训!以人形检测模型部署与优化实战为基础,聚焦嵌入式AI落地的核心环节,提供硬件,动手实操,带你在半天时间内,走通从模型训练到嵌入式部署的完整
    的头像 发表于 04-07 13:08 785次阅读
    AI模型训练与部署<b class='flag-5'>实战</b> | 线下免费培训

    锁相放大器与信号发生器的同步方法

    的交流信号成分,能够从强噪声背景中恢复微弱信号,而其性能的发挥高度依赖于与信号发生器的精确同步。实现二者同步,主要依赖于频率、相位和时间基准的一致性,具体方法如下: 一、频率同步:确保
    的头像 发表于 03-30 17:03 540次阅读
    锁相放大器与<b class='flag-5'>信号</b>发生器的同步<b class='flag-5'>方法</b>

    Kubernetes HPA和VPA使用实战指南

    线上业务流量存在明显的波峰波谷。白天高峰期Pod数量不够导致请求排队,凌晨低谷期大量Pod空跑浪费资源。手动扩缩容不现实——你不可能每天早上8点上线加Pod、晚上12点再缩回去。
    的头像 发表于 02-26 16:27 351次阅读

    【NPU实战】在迅为RK3588上玩转YOLOv8:目标检测与语义分割一站式部署指南

    【NPU实战】在迅为RK3588上玩转YOLOv8:目标检测与语义分割一站式部署指南
    的头像 发表于 12-12 14:30 6530次阅读
    【NPU<b class='flag-5'>实战</b>】在迅为RK3588上玩转YOLOv8:目标<b class='flag-5'>检测</b>与语义分割一站式部署指南

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

    可靠工具。本文结合充电桩检测需求,介绍其应用方法及注意事项。 一、检测方法与步骤 1. 设备连接与基础配置 物理连接:通过BNC接口或以太网将AFG31000与充电桩待测模块连接,确保
    的头像 发表于 12-01 16:13 1063次阅读
    泰克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 1830次阅读
    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力<b class='flag-5'>实战</b>:YOLOv5目标<b class='flag-5'>检测</b>例程

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

    关键因素。今天,我们就从原理到实战,带你搞懂ADC,帮你精准读取传感器信号。一、ADC基础回顾ADC(Analog-to-DigitalConverter)是将连
    的头像 发表于 11-24 19:04 728次阅读
    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 1339次阅读
    【RK3568 NPU<b class='flag-5'>实战</b>】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI<b class='flag-5'>检测</b>Demo,附完整流程与效果

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

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

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

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

    实战演练:使用相机气密性检测仪进行防水测试

    在摄影领域,尤其是进行户外摄影,不少摄影师会在恶劣环境下使用相机,这就对相机的防水性能有了要求。而相机气密性检测就是判断相机防水性能的重要途径,下面我们就来一次使用相机气密性检测仪进行防水测试的实战
    的头像 发表于 05-30 11:04 747次阅读
    <b class='flag-5'>实战</b>演练:使用相机气密性<b class='flag-5'>检测</b>仪进行防水测试