作者stool100 (思念是毒你是解药)
看板ASM
标题Re: [问题] 8051的一些小问题(修正)
时间Tue Mar 23 13:02:19 2010
参考一下我的写法
不限asm 或是 c
temp是暂存值
va是当前值
假设取平均的次数是10
---------------------------
temp=0
回圈开始
va=取得输入值
temp=(temp*9+va)/10;
......................
.....................
回圈结束
-----------------------------
当平均次数是16.就可以用右移4 BIT来取
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.235.209
1F:→ ksmrt0123:N=15 但 temp确 *9 /10? 是不是有写错? 03/23 21:33
2F:→ ksmrt0123:且这样要做很多次的 *与/, 好处是? 03/23 21:34
3F:→ stool100:更正了 谢谢 03/23 21:56
※ 编辑: stool100 来自: 220.132.235.209 (03/23 21:56)
4F:→ stool100:每次读值 做一次./.*.更新目标值. 并不是做10次 03/23 21:58
5F:推 ksmrt0123:这个方法需要的运算比求和再除多很多, 而且应该要用浮点 03/24 00:28
6F:→ ksmrt0123:数算不然误差可能会太大. 03/24 00:28
7F:→ ksmrt0123:而且 *9, /10 应该是错的, 正确的运算可能是 *i, /(i+1) 03/24 00:30
8F:→ ksmrt0123:for(i=0;i<N;++i) avg=(avg*i+input)/(i+1); 03/24 00:31
9F:→ ksmrt0123:好处是input还不到N个时, 都可以算出平均值 03/24 00:32
10F:→ ksmrt0123:这在某些应用是必要的 03/24 00:33
有没有误解呢?
我认为的需求状况是
在取得一笔资料时..计算平滑的结果
也就是"低通滤波".. 在我的运算中 只用了两个变数(浮点数是当然最好)
k先生您是不是 用了i 个变数?然後每次都计算平均?
※ 编辑: stool100 来自: 220.132.235.209 (03/24 00:47)
11F:推 ksmrt0123:以您的例子, 若读10次va都是9, 回圈结束後temp还是0 03/24 00:55
12F:→ ksmrt0123:(0*9+9)/10 用整数运算算出来是 0 03/24 00:56
13F:→ ksmrt0123:我用你的变数名改写式子: 03/24 00:58
14F:→ ksmrt0123:for(i=0;i<N;++i) temp=(temp*i+va)/(i+1); 03/24 00:59
15F:→ ksmrt0123:这样也许比较容易看出与你的不同 03/24 01:00
16F:→ stool100:1.用浮点数处理.会理想很多.2.我的方式与回圈不同. 03/24 01:52