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.3133
  9 至 12 列
    8.3147    3.1122    6.1660    5.8235

位置:
  1 至 7 列
           3         301         601         901        1201        1501        1802
  8 至 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)) %对间距求均值
相关推荐
2601_962885729 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen9 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发10 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
WL学习笔记11 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang12 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛12 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl58512 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
茗创科技14 小时前
Nature Mental Health | 基于皮层相似性网络分析,揭示神经性厌食症的神经机制
matlab·数据分析·脑网络
code2cat15 小时前
Java进阶篇之AtomicMarkableReference:引用还在,标记已经改变
java·开发语言·cas·并发编程·逻辑删除
CappuccinoRose15 小时前
FormData数据处理
开发语言·前端·javascript·表单数据