你爲什麼不實施一個低通濾波器?對於每一個成功的轉移,你推入一個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(無限脈衝響應)濾波器;單擊是因爲只有一個字母,因此只有一個數字被存儲爲狀態。
EDIT2:alpha
的值定義了此過濾器的行爲。
EDIT3:您可以使用過濾器設計工具爲您提供正確的alpha
;只需將低通濾波器的截止頻率設置爲0.5/integrationLengthInSamples之類的值,爲IIR選擇0的階數並使用橢圓設計方法(大多數工具默認爲巴特沃斯,但0階巴特沃斯不做任何事情)。
我會使用scipy並將生成的(b,a)
元組(a
將爲1,在這裏)轉換爲此反饋表單的正確格式。
你能解釋一下問題所在嗎?這個功能如何使用大量的RAM或CPU?你只需要保持成功和失敗的計數? –
@MartinJames因爲人們必須跟蹤每個閱讀的狀態和時間戳,我想 – Eregrith
@Eregrith:自己做數學或看我的答案。完全可以忽略不計。 –