你能解释一下这个计算噪声平均值的算法吗

may you explain this algorithm of calculate to average for noise

我正在使用其他人编写的代码进行嵌入式编程。

此算法用于计算麦克风和加速度计的平均值

      sound_value_Avg = 0;
      sound_value = 0;
      memset((char *)soundRaw, 0x00, SOUND_COUNT*2);
    
      for(int i2=0; i2 < SOUND_COUNT; i2++)
      {
        soundRaw[i2] = analogRead(PIN_ANALOG_IN);
        if (i2 == 0)
        {
          sound_value_Avg = soundRaw[i2];
        }
        else
        {
          sound_value_Avg = (sound_value_Avg + soundRaw[i2]) / 2;
        }
      }
    
      sound_value = sound_value_Avg;

加速器与此类似

n1=p1

(n2+p1)/2 = p2

(n3+p2)/2 = p3

(n4+p3)/2 = p4

...

avg(n1~nx)=px

好像不对

谁能解释一下他为什么使用这个算法?

是sin图的具体方法吗?比如噪音、震动?

这似乎是一种有缺陷的维护累积平均值的尝试。错误在于相信:

An+1 = (An + sn) / 2

实际上应该是:

An+1 = ((An * n) + s) / (n + 1)

然而,维护 运行 总和并以通常方式生成平均值在计算上更简单:

S = S + S An = S / n

可能的目的是避免总和变大时溢出,但这种尝试在数学上存在缺陷。

要了解此陈述的错误程度,请考虑:

        True 
n   s   Running Avg.    (An + sn) / 2
--------------------------------------
1   20  20              20
2   21  20.5            20.25
3   22  21              20.625

然而,在这种情况下,没有对中间平均值进行任何操作,因此实际上您根本不需要维护 运行 平均值。您只需要累加 运行 总和并在最后计算平均值。例如:

      sum = 0 ;
      sound_value = 0 ;
      
      for( int i2 = 0; i2 < SOUND_COUNT; i2++ )
      {
        soundRaw[i2] = analogRead( PIN_ANALOG_IN ) ;
        sum += soundRaw[i2] ;
      }
    
      sound_value = sum / SOUND_COUNT ;

在此您需要确保 sum 的数据类型可以容纳最大 analogRead() return 乘以 SOUND_COUNT 的值。

但是你说这用于某种信号调节或麦克风和加速器的处理。这些设备具有相当不同的带宽和动态特性,而且同一个滤波器似乎不太可能同时适用于这两种设备。应用具有适当计算系数的 IIR 或 FIR 滤波器等稳健的 DSP 技术会更有意义。您还需要一个合适的固定采样率,我敢打赌,这不是通过在没有特定时间的循环中简单地读取 ADC 来实现的