是否有一种简单的方法可以获得最后x分钟成功读取的百分比?

时间:2015-06-08 11:42:19

标签: c arrays algorithm percentage

我有一个Beaglebone Black的设置,它每秒通过I²C与他的奴隶进行通信并从中读取数据。有时I²C读数会失败,我想得到有关这些失败的统计数据。

我想实现一种算法,该算法显示过去5分钟(最多24小时)成功通信的百分比,并不断更新该值。如果我通过一个数组来实现'通常',我存储成功/每秒都没有成功,这意味着很少浪费RAM / CPU负载一个次要功能(特别是如果我想看到最后的统计数据) 24小时)。

有人知道这样做的好方法,还是有人能指出我正确的方向?

2 个答案:

答案 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'可配置。