通过存储信号差异而不是实际样本来压缩信号 - 有这样的事情吗?

信息处理 离散信号 数字通信 采样 压缩
2022-01-01 11:51:58

我正在处理以 2kHz 和 16 位采样的 EMG 信号,并注意到它们“看起来很平滑”,也就是说,信号是可微的,如果我应用“diff”函数(numpy.diff在我的例子中),值的大小是大大低于实际样品。

所以我正在考虑做类似的事情:

  • 将信号分成给定大小的块;
  • Foreach 块,使用可变长度数量(或类似的),创建一个字节列表并:
    • 对于块的第一个样本,添加其绝对值
    • 对于块的剩余样本,添加它们相对于先前值的差异

这样,信号越平滑,越接近基线,我就越希望通过减小大部分样本的单个字节大小来减小每个块的字节大小。

虽然我怀疑这会对我有所改善,但我也怀疑这并不是什么新鲜事,也许它有一个合适的名称,甚至更优雅/更有效的实现方式。

所以问题是:这种压缩技术的名称是什么,它的替代方案和/或变体是什么?

3个回答

您还可以将增量编码视为线性预测编码 (LPC),其中仅存储预测残差(),并且当前样本的预测变量为上一个样本。这是一个固定的线性预测器(没有针对数据优化的任意系数),可以准确地预测恒定信号。对残差再次运行相同的线性预测编码,您就得到了准确预测的线性信号。下一轮,二次信号。或者运行一次高阶固定预测器来做同样的事情。x[n]x^[n]

这些固定的预测变量列在 Tony Robinson 的SHORTEN 技术报告中,你的 Eq. 4,虽然不经常使用,但也包含在FLAC 无损音频编解码器中。计算每个数据块的最佳预测系数并将它们存储在压缩块的标头中导致比使用固定预测器更好的压缩。

为了m-位输入残差是m+1- 位数,因为它是一个m-位输入和一个m位预测。但是,删除残差的最高有效位 (MSB) 不会影响m位模运算,因此残差可以存储为m位数。

线性预测器应该进行白化,使残差独立。在无损压缩中,剩下要做的就是对残差进行熵编码,而不是使用游程或其他基于符号的编码,这些编码在噪声信号上效果不佳。通常,熵编码由前缀码(也称为无前缀码)完成,该码将较长的码字分配给较大的残差,近似地最小化假设的残差值分布的平均编码长度。可以使用与有符号数兼容的 Rice 码(也称为 Golomb–Rice 码或 GR 码)变体,如 FLAC(表 1)中所做的那样,或有符号exp-Golomb 码就像在 h.264 视频压缩标准中所做的那样。Rice 码有一个分布参数,需要针对数据块进行优化,并保存在块头中。

表 1 不同Rice码参数下Rice码编码的4位有符号整数的二进制码字p值,使用FLAC__bitwriter_write_rice_signed源代码)。这种 Rice 代码变体有点浪费,因为并非所有二进制字符串都被识别为代码字。
8765432101234567p=0p=1p=2p=300000000000000100000001000011001110000000000000100000010000100011000000000000100000100011001010000000001000010001000100000000010001001101110000010010010011000010101101010110100100001111011001000101111110110000010011010111010000000100011011111110000000001000011001010100100000000000100000110011101011000000000000010000001100010101101000000000000000100000001100011101111

作为进一步的增强,不仅将一个残差编码,而且将多个残差编码为单个码字可以更准确地适应残差的真实分布,并且可以提供更好的压缩比,请参见非对称数字系统

对于带限信号的无损压缩,您可能想要研究的另一个概念(正是这种带限使您获得了这种“更平滑的……信号,……更接近……基线”)是线性预测编码。

我认为 LPC 最初被用作 Delta 编码的变体在历史上是正确的,其中 LPC 算法从样本集中如果预测是好的,那么真正的离预测不远,你只需要存储增量是较小的幅度和较小的字宽可能就足够了。您需要存储每个块的 LPC 系数,但通常不超过十几个。x^[n]x[n1],x[n2],...x[nN]x[n]x^[n]x[n]x^[n]

可以使用诸如霍夫曼编码之类的方法进一步压缩此存储的差异值,在这种编码中,您需要将“码本”与压缩数据一起存储,或者将某种码本标准化,以便发送器和接收器都知道它。

我认为这是各种无损音频格式使用的 LPC 和霍夫曼编码的某种组合。也许有一些感性的东西用来获得几乎无损的压缩。

这用的很多。参见例如https://en.wikipedia.org/wiki/Delta_encodinghttps://en.wikipedia.org/wiki/Run-length_encoding

“看起来平滑”通常意味着“没有很多高频内容”。利用这一点的最简单方法是找出最高频率真正需要的频率,然后低通滤波器并选择较低的采样率。

如果您的信号具有非平坦频谱,则“白化”信号通常是有利的,即对其进行滤波以使平均频谱为白色,然后使用反向信号进行编码、解码和滤波以恢复信号。这样,您在高能量频率上花费更多位,而在低能量频率上花费更少。您的量化噪声跟随信号的频谱。

您建议的方案是这种方法的最简单形式之一:您的白化过滤器是一个微分器,您的逆过滤器是一个积分器。