这是我正在参考的参考文章:C 中任何更快的 RMS 值计算?
#define INITIAL 512 /* Initial value of the filter memory. */
#define SAMPLES 512
uint16_t rms_filter(uint16_t sample)
{
static uint16_t rms = INITIAL;
static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;
sum_squares -= sum_squares / SAMPLES;
sum_squares += (uint32_t) sample * sample;
if (rms == 0) rms = 1; /* do not divide by zero */
rms = (rms + sum_squares / SAMPLES / rms) / 2;
return rms;
}
参数是否
sample
已经是定点值并且已经按 S 缩放?是否
sum_squares
正在更改为以下行中的定点值?
static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;
- 下面的线是为了抵消
sample
上面的平方吗?此外,这是整数除法,这意味着小数部分将被截断。这个可以吗?我们不会失去精度吗?
sum_squares / SAMPLES
- 如果
sum_squares
是定点值,倒数第二行的 2 不也应该改为定点值吗?