作者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