我将分享想法和提示,因为我没有提供明确的解决方案。我的经验是地震数据压缩,为此我在典型大小的二维地震数据上实现了不同类型的 DCT、Haar、Walsh-Hadamard、小波、重叠正交变换及其扩展(LOT、MLT、GenLOT、GULLOT)2000到4000在一维中,并且50到200在另一。后者是一个问题。
首先,让我假设您在长度为 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 之外的许多其他方案都可以做得很好。
然而,以上所有内容都取决于您的数据的相关性,以及您能够负担得起的压缩以满足您的后续处理需求。但是,我真的相信您将需要对上述曲目进行一些组合。