代码之家  ›  专栏  ›  技术社区  ›  Qwertie

超快2x有损音频/图像压缩算法?

  •  1
  • Qwertie  · 技术社区  · 6 年前

    我正在寻找一个音频或图像压缩算法,可以压缩16位样本的洪流

    • 相当可预测的数量(2-3倍)
    • 在非常高的速度下(例如,每个样本最多60个周期:>100mb/s)
    • 损失是可以接受的,但当然是不可取的

    我的数据具有图像和音频的特征(二维,二维相关,一维类音频),因此音频或图像的算法可能都是合适的。

    一个显而易见的尝试就是这种一维算法:

    • 将数据分成64个样本段
    • 测量这些样本之间的值范围(例如,一个段中的样本可能在3101到9779之间,相差6678)
    • 使用2到4个额外字节对范围进行编码
    • 线性地将该段中的每个16位采样降到8位。

    例如,我可以用16位存储3101,并存储一个比例因子 ceil(6678/256) = 27 在8位中,然后将每个16位样本转换为8位 s8 = (s16 - base) / scale 哪里 base = 3101 + 27>>1, scale = 27 ,具有明显的解压“算法” s16 = s8 * 27 + 3101 )压缩比:128/67=1.91。

    我已经想出了一些避免除法运算的办法,但现在不是有人发明了一种超高速算法,可以比这个算法更好地保持保真度吗?

    注: this page 说flac每秒压缩2200万个样本(44mb/s) -q6 如果对我的应用程序来说还不够的话,这是非常好的(假设它的实现仍然是单线程的)。 Another page 说flac的性能(在3.4ghzi3-3240,-q5上为40mb/s)与其他3个编解码器相似,这取决于质量水平。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mark Adler    6 年前

    看看 PNG filters 举例说明如何理清你的相关性。最明显的过滤器是“sub”,它简单地减去连续的样本。差异应该集中在0左右。然后,您可以通过类似快速压缩机运行 lz4 . 其他过滤器的选择可能会导致更好的集群在零附近,如果他们可以找到优势在你的其他维度的相关性。

    对于有损压缩,可以在压缩它们之前抽取差异,删除一些低比特,直到获得所需的压缩,并且仍然保留要保留的数据的字符。