看板 ASM 關於我們 聯絡資訊
參考一下我的寫法 不限asm 或是 c temp是暫存值 va是當前值 假設取平均的次數是10 --------------------------- temp=0 迴圈開始 va=取得輸入值 temp=(temp*9+va)/10; ...................... ..................... 迴圈結束 ----------------------------- 當平均次數是16.就可以用右移4 BIT來取 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.235.209
ksmrt0123:N=15 但 temp確 *9 /10? 是不是有寫錯? 03/23 21:33
ksmrt0123:且這樣要做很多次的 *與/, 好處是? 03/23 21:34
stool100:更正了 謝謝 03/23 21:56
※ 編輯: stool100 來自: 220.132.235.209 (03/23 21:56)
stool100:每次讀值 做一次./.*.更新目標值. 並不是做10次 03/23 21:58
ksmrt0123:這個方法需要的運算比求和再除多很多, 而且應該要用浮點 03/24 00:28
ksmrt0123:數算不然誤差可能會太大. 03/24 00:28
ksmrt0123:而且 *9, /10 應該是錯的, 正確的運算可能是 *i, /(i+1) 03/24 00:30
ksmrt0123:for(i=0;i<N;++i) avg=(avg*i+input)/(i+1); 03/24 00:31
ksmrt0123:好處是input還不到N個時, 都可以算出平均值 03/24 00:32
ksmrt0123:這在某些應用是必要的 03/24 00:33
有沒有誤解呢? 我認為的需求狀況是 在取得一筆資料時..計算平滑的結果 也就是"低通濾波".. 在我的運算中 只用了兩個變數(浮點數是當然最好) k先生您是不是 用了i 個變數?然後每次都計算平均? ※ 編輯: stool100 來自: 220.132.235.209 (03/24 00:47)
ksmrt0123:以您的例子, 若讀10次va都是9, 迴圈結束後temp還是0 03/24 00:55
ksmrt0123:(0*9+9)/10 用整數運算算出來是 0 03/24 00:56
ksmrt0123:我用你的變數名改寫式子: 03/24 00:58
ksmrt0123:for(i=0;i<N;++i) temp=(temp*i+va)/(i+1); 03/24 00:59
ksmrt0123:這樣也許比較容易看出與你的不同 03/24 01:00
stool100:1.用浮點數處理.會理想很多.2.我的方式與迴圈不同. 03/24 01:52