gpt4 book ai didi

c++ - C中实现的平均直流估计器的解释

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:51 27 4
gpt4 key购买 nike

我使用 MAX30102 传感器计算心率。这个传感器发射光并测量动脉血+皮肤+肌肉和其他东西吸收了多少(虚拟解释)。因此,大部分数据是连续值,一小部分是动脉搏动血(我可以用它来计算脉搏)。信号处理的第一项是去除直流分量。我尝试使用带有浮点变量的过滤器进行尝试,现在我发现没有使用它的实现(我将把这段代码放在微 Controller 中,我想要最好的性能)。我测试了新功能,它运行良好,但我无法理解它。所以我在这里寻求帮助以理解此函数中使用的数学。

下图可以帮助解释:

https://imgur.com/22cBn3W

//  Average DC Estimator
static int16_t averageDCEstimator(int32_t *p, uint16_t x)
{
*p += ((((long) x << 15) - *p) >> 4);
return (*p >> 15);
}

*p 是过去计算的平均值,所以新的平均值是过去的平均值加上实际测量的样本。x为实测样本(传感器发送的数据为18位)。

最佳答案

这看起来像是一个近似的移动平均值。它类似于加窗平均值,不同之处在于每个新增加的值都会按百分比影响平均值。所以它总是偏向于最新的值。作为奖励,它不需要缓冲以前的值。让我们分解一下。

首先,让我们谈谈单位。 x << 15类次 x左 15 位,有效地乘以 32768。还要注意最终平均值移动存储在 p 的值。向右移动 15 位。

这表示存储在 p 的值正在使用一种称为“定点”数学的技巧,您可以在其中使用整数的额外位,就好像它们是小数位一样。

因此,p 处的值是定点的当前运行平均值。当x到达,它被转换成定点,然后你计算它与当前运行平均值的偏差。

然后,您获取该增量并将其右移 4 位,即除以 16。该值将添加到运行平均值中。这意味着每个新值都会对均值产生大约十六分之一的影响。换句话说,单个新值对当前均值有 6.25% 的影响。

关于c++ - C中实现的平均直流估计器的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57404009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com