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

标签 c++ c arduino

我使用 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/

相关文章:

c++ - 随机数生成器和线程安全

c++ - 阿杜伊诺错误 : expected initializer before * token

c++ - 实现 TimeLib.h 的 Arduino 类

c++ - 将 void* 转换为多个继承类的父类(super class)不会调用正确的方法

c++ - 在非托管 C/C++ 中获取已签名 EXE 的 X509 代码签名证书序列号

c++ - 如何在 C++11 中初始化未在其构造函数中初始化其所有成员的类

c++ - 如何直接从分配的内存中执行 mmaped 二进制/代码

c - 使用 printf ("%s",&Buffer[i]);在C中

c++ - 一个简单的win32多线程代码。这行得通吗?

c++ - 使用 strncmp 函数在 Arduino IDE 中出错