【问题标题】:Finding the first, second and third maxima in the plot在图中找到第一个、第二个和第三个最大值
【发布时间】:2013-05-24 15:20:21
【问题描述】:

我想找到我使用 MATLAB 绘制的数据集中的第一个、第二个和第三个峰值。有人可以帮我弄这个吗?这是我上传的情节的链接

中心思想是找到在特定时间间隔后出现的峰值。第二个条件只是存储前四个峰值,然后打破条件。所以我在图中找到了第一个最大值。我在 X 轴上看到了 2530 的时间值。然后,我不会在附近寻找,而是在 X 轴上寻找 180-200 之后的峰值。我得到峰值 2,然后存储。然后我又跳了 180-200 并再次寻找附近的高峰。最后在获得前四个最大值后,我停止搜索峰值

【问题讨论】:

  • 首先定义一个最大值。有几个局部最大值比你的第二个圆圈点大
  • @Rasman 我知道有更多的最大值,但我只需要我标记的那些峰。我还从图中发现,如果我的第一个波形峰值在 2530 处,那么我的下一个波形峰值将在第一个波形峰值之后大约 180-200 毫秒。所以我的下一个高峰将在 2710 到 2730 之间。
  • 那为什么3350没有峰值呢?
  • @rasman 这就是为什么我感兴趣的领域是找到标记的前四个峰。它们代表来自传感器的声音信号,并且信号正在衰减。当我到达第四个峰值时,我必须停止代码执行。
  • 然后更明确地重写您的问题。明确您要查找的内容,因为它会更改执行分析所需的算法

标签: matlab filtering


【解决方案1】:

findpeaks 函数将为您提供向量中的所有峰值,但它需要做更多的工作来过滤您不关心的峰值。可以在findpeaks 之前应用低通滤波器来做到这一点。

【讨论】:

    【解决方案2】:

    作为 nimrodm 答案的替代方案,您可以利用已知的时间延迟来发挥自己的优势。找到你的第一个最大值,然后跳过你已知的延迟并在较小的窗口内搜索最大值。这样做时您必须调整索引,但效果很好。

    向量中有数据y:

    [max1,max_ind1] = max(y);
    next_ind = max_ind + 190;
    
    [max2,max_ind2] = max(y(next_ind-20:next_ind+20));
    max_ind2 = max_ind2 + next_ind-21;
    

    【讨论】:

    • 是的,David,上面的代码在上述情况下工作正常,但是在某些波形中我只有一个峰值,所以实际上我应该在那里停止执行并只存储一个值。
    • @maverick 您也会遇到使用 nimrodm 的解决方案的问题。对于任何一种情况,您都可以设置一个阈值,如果没有发现高于阈值的峰值,则停止查找。
    【解决方案3】:

    在这些情况下,我通常做的是搜索最大值,然后擦除该最大值点周围一个小邻域中的所有点并重复这些过程。当然,邻域大小取决于应用程序。

    因此,如果您有向量 y 中的数据,则以下内容应该有效:

     [max1, max_ind] = max(y);
     y(max_ind-delta:max_ind+delta) = 0;
    
     [max2, max_ind2] = max(y);
    

    【讨论】:

    • 上面给出的解决方案的问题是假设我的值不是我图中的标记峰值,但它是 max_ind-delta 和 max_ind+delta 的最大值。所以这个值也被保存了,但实际上它必须被忽略。
    • @maverick:一旦在max_ind 找到主峰,此代码将删除周围窗口中的所有次峰。您不应该保存任何相邻的峰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多