【问题标题】:Detecting peak value on realtime data stream检测实时数据流的峰值
【发布时间】:2020-03-05 10:50:58
【问题描述】:

我正在使用QCustomPlot 从 IMU 读取和显示实时值。这就是我设置realtimeDataSlot的方式:

void Settings::realtimeDataSlot(double x_acceleration_g, double y_acceleration_g, double z_acceleration_g, double z_acceleration_gnew)
{
    static QTime time(QTime::currentTime());
    // calculate two new data points:
    double key = time.elapsed()/1000.0; // time elapsed since start of demo, in seconds
    static double lastPointKey = 0;
    if (key-lastPointKey > 0.02) // at most add point every 20 ms
    {
      // add data to lines:
        ui->customPlot->graph(0)->addData(key, x_acceleration_g); // X axis
        ui->customPlot->graph(1)->addData(key, y_acceleration_g); // Y axis
        ui->customPlot->graph(2)->addData(key, z_acceleration_g); // Z axis
        ui->customPlot->graph(3)->addData(key, z_acceleration_gnew);

      lastPointKey = key;
    }
    // make key axis range scroll with the data (at a constant range size of 8):
    ui->customPlot->xAxis->setRange(key, 8, Qt::AlignRight);
    ui->customPlot->replot();

    // calculate frames per second:
    static double lastFpsKey;
    static int frameCount;
    ++frameCount;
    if (key-lastFpsKey >2) // average fps over 2 seconds
    {
      ui->statusbar->showMessage(
            QString("%1 FPS, Total Data points: %2")
            .arg(frameCount/(key-lastFpsKey), 0, 'f', 0)
            .arg(ui->customPlot->graph(0)->data()->size()+ui->customPlot->graph(1)->data()->size())
            , 0);
      lastFpsKey = key;
      frameCount = 0;
    }
}

显示如下:

下一步,我需要检测任何轴上的峰值,例如上图中Y 轴上的峰值,我需要检测和计数。有人可以告诉我一个方法吗?

提前致谢

编辑

我在山峰上标注了下图:

我将峰值定义为值(正值)高于0.25 g 的数字。

【问题讨论】:

  • 请定义“峰值”。局部最大值?全局最大值?您是否需要因输入抖动而进行衰减(否则“平坦”信号很容易在那里出现“峰值”)?
  • 也许您可以在图片中添加一些小标记,确定您认为“峰值”的值。
  • 负值可能是峰值吗?
  • @Yunnosch 谢谢。我刚刚根据您的反馈编辑了问题
  • " if (key-lastPointKey > 0.02) // 最多每 2 毫秒添加一个点"。这是什么单位...听起来很像 20 毫秒(不是 2 毫秒)!

标签: c++ qt qcustomplot


【解决方案1】:

y轴怎么做:

  1. 您在 x 轴上定义一个窗口大小,例如 5 个 100 的 x 值
  2. 让窗口从 x 轴的起点移动到终点,这意味着:对于第一个度量,查看 x 值编号 0、1、2、3、4,对于第二个度量,查看x 值数字 1、2、3、4、5 等
  3. 对于每个窗口度量:确定该窗口中的最大 y 值,并为适当的 x 值增加一个分数计数器。
  4. 在窗口从头到尾完全移动后,您需要找到得分计数器最高的 x 值。

您的窗口大小为您提供了峰值的数量。

对最小值也执行相同的操作以找到负峰值。

注意图表的开头和结尾。

【讨论】:

  • 虽然我不知道它实际上与 Qt 和 C++ 有什么关系,但现在你应该可以编写它了... :)
  • 既然算法已经很清楚了,如果你是程序员,应该可以自己写代码了。
  • @vtc:查看stackoverflow.com/questions/45975523/…,它在 C 中提供了几个峰值查找器实现。希望对您有所帮助。你的问题现在回答了吗?再见,祝你好运!
  • 非常感谢您的反馈。就我而言,数据是实时的,例如。致电sample->acceleration_g[0] 以 100Hz 的速率向我提供数据。我是初学者,不太了解如何在实时数据上执行您提到的所有步骤
  • 如果要处理无限的传入数据流,则必须将图形从当前最后一个值处理回多个值。例如,如果您当前的 x 值为 1000,则您会回顾例如的范围。 x 值 800 到 1000 并对这 200 个值进行峰值算法。
猜你喜欢
  • 2020-12-29
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2020-04-20
  • 2012-08-28
相关资源
最近更新 更多