Algorithm 可变带宽数据链路的日志数据缩减

Algorithm 可变带宽数据链路的日志数据缩减,algorithm,logging,encoding,sparse-matrix,lossy-compression,Algorithm,Logging,Encoding,Sparse Matrix,Lossy Compression,我有一个嵌入式系统,它以1毫秒的间隔生成样本(16位数字)。可变上行链路带宽最多可以每5毫秒传输一个样本,所以我 寻找方法自适应地降低数据速率,同时最大限度地减少损失 重要信息——在本例中为时间间隔内的最小值和最大值 我认为应该有效的方案包括稀疏编码和有损压缩的变化。像这样: 系统将以10ms的间隔在内部存储最小值和最大值 系统将在内部对这些数据对中的有限数量(比如50)进行排队 不允许丢失最小值或最大值,但它们出现的时间间隔可能会有所不同 当队列满时,相邻的数据对将从队列末尾开始合并,以便转换

我有一个嵌入式系统,它以1毫秒的间隔生成样本(16位数字)。可变上行链路带宽最多可以每5毫秒传输一个样本,所以我 寻找方法自适应地降低数据速率,同时最大限度地减少损失 重要信息——在本例中为时间间隔内的最小值和最大值

我认为应该有效的方案包括稀疏编码和有损压缩的变化。像这样:

  • 系统将以10ms的间隔在内部存储最小值和最大值
  • 系统将在内部对这些数据对中的有限数量(比如50)进行排队
  • 不允许丢失最小值或最大值,但它们出现的时间间隔可能会有所不同
  • 当队列满时,相邻的数据对将从队列末尾开始合并,以便转换的最小/最大对现在表示20毫秒的间隔
  • 该方案应是迭代的,以便在必要时进一步组合到40ms、80ms等间隔
  • 方案应在队列长度上进行线性加权,这样就不会对最新数据进行组合,也不会对最旧数据进行最大必要的组合
  • 例如,对于长度为6的队列,连续数据缩减应使数据对覆盖以下间隔:

    initial: 10 10 10 10 10 10  (60ms, queue full)
     70ms:   10 10 10 10 10 20
     80ms:   10 10 10 10 20 20
     90ms:   10 10 20 20 20 20
    100ms:   10 10 20 20 20 40
    110ms:   10 10 20 20 40 40
    120ms:   10 20 20 20 40 40
    130ms:   10 20 20 40 40 40
    140ms:   10 20 20 40 40 80
    
    在左侧添加新样本,从右侧读取数据

    这一思想显然属于有损压缩稀疏编码的范畴

    我假设这是一个在上行带宽有限的数据记录应用程序中经常出现的问题,因此可能会出现一些“标准”解决方案

    我故意简化并省略了其他问题,如时间戳

    问题:

  • 已经有算法可以进行这种数据记录了吗?我不是在寻找标准的有损图片或视频压缩算法,而是更具体的数据记录,如上所述
  • 最适合队列的实现是什么?链表?树

  • 您要查找的术语是“有损压缩”(请参阅)。最佳压缩方法取决于各个方面,如数据的分布。

    定义一个符合您需要的组合代价函数,例如(len(i)+len(i+1))/i^2,然后迭代数组以找到“最便宜”的对来替换。

    据我所知,您想要传输min()和max()在一个时间段内的所有样本

    你想每10毫秒传输一次最小/最大值,每1毫秒采样一次吗

    如果您不需要单个样本,只需在每次采样后对其进行比较即可

    i=0; min=TYPE_MAX; max=TYPE_MIN;// First sample will always overwrite the initial values
    while true do
        sample = getSample();
        if min>sample then
            min=sample
    
        if max<sample then
            max=sample
    
        if i%10 == 0 then
            send(min, max);
            // if each period should be handled seperatly: min=TYPE_MAX; max=TYPE_MIN;
    done
    
    i=0;最小值=最大值类型;最大值=类型_最小值;//第一个示例将始终覆盖初始值
    尽管如此
    sample=getSample();
    如果最小>采样,则
    最小值=样本
    
    如果你愿意,谢谢。我应该说得更具体些。显然,我对算法的最初想法是减少单个样本,但它从未减少最小值和最大值。它也可以看作是一种“稀疏编码”。