先數樣本再數時間間隔
畫面數值抖動時,增加平均筆數常能讓曲線平滑,但也會延後變化。本篇用五筆移動平均帶你算清楚窗口、啟動與步階反應,再判斷它是否適合你的顯示或控制需求。不要只把平均參數調大,直到畫面看起來安靜。
本例每100ms取得一筆有效樣本,N=5。時間0.0、0.1、0.2、0.3、0.4秒是五個點,首末跨度只有四個間隔,即0.4秒。窗口數乘週期是0.5秒,但那不是這五筆樣本的首末跨度;設計文件需分清這兩個量。
五筆算術移動平均是每次取最近五筆相加再除五。新值進來時最舊值離開,並非從開機以來所有值一直加總。因此突變會逐步替換窗口內舊值,反應速度取決於筆數和取樣間隔,不只取決於CPU掃描速度。
先定義取樣事件。程式每掃描執行一次,不代表感測器每掃描都更新;若每10ms把同一個100ms才更新的值放入窗口,就會重複計入相同來源樣本。取樣規格應說明由哪個更新事件或時間基準加入一筆資料。
本文是數值演算法教學,未指定Q系列原生平均指令或特殊裝置。適用於理解固定週期樣本平均與驗收;若要用於保護或快速控制,應先評估延遲能否接受,不能因顯示平滑就認為訊號更準確或設備更安全。
用零到一百的步階驗證
準備操作序列:前四筆都是0,第五筆開始變100並一直維持。第一個滿窗口是0、0、0、0、100,總和100,平均20。下一筆100加入後,移除第一個0,窗口變0、0、0、100、100,平均40。
繼續加入100,輸出依序60、80、100。這組20、40、60、80、100是很容易人工核對的測試向量。若第一次就到100,可能只在顯示最新值;若一直小於100,可能移除舊值或更新總和的順序有錯。
假設第一筆100的時間是0.4秒,輸出在0.4、0.5、0.6、0.7、0.8秒分別20、40、60、80、100。從第一筆新值到窗口完全換成新值,經過0.4秒。這不表示每種波形都簡單延後0.4秒,而是此步階的滿窗替換時間。
五點等權重對稱FIR在固定取樣下,頻率響應可提出兩個樣本的線性相位延遲;在群延遲有定義的頻率區域,對應0.2秒。群延遲與剛才步階完全到位的0.4秒是不同概念,不能混成一個保證所有訊號的固定反應時間。
若只關心告警大於50何時成立,本例第一個滿窗平均20,下一次40,再下一次60才超過50,也就是0.6秒。原始值在0.4秒已到100,平均後告警晚0.2秒;更換門檻或波形,延遲也會變,需用實際需求驗收。
啟動 缺樣與總和更新
開機前四筆不足五筆,本例讓平均結果標未就緒,直到五筆有效資料才輸出完整窗口結果。另一種策略是以目前有效筆數計短窗口平均,但必須顯示Count與尚未滿窗。不要默默用零填空槽,因為那會把不存在的量測當成真實零。
滿窗口後可採總和減去離開值、再加新值的方式更新。先保存即將覆蓋的舊值,再寫入新值;若先覆蓋後才讀舊值,就可能把新值又減掉。用五筆離線陣列逐步列出舊值、新值、總和與索引,可以快速抓到這種錯誤。
整數總和的範圍要先算。五筆有號十六位元最大正值32767,總和163835,不能放回有號十六位元;最小值−32768乘五是−163840。目的平均值雖仍在原範圍,中間總和卻需要較寬型別,不能等最後除五才處理溢位。
若遇到缺樣或無效資料,本例中斷當前有效窗口,重新累積五筆連續有效樣本。也可以另設跳過無效值的平均,但那會改變實際時間跨度,需標有效筆數和缺口。兩種政策不能在同一份驗收中混用,失聯更不能補零當正常低值。
使用浮點遞推總和時,長時間加減可能累積數值誤差。可依需求定期由窗口原始值重算並比對,但重算頻率與執行成本需評估。無論採何種方式,都保留窗口內容以供抽查,不能只保留一個平均值而失去重算依據。
週期變動時重新定義平均
若五筆時刻變成0.0、0.1、0.4、0.5、0.9秒,數值仍可加總除五,但首末跨度變0.9秒,不能再宣稱固定0.2秒群延遲。這仍是五個樣本的平均,不一定等於這0.9秒內的時間平均。
用更小的例子看差別:0秒值0、1秒值100、10秒值100,三筆樣本平均是66.67。若明示每筆值保持到下一筆,0到10秒的時間平均是(0×1+100×9)/10=90。最後10秒的樣本沒有額外持續區間,不能又重複加權一次。
所以需求若是最近一秒的平均,要決定使用等週期重新取樣、按實際時間加權,或只接受符合時間條件的窗口。補點採保持還是插值也會改變結果,必須明示,不能從缺資料直接推定中間數值。
失敗時先查來源是否真的更新,再查窗口索引、有效筆數、總和寬度和缺樣策略。平均值卡住可能是反覆加入同一樣本,突然偏低可能是把空槽補零;只有大數時錯則先查總和溢位。按症狀查具體資料,比任意調N更有效。
完成後應能重算五筆內容、20到100的步階序列,並辨識未滿窗與缺樣狀態。設定表同時保存N、取樣條件、輸出時間標記和有效性政策。
比較不同窗口時,保持相同來源資料和取樣週期。五筆改成九筆後,首末跨度由四百變八百毫秒,步階完全替換也需要更多新樣本。用原始值與兩條輸出曲線並排看,確認平滑程度改善是否值得付出延遲,而不是只挑最平的一條。
常見問題
問:五筆100ms樣本跨度是500ms嗎?答:首末之間只有四個間隔,跨度400ms。
問:開機資料不足可補零嗎?答:本例不補零,先標未就緒;若另採短窗口平均,需明示有效筆數。
問:群延遲200ms代表步階200ms就到100嗎?答:不同概念,本例步階滿窗替換需400ms。
問:不固定週期仍能加總除五嗎?答:可得到樣本平均,但不是自動得到時間平均,時間模型需另訂。
參考:Python statistics官方文件,mean算術平均定義;非PLC API。
參考:SciPy signal.group_delay官方文件,群延遲定義及未定義頻率限制;本文五點算例自行推導。