如何计算此图的峰值?

How can I calculate the peaks of this diagram?

提问人:Leader ride 提问时间:5/31/2023 最后编辑:Leader ride 更新时间:5/31/2023 访问量:42

问:

我正在用手机摄像头对心跳检测器进行编程,该图实际上效果很好。但我在计算方面有问题。在下图中,我用红色箭头标记,当心跳发生时,这些是图表的峰值,它们应该计入我的代码中。

但也有这些小山峰(有时在“真正的山峰”之间还有更多),我用黄色标记了它们。在不计算黄色峰值的情况下,我怎么能计算出来呢?

提前致谢!

enter image description here

我已经尝试过平滑,但我想我做错了,并且还尝试计算最后 5 个值(如果它们为正),所以这是一个峰值,但那非常不稳定。

编辑:现在的代码:

  void _scanImage(CameraImage image) {
_actual = DateTime.now();

_avgRedValue = image.planes.first.bytes.reduce((value, element) => value + element) / image.planes.first.bytes.length;

if (_data.length >= _displayLength) {
  _data.removeAt(0);
}

setState(() {
  _data.add(Value(_actual, 255 - _avgRedValue));

  if (_data.length >= 7) {
    int lastIndex = _data.length - 1;
    List<double> last7Values = _data
        .sublist(lastIndex - 5, lastIndex)
        .map((value) => value.value)
        .toList();
    double lastValue = _data[lastIndex].value;
    double previousValue = _data[lastIndex - 1].value;

    if (lastValue > previousValue && lastValue > _data[lastIndex - 2].value &&
        _isIncreasing(last7Values)) {
      // Potential peak detected
      peakValues.add(lastValue);
    } else if (peakValues.isNotEmpty && lastValue < previousValue) {
      // Heartbeat detected
      double heartbeatValue = peakValues.reduce((a, b) => a > b ? a : b);
      peakValues.clear();
      int beatNow = DateTime.now().millisecondsSinceEpoch;

      if(previous != 0) {
      }
        if(beatNow - previous > 500){
      print('Heartbeat detected: $heartbeatValue');

      heartbeatCount++;

     
      }

    }


  }
});
  }

  bool _isIncreasing(List<double> values) {
if (values.length < 2) {
  return false;
}

for (int i = 1; i < values.length; i++) {
  if (values[i] <= values[i - 1]) {
    return false;
  }
}

return true;
  }
Flutter 函数 数学 心跳

评论

0赞 Mike 'Pomax' Kamermans 5/31/2023
记住(重新)阅读发布指南:如果你已经尝试过,请展示你尝试过的代码,并讨论为什么这是你写的代码。

答:

1赞 Randal Schwartz 5/31/2023 #1

对于任何给定的三个连续值 a、b 和 c,a 小于 b,b 大于 c,这难道不是吗?这在列表中并不难识别。