【问题标题】:Questions conerning fixed point implementation of a moving window Newton-Raphson Method关于移动窗口 Newton-Raphson 方法的定点实现的问题
【发布时间】:2021-09-23 15:39:32
【问题描述】:

这是我引用的参考帖子:Any Faster RMS Value Calculation in C?

#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;
}
  1. 参数sample是否已经是定点值并且已经被S缩放了?

  2. sum_squares 是否在以下行中更改为定点值?

static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;

  1. 下面这行是为了抵消上面sample 的平方吗? 此外,这是整数除法,这意味着小数部分将被截断。这个可以吗?我们不会失去精度吗?

sum_squares / SAMPLES

  1. 如果sum_squares是定点值,倒数第二行的2不也应该改成定点值吗?

【问题讨论】:

  • 由于rms 被初始化为512(中间样本值),调用rms_filter 样本值为512,您应该会得到相同的返回数字。同样,如果您继续使用相同的值 x 调用 rms_filter,则返回值应该收敛到 x。 (这可能需要一段时间,因为它是一个无限响应过滤器,而不是一个有限响应过滤器。)
  • (1) No. (2) SAMPLES 是比例因子,因为它的值为 512,所以它相当于一个 9 个小数位的定点 1.0。 INITIAL 是初始 RMS 值,您可以将其更改为您想要的任何值。 (3) 可以改为rms = (rms * 1UL * SAMPLES + sum_squares / rms) / (2 * SAMPLES);,这样可能会更准确一些。 (4) 这实际上是我在 (3) 中的“改进”版本中所做的。

标签: c signal-processing fixed-point fixed-point-iteration


【解决方案1】:
  1. 参数样本是否已经是定点值并且已经被 S 缩放了?

除了普通整数的普通定点格式之外,显示的代码中没有明显的定点表示。

  1. 下一行中的 sum_squares 是否更改为定点值?

static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;

没有。过滤器被初始化,就好像先前的样本都具有值INITIAL。在这种情况下,一个样本的平方为INITIAL*INITIALSAMPLES 样本的平方和为SAMPLES * INITIAL * INITIAL1UL 的存在是为了确保操作数在乘法继续之前至少转换为 unsigned long 宽度,以避免一些溢出。

这给了我们一个线索,这里没有定点表示。定点表示本质上表示具有某些缩放值 sx 的某个值 x,其中 s 是为特定定点选择的固定比例格式。 (通常 s 是 2 或 10 的幂,但可以使用任何数字。)在定点格式中,如果我们乘以 x 的代表,sx,以y为代表,sy,用整数运算,得到s2 sup>xy。但是我们要的是xy的代表,也就是sxy。因此,我们必须除以 s。所以,如果这里有定点算法,我们希望看到类似INITIAL * INITIAL / SCALE 的东西。由于没有除以比例(或乘以比例倒数),因此没有定点算术。

  1. 下面的行是为了抵消上面样本的平方吗?

sum_squares / SAMPLES.

不,这条线不会抵消平方。它计算平方的平均值,作为平方平均值平方根计算的一部分。由于sum_squares 是平方和,平方和的个数是SAMPLES,所以sum_squares / SAMPLES 是均值。

此外,这是整数除法,这意味着小数部分将被截断。这个可以吗?我们不会失去精度吗?

失去了一些准确性。是否可以,取决于应用程序。如果可以得到近似的结果,并且这种截断导致的错误对于应用程序来说不是太大,那么就可以了。 (总的来说,信号处理人员似乎很好,但会损失很多准确性。)

  1. 如果 sum_squares 是定点值,倒数第二行的 2 不也应该改成定点值吗?

不,2 用于取较早的均方根估计值和新的均方根估计值的平均值。

这里的想法是rms 包含先前样本的均方根,或者接近它的东西。然后,由于sum_squares / SAMPLES 是最近样本的平方的平均值,将新平均值除以旧平均值的平方根 (rms) 得出的结果大约是新的均方根。将其添加到旧平均值中,然后除以 2 取平均值。他们在这里玩弄数学,但这是信号处理人员所做的。对这种近似跟踪真实均方根的效果的一些分析可能很有趣,但我不会在这里讨论它。

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2019-08-05
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多