0

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

我认为应该可行的方案涉及稀疏编码和有损压缩的变体。像这样:

  1. 系统将在 10 毫秒间隔内在内部存储最小值和最大值。
  2. 系统将在内部对这些数据对的有限数量(例如 50 个)进行排队。
  3. 不允许丢失最小值或最大值,但它们发生的时间间隔可能会有所不同。
  4. 当队列满时,相邻的数据对将从队列的末尾开始合并,这样转换后的最小/最大对现在代表 20 毫秒的间隔。
  5. 该方案应该是迭代的,以便在必要时将进一步的间隔组合为 40ms、80ms 等。
  6. 该方案应该在队列的长度上线性加权,以便没有对最新数据的组合和对最旧数据的最大必要组合。

例如,对于长度为 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

左侧添加新样本,右侧读取数据。

这个想法显然属于有损压缩稀疏编码的范畴。

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

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

问题:

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

3 回答 3

0

据我了解,您希望在一段时间内传输所有样本的 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

您还可以通过仅在更改时发送数据来节省带宽(取决于示例数据:如果它们不快速更改,您将节省很多)

于 2013-05-01T08:56:57.953 回答
0

您正在寻找的术语是“有损压缩”(参见:http ://en.wikipedia.org/wiki/Lossy_compression )。最佳压缩方法取决于各个方面,例如数据的分布。

于 2013-04-30T15:56:24.477 回答
0

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

于 2013-05-01T01:58:20.987 回答