gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:07:32 25 4
gpt4 key购买 nike

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

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

      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 + sAn = 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() 返回值乘以SOUND_COUNT.

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

关于c - 你能解释一下这个计算噪声平均值的算法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65822187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com