提问人:Leader ride 提问时间:5/31/2023 最后编辑:Leader ride 更新时间:5/31/2023 访问量:42
如何计算此图的峰值?
How can I calculate the peaks of this diagram?
问:
我正在用手机摄像头对心跳检测器进行编程,该图实际上效果很好。但我在计算方面有问题。在下图中,我用红色箭头标记,当心跳发生时,这些是图表的峰值,它们应该计入我的代码中。
但也有这些小山峰(有时在“真正的山峰”之间还有更多),我用黄色标记了它们。在不计算黄色峰值的情况下,我怎么能计算出来呢?
提前致谢!
我已经尝试过平滑,但我想我做错了,并且还尝试计算最后 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;
}
答:
1赞
Randal Schwartz
5/31/2023
#1
对于任何给定的三个连续值 a、b 和 c,a 小于 b,b 大于 c,这难道不是吗?这在列表中并不难识别。
评论