3. 无损压缩基础与熵编码

高频采集数据(如振动、电流、温度、压力等通道)在采样率提升到 10 kHz~1 MHz 后,原始数据量会迅速膨胀。以 8 通道、24 bit、100 kHz 采样为例,每秒产生 8×3×100000 ≈ 2.4 MB 原始数据,一天就是约 207 GB。无损压缩的目标是在不丢失任何采样点数值的前提下,把存储与传输成本降下来。本章从信息熵出发,讲清熵编码的原理,并落到高频采集场景中的实现与评估方法。

一、信息熵:压缩极限的度量

信息熵由香农提出,用来衡量一个离散信源的平均不确定度。设信源符号集为 {x₁, x₂, …, xₙ},各符号出现概率为 p(xᵢ),则熵定义为:

H(X) = - Σ p(xᵢ) · log₂ p(xᵢ)   (单位:bit/符号)

熵的物理含义是:在无损前提下,平均每个符号至少需要多少比特才能表示。若某通道采样值只有 4 种电平,概率分别为 0.5、0.25、0.125、0.125,则 H = 0.5×1 + 0.25×2 + 0.125×3 + 0.125×3 = 1.75 bit/符号,而原始固定 2 bit 编码平均要 2 bit,压缩空间约 12.5%。

香农信源编码定理指出:对无记忆信源,无损编码的平均码长 L 满足 H(X) ≤ L < H(X) + 1。也就是说,熵是压缩率的下界,任何无损编码都不可能突破它。这给工程实践一个明确判断:如果某通道实测熵为 6.2 bit/样本,而原始是 16 bit,那么理论压缩比上限约为 16/6.2 ≈ 2.58,实际做到 2.2~2.4 已属良好。

二、霍夫曼编码:变长前缀码

霍夫曼编码是最经典的熵编码之一。它按符号概率自底向上构建二叉树:每次取概率最小的两个节点合并,新节点概率为两者之和,重复直到只剩一个根节点,再从根到叶分配 0/1 得到码字。概率大的符号码短,概率小的码长,从而逼近熵。

以 5 个符号为例,概率为 A:0.4、B:0.2、C:0.2、D:0.1、E:0.1。合并 D+E=0.2,再合并 B+C=0.4,再合并 0.2+0.4=0.6,最后与 A 合并。可得码长:A=1、B=2、C=2、D=3、E=3,平均码长 L = 0.4×1 + 0.2×2 + 0.2×2 + 0.1×3 + 0.1×3 = 2.0 bit,而熵 H = 2.12 bit,效率约 94%。

霍夫曼码是前缀码,任意码字都不是另一码字的前缀,因此解码无歧义。但它有两个工程限制:一是必须预先统计概率并传输码表,码表本身有开销;二是码长必须为整数比特,当符号概率接近 1 时无法进一步压缩。在高频采集中,常先对采样值做差分或预测,再对残差做霍夫曼编码,使残差分布更集中,提升压缩效果。

三、算术编码与区间编码

算术编码突破了整数码长的限制。它把整个符号序列映射到 [0,1) 区间内的一个实数子区间:初始区间为 [0,1),每读入一个符号,就按该符号的累积概率范围把当前区间按比例缩小。最终只需输出一个落在最终区间内的二进制小数即可表示整段序列。其平均码长可以非常接近熵,尤其适合概率高度偏斜的数据。

区间编码(Range Coding)是算术编码的整数化实现,用整数上下界代替浮点区间,避免了浮点精度问题,便于硬件和嵌入式实现。它同样通过累积频率表更新区间,解码时根据当前值落在哪个符号区间反推符号。区间编码在视频、音频和高速采集压缩中应用广泛。

算术/区间编码的代价是计算复杂度高于霍夫曼,且对错误传播敏感——一位出错可能导致后续解码全部错位。因此在高频采集系统中,通常把数据分块(如每 4096 个样本一块),每块独立编码,既限制错误传播,又便于并行处理。

高频采集数据无损压缩:熵编码信号链 原始采样流 24 bit / 100 kHz 差分/预测 残差集中化 分块 4096 样本 限制错误传播 熵编码器 霍夫曼 / 区间编码 三种熵编码方式对比 霍夫曼编码 • 变长前缀码,整数比特 • 需传输码表,有开销 • 平均码长 L ≥ H • 实现简单,解码快 算术编码 • 区间映射,非整数码长 • 平均码长可逼近 H • 浮点精度要求高 • 错误传播敏感 区间编码 • 整数化算术编码 • 适合嵌入式/硬件 • 压缩率接近算术编码 • 需累积频率表 性能评估指标 压缩比 原始大小 / 压缩后大小 编码效率 H / L × 100% 吞吐率 MB/s 编解码速度 资源占用 CPU / 内存 / 延迟

四、在高频采集中的实现要点

把熵编码用到高频采集,不能只套算法,还要处理几个工程问题。

概率模型的选择。霍夫曼需要先统计全局概率,适合离线压缩;区间编码可以用自适应模型,边编码边更新频率表,适合流式采集。自适应模型无需传输码表,但解码端必须严格同步更新,否则会错位。

分块与并行。把连续采样按 4096 或 8192 个样本分块,每块独立统计和编码。这样既限制错误传播,又可以让多核 CPU 或 FPGA 并行处理。块大小需要权衡:块太小,码表/频率表开销占比高;块太大,并行度和错误隔离变差。

残差编码。原始采样值相邻点高度相关,直接对原始值编码效果差。通常先做一阶差分:d[n] = x[n] − x[n−1],再对 d[n] 做熵编码。差分后残差集中在 0 附近,熵显著降低。对于周期信号,还可以用线性预测器,如 x̂[n] = 2x[n−1] − x[n−2],进一步减小残差。

码表传输与同步。霍夫曼码表需要随数据一起存储或传输。常见做法是把码表放在块头部,或用规范霍夫曼码(Canonical Huffman)只传码长,减少开销。区间编码若用自适应模型,则收发两端用相同初始频率表和更新规则,不需要额外码表。

五、性能评估方法

评估一套熵编码方案,至少看四个指标:压缩比、编码效率、吞吐率和资源占用。压缩比 = 原始字节数 / 压缩后字节数;编码效率 = H / L × 100%,越接近 100% 越好;吞吐率用 MB/s 衡量,高频采集常要求编码速度不低于采样速度;资源占用包括 CPU 占用、内存和编解码延迟。

以一个教学示例说明:某振动通道 16 bit、50 kHz 采样,取 1 秒数据共 100 KB。统计得原始熵 H = 9.8 bit/样本。用一阶差分后残差熵降到 6.5 bit/样本。采用区间编码,实测平均码长 6.8 bit/样本,压缩后约 42.5 KB,压缩比约 2.35,编码效率 6.5/6.8 ≈ 95.6%。若改用霍夫曼,平均码长约 7.2 bit/样本,压缩后约 45 KB,压缩比约 2.22。该示例说明:差分预处理带来的收益往往大于编码算法本身的差异,而区间编码在偏斜分布下比霍夫曼更接近熵极限。

在实际系统中,建议先用一段代表性数据统计熵和残差分布,再决定用霍夫曼还是区间编码。若残差分布集中且对速度要求高,霍夫曼更简单;若追求更高压缩比且能接受更高计算量,区间编码更合适。无论选哪种,分块、差分和码表管理都是必须处理好的工程环节。