你能解释一下这个计算噪声平均值的算法吗
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 来实现的
我正在使用其他人编写的代码进行嵌入式编程。
此算法用于计算麦克风和加速度计的平均值
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 来实现的