我有一个Beaglebone Black的设置,它每秒通过I²C与他的奴隶进行通信并从中读取数据。有时I²C读数会失败,我想得到有关这些失败的统计数据。
我想实现一种算法,该算法显示过去5分钟(最多24小时)成功通信的百分比,并不断更新该值。如果我通过一个数组来实现'通常',我存储成功/每秒都没有成功,这意味着很少浪费RAM / CPU负载一个次要功能(特别是如果我想看到最后的统计数据) 24小时)。
有人知道这样做的好方法,还是有人能指出我正确的方向?
答案 0 :(得分:4)
为什么不实施低通滤波器?对于每次成功转移,你输入1,每个失败的一个0;结果是0到1之间的数字。假设您的传输定期发生,这很有效 - 您只需将该滤波器的截止频率调整到所需的平均持续时间"。
但是,我无法遵循您的RAM参数:假设您存储一个字节表示每次转移成功或失败,您说这是每秒发生一次,最终每天86400B - 85KB /天实际上可以忽略不计
EDIT 截止频率来自信号理论,描述了通过低通或高通滤波器的最高或最低频率。
实现低通滤波器是微不足道的;像(伪代码):
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(无限脉冲响应)滤波器;单击,因为只有一个alpha,因此只有一个数字存储为状态。
EDIT2 :alpha
的值定义了此过滤器的行为。
EDIT3 :您可以使用过滤器设计工具为您提供正确的alpha
;只需将低通滤波器的截止频率设置为0.5 / integrationLengthInSamples,为IIR选择0的顺序,并使用椭圆设计方法(大多数工具默认为butterworth,但0阶段的输出不会一件事。)
我使用scipy并将生成的(b,a)
元组(a
将在此处为1)转换为此反馈表单的正确格式。
答案 1 :(得分:3)
更新根据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]是先前(现在已完成)的存储桶。
t是当前存储桶过期的秒数。
注意:启动时需要使用300 * S / M / t。
本质上,近似假设错误率在前5-10分钟内保持稳定。
为了“影响”一个24小时的回顾,您可以在每个5分钟间隔结束时(通过复制或memcpy()
)“混乱”数据,或者通过跟踪数据来实现“圆形阵列”当前桶指数'。
NB:对于许多管理/诊断目的,15分钟的间隔通常是完全足够的。您可能希望使'grain'可配置。