【问题标题】:MATLAB: count number of peaksMATLAB:计算峰数
【发布时间】:2016-05-10 04:49:58
【问题描述】:

我有一个这样的图表,我想确定峰值的数量。因为它是一个波函数,所以整个图有很多峰值,这就是为什么我无法使用诸如findpeaks 之类的函数来找到峰值数量的原因,因为它返回了大约 3000 个峰值,而我想要数字 7 .

我的想法是做一个 for 或 while 循环来计算平均值高于 0.5 的实例数。所以最终我想要一个在图表上分段迭代的函数返回峰值的数量和出现这个峰值的 y 索引值的范围(我认为最好的方法是将它们保存到零矩阵)。

文件数据链接:https://www.dropbox.com/s/vv8vqv28mqzfr9l/Example_data.mat?dl=0

【问题讨论】:

  • 如果您只想要这 7 个“厚”峰,您可能希望在找到峰之前先通过低通滤波器运行它
  • 你能加入.mat文件吗?当我们可以自己尝试不同的解决方案时会更方便。
  • @Dan 我查看了低通滤波器。但是,由于我不是高级 MatLab 用户,我可能想要更简单的东西。
  • @Flo 那么您可能需要找到已经为您清理过的更简单的数据。过滤这些数据就像调用 conv(data, ones(n,1)/n,'same') 一样简单
  • 请不要破坏您的帖子。

标签: matlab


【解决方案1】:

您的意思是您正在尝试计算数据的“开启”部分吗?

使用findpeaks,您在正确的轨道上。如果您滚动到documentation 的底部,您会发现实际上您可以通过各种方式调整例程,例如指定峰值之间的最小距离,或者一个点与其相邻点之间的最小差异,然后才被认为是峰值。

通过定义峰之间的最小距离,我检测到了以下 7 个峰。代码包含在下面。或者,您可以使用可以传递给 findpeaks 的其他参数。

另外需要注意的是我取了你数据的绝对值。

load('Example_data.mat')
indx = 1:numel(number11);
[pks, locs] = findpeaks(abs(number11), indx, 'MinPeakDistance', 0.25e4);
hold on
plot(number11)
plot(locs,pks, 'rx')
disp(numel(pks))

【讨论】:

  • 谢谢,这正是我所需要的。对于我的问题的第二部分,你能给我一个想法来(大致)获得这些峰值出现的值的索引吗?我认为有一个(峰值数)*2 矩阵(在本例中为 7*2),第一列是峰值 i 的(近似)开始,第二列是结束索引。正如我所说,它不必非常精确,因为它是真实数据。
  • 出现这些峰值的近似指数在上面的locs 中给出。如果您真的想要各种“开启”期间的起点和终点,我认为您将不得不采取完全不同的方法。也许使用smooth 进行移动平均,并确定“开”和“关”点以对应于移动平均超过阈值的点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2019-04-05
  • 2020-06-21
相关资源
最近更新 更多