n维DCT的快速算法

信息处理 dct C C++
2022-01-26 13:16:07

我需要实现一个编码器,它压缩 10 位值的 5 维结构。每个维度有 4 到 12 个元素。如果一个维度的元素超过 12 个,则将其分成两半。到目前为止,我一直在使用可分离的 DCT 来做到这一点,但我的实现速度很慢:我实现了一个简单的 DCT 变换,它的复杂度为O(N2). 我尝试了一些快速算法,但它们似乎比天真的方法慢:6 个元素的天真 DCT 比快速版本更快,但对于N=48,快速的方法肯定更快。另外,我不能强制使用友好的 2 次幂大小。

我记得 Cooley–Tukey FFT 算法分解了一个大小序列N进入他们的因素N1N2这样N=N1N2. 我还知道,由于在视频和图像编解码器中使用了 2D DCT,因此有专门的算法。

我的问题是:是否有关于快速多维 DCT 甚至是用于 DCT 的“反向”Cooley-Tukey 的参考,我可以将我的 5D 阵列转换为 1D 并使用快速 DCT?

Exrta bits:我们不仅在研究 DCT-II,而且还在研究整个三角变换系列。欢迎对任何 DST 和 DCT 的见解!

9/23 编辑

作为一个额外的评论,这个解决方案正在用 C++ 实现。

2个回答

由于这些向量长度非常短,因此“常规”快速变换不会给您带来任何收益。

您最好的选择可能是单独手动编码每个可能的变换长度,展开所有循环并手动利用所有“微不足道”的系数。

另一种选择可能是减少数据的二元性,但这取决于您在每个维度中获得多少编解码器增益。如果有一个维度具有大部分编解码器增益,您可以保留它并线性化其他维度。

我将分享想法和提示,因为我没有提供明确的解决方案。我的经验是地震数据压缩,为此我在典型大小的二维地震数据上实现了不同类型的 DCT、Haar、Walsh-Hadamard、小波、重叠正交变换及其扩展(LOT、MLT、GenLOT、GULLOT)20004000在一维中,并且50200在另一。后者是一个问题。

首先,让我假设您在长度为 4 到 12 的每个维度上分别应用整个经典 DCT/DST。正如 Hilmar 所写,我怀疑您可以通过使用素因子分解来获得很多改进。一个原因是性能在某种程度上是渐近的:在全球范围内,你可以希望一些O(logN)性能,但它通常带有一些不再可以忽略的低阶项或常数N是小。DCT 主要有 2D 和 3D 可分离或不可分离版本(用于图像、音量或视频)。不可分离的通常在数据稀疏化方面表现更好,但由于实现复杂性付出了代价,因此通常不使用。再一次,操作数量的增加并不是压倒性的,而且有点特别:除了经典的素数分解之外,一个人可以节省更多的操作,但它似乎非常依赖于长度。正如 Hilmar 所说,您可以为每种情况手动优化原语,但这会非常乏味。

我想到的第二件事是多维数组索引的问题(我真的不是这方面的专家)。然而,在我看来,数据样本的(物理)连续性似乎起着非常重要的作用。我了解到,对于庞大的 3D 地震数据量,通常将数据存储在三个打乱的副本中,每个副本都组织成在三个方向的每个方向上都具有最佳的字节连续性。换句话说,人们更喜欢将数据量增加三倍以从每个 3D 体积的加速中受益。地震数据可能非常庞大,以至于我听说大型超级计算设施 (HPC) 可能需要数周时间才能对 PB 级数据执行仅仅字节交换。对于 5D 数据,这可能值得一看。这又可能与上述第一点相结合:字节重新排序与两个 2D 优化 DCT 和最后一个相结合。

第三个改进可能来自按位实现。有很多技巧可以玩。例如,如果您的 5D 数据是 10 位,则可以将它们全部填充到 64 位字中,从而节省几个缓冲区位用于进位。过去计算成本很高时,人们会这样做:如果要添加 3 位字,可以将它们成对地写入一个 8 位字中,每个字节省一位进位,同时添加两对时间。我稍后会在转换方面回来。

第四,即使您认为通过零填充添加不存在的数据是一种耻辱,我建议您通过更精细的信号扩展重新考虑这一点。我观察到将例如 87 扩展到 96,在质量和速度上都具有适当的对称性或外推性。因此,在您的情况下,使用扩展可以让您仅拥有长度为 4、6、8、12 的原语,并为中间的数据填充数据。

五:可以省电的浮点DCT的替代品。整数 DCT、它的近似值(如 RCT)、Walsh-Hadamard(无乘法)可以很好地处理小尺寸(当数据在一维中相关性很差时我使用它们)等。一些转换实现为提升保存再次进行一些计算。

六:现在让我们讨论DCT的目标和“小于12的块”。将 DCT 应用于小块,您可能会得到块效应,并且由于在某些维度上无法使用长程相关性,因此压缩效率会滞后。由于您被划分为超过 12 个样本的一半数据,因此有许多替代方法可以将数据作为一个整体并执行细化。小波可以以相当便宜的价格做到这一点。显然,您在进行有损压缩之后,除块 DCT 之外的许多其他方案都可以做得很好。

然而,以上所有内容都取决于您的数据的相关性,以及您能够负担得起的压缩以满足您的后续处理需求。但是,我真的相信您将需要对上述曲目进行一些组合。