2015-06-08 30 views
2

我有一個Beaglebone黑色的設置,每秒都會通過I²C與他的奴隸進行通信,並從中讀取數據。有時I²C讀數失敗,但我想獲得有關這些失敗的統計數據。有沒有簡單的方法來獲得最後x分鐘成功讀取的百分比?

我想實現一個算法,顯示過去5分鐘(最多24小時)成功通信的百分比並不斷更新該值。如果我通過一個數組存儲成功/不成功的數組來實現'正常',那麼這意味着大量浪費的RAM/CPU負載用於次要功能(特別是如果我想查看最後一個統計數據24小時)。

有人知道一個很好的方法來做到這一點,或任何人都可以指向正確的方向嗎?

+0

你能解釋一下問題所在嗎?這個功能如何使用大量的RAM或CPU?你只需要保持成功和失敗的計數? –

+0

@MartinJames因爲人們必須跟蹤每個閱讀的狀態和時間戳,我想 – Eregrith

+0

@Eregrith:自己做數學或看我的答案。完全可以忽略不計。 –

回答

3

你爲什麼不實施一個低通濾波器?對於每一個成功的轉移,你推入一個1,每個失敗的一個0;結果是一個介於0和1之間的數字。假設您的傳輸週期性發生,這可以很好地工作 - 而且您只需將該濾波器的截止頻率調整到期望的「平均持續時間」即可。但是,我不能遵循你的RAM參數:假設你存儲了一個代表每次傳輸成功或失敗的字節,而你說每秒發生一次,那麼每天最終以86400B的速度發生 - 每日85KB是微不足道的。

編輯截止頻率來自信號理論,並描述通過低通或高通濾波器的最高或最低頻率。

實現一個低通濾波器是微不足道的;像(僞代碼):

new_val = 1 //init with no failed transfers 
alpha = 0.001 
while(true): 
    old_val=new_val 
    success=do_transfer_and_return_1_on_success_or_0_on_failure() 
    new_val = alpha * success + (1-alpha) * old_val 

這是一個單抽頭IIR(無限脈衝響應)濾波器;單擊是因爲只有一個字母,因此只有一個數字被存儲爲狀態。

EDIT2alpha的值定義了此過濾器的行爲。

EDIT3:您可以使用過濾器設計工具爲您提供正確的alpha;只需將低通濾波器的截止頻率設置爲0.5/integrationLengthInSamples之類的值,爲IIR選擇0的階數並使用橢圓設計方法(大多數工具默認爲巴特沃斯,但0階巴特沃斯不做任何事情)。

我會使用scipy並將生成的(b,a)元組(a將爲1,在這裏)轉換爲此反饋表單的正確格式。

+0

如何以及如何調整才能從最近n分鐘獲取數據而不存儲事件時間戳? – Eregrith

+0

哦,我明白了,我明白你的意思*推0或1 * – Eregrith

+0

這隻適用於讀取穩定在1 /秒的情況。 – Eregrith

2

UPDATE根據OP的評論'確定哪些設備失敗的趨勢',我會推薦MarcusMüller提出的幾何平均值。 下面的方法旨在獲得「定義明確的」隨時間變化的性能統計數據,這對「事後」分析也很有用。 請注意,幾何平均值對最近的消息有一個'回顧',而不是固定的時間段。

保持24 * 60/5 = 288'先前成功率(SR [i],i = -1,-2,..., - 288)的滾動陣列,每個代表5分鐘的間隔前24小時。

如果元素是64位雙打,這將消耗約2.5K。

要 '效果' 不斷更新使用的估計 '當前' 成功率如下:

ECSR =(T * S/M +(300-T)* SR [-1])/ 300

其中S和M是當前(部分完成時間段內的錯誤和消息的計數,SR [-1]是前一個(現在已完成)存儲桶的數量。

注意:啓動時需要使用300 * S/M/t。

實質上,近似假設錯誤率在前5到10分鐘內保持穩定。

爲了「有效」24小時回顧,您可以在每個5分鐘的時間間隔結束時「下洗」數據(通過複製或memcpy()),或通過跟蹤當前存儲區索引實施「循環陣列」 」。

注意:對於許多管理/診斷目的,間隔15分鐘通常是完全足夠的。您可能希望使「糧食」可配置。

+0

感謝您的回答!我非常感謝所有的幫助 – Max

相關問題