当前位置: 首页 > news >正文

matlab峰值检测

峰值检测的意义

在信号处理中,我们常常需要寻找信号的峰值,对于全局最大值,寻找起来比较容易,而对于局部峰值的寻找就需要考虑更多的条件,例如峰值的绝对幅度以及相邻峰值之间之间的间距;,我如何在信号中找到峰值?我如何测量峰值之间的距离?如何测量受趋势影响的信号峰值的振幅?我如何在含噪信号中找到峰值?我如何找到局部最小值?

matlab峰值检测程序

matlab中可以采用峰值检测函数findpeaks来查找峰的位置和数值。例如我们想要寻找如下信号的峰值,
在这里插入图片描述

图1 输入信号
通过肉眼可以观察到,以上信号中一共有13个峰值。各个峰值的绝对值存在一定的差异。 我们采用findpeaks函数,可以输出如下结果
% 假设信号已经存储在变量signal中
% 使用findpeaks函数检测峰值
[pks, locs] = findpeaks(signal);
% 打印出检测到的峰值和对应的位置
disp('峰值:');
disp(pks);
disp('位置:');
disp(locs);
figure; 
plot(signal,'linewidth',1);axis tight;
hold on;
stem(locs,pks); %采用茎叶图绘制峰值
legend('orgin signal','peak');

在这里插入图片描述

图2 输入信号和峰值
图中红色圆圈标记的即峰值,可以看到峰值很多,这是因为它把很多局部的小的峰值也检测了出来。

设置最小阈值进行峰值检测

由于存在很多局部的小的峰值被错误的检测了出来,我们可以设置一个阈值来进行检测,参数"MinPeakHeight"可以设置最小检测峰值阈值,这里将阈值设置为1:

% 假设信号已经存储在变量signal中
[pks, locs] = findpeaks(signal,'MinPeakHeight',0.5);%设置阈值
% 打印出检测到的峰值和对应的位置
disp('峰值:');
disp(pks);
disp('位置:');
disp(locs);
figure; 
plot(signal,'linewidth',1);axis tight;
hold on;
stem(locs,pks); %采用茎叶图绘制峰值
legend('orgin signal','peak');

在这里插入图片描述

图3 设置阈值后的峰值检测
设置阈值后,提取到的峰值相对比较准确,但是在第3条竖线和第4条竖线上出现了两个峰值,如下图所示

在这里插入图片描述

图4 检测到的相近峰值

剔除相近峰值

信号的峰值似乎以固定间隔出现。然而,有些峰彼此非常接近。MinPeakDistance属性可用于滤除这些峰。此示例只考虑相隔6个采样点以上的峰值。

[pks, locs] = findpeaks(signal,'MinPeakHeight',0.5,...'MinPeakDistance',6);
% 打印出检测到的峰值和对应的位置
disp('峰值:');
disp(pks);
disp('位置:');
disp(locs);
figure; 
plot(signal,'linewidth',1);axis tight;
hold on;
stem(locs,pks); %采用茎叶图绘制峰值
legend('orgin signal','peak');

在这里插入图片描述

图5 设置阈值并剔除相近峰值

此时,检测的结果更为准确。

计算峰值间距

findpeaks函数的返回值:pks,locs分别保存了峰值的幅度和位置,峰值间距指的是相邻的两两峰值之间的间距,程序中打印出来的信息如下:

峰值:1 至 8 列1.3098   10.9858   10.9861    1.9470    5.8270    6.1719    3.1137    8.31339 至 12 列8.3147    3.1122    6.1660    5.8235位置:1 至 7 列3         301         601         901        1201        1501        18028 至 12 列2101        2401        2702        3001        3301

我们采用差分函数对峰值的位置进行处理:

peakInterval = diff(locs);

由于峰值数为12,所以差分后就是11个数:

peakInterval =298   300   300   300   300   301   299   300   301   299   300

然后对间距求均值:

AverageDistance_Peaks = mean(diff(locs)) %对间距求均值

相关文章:

  • 【非常困难】 猿人学web第一届 第10题 js 混淆 - 重放攻击对抗
  • odoo17 footer 异常备忘
  • Python+PyCharm安装和配置(详细步骤)
  • Flutter ListView 实现不同样式 item
  • 【HTML】模拟插头连接断开动画
  • 复杂的编辑表格
  • Oracle SQL - 合并重叠的期间
  • 如何选择最佳路线?
  • sql盲注python脚本学习 (基于bWAPP靶场)
  • 谈谈hash算法
  • Leetcode-day31-01背包问题
  • 《Programming from the Ground Up》阅读笔记:p103-p116
  • Linux内核定时器
  • Java--Zuul网关中的过滤器
  • AIGC深度学习教程:Transformer模型中的Position Embedding实现与应用
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Electron入门介绍
  • Git同步原始仓库到Fork仓库中
  • HTML-表单
  • Just for fun——迅速写完快速排序
  • Mybatis初体验
  • Node + FFmpeg 实现Canvas动画导出视频
  • PAT A1092
  • PermissionScope Swift4 兼容问题
  • Python连接Oracle
  • Spark RDD学习: aggregate函数
  • Vue 2.3、2.4 知识点小结
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • - 概述 - 《设计模式(极简c++版)》
  • 给github项目添加CI badge
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于HAProxy的高性能缓存服务器nuster
  • 看域名解析域名安全对SEO的影响
  • 前端面试题总结
  • 如何编写一个可升级的智能合约
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习使用ExpressJS 4.0中的新Router
  •  一套莫尔斯电报听写、翻译系统
  • 优化 Vue 项目编译文件大小
  • 1.Ext JS 建立web开发工程
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (2015)JS ES6 必知的十个 特性
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二)linux使用docker容器运行mysql
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)Windows2003安全设置/维护
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net MySql
  • .NET 中什么样的类是可使用 await 异步等待的?