我使用经典算法成功计算了图像的 2d dct,也用作 1d 数组的组合。这两种方法的时间复杂度分别为 n^4 和 n^3。 在映像上实现时,计算需要很长时间。就像 7 分钟对于 512 x 512 的图像,使用 n^3 复杂度的图像。
是否有其他算法可以计算具有最小时间复杂度的DCT?
matlab是如何做到这么快的呢?
快速DCT有两种常用方法。
-
DFT的DCT
1D DCT可以在
O(n)
从1D DFT派生出来,因此当应用FFT算法时,您可以获得1D的O(n.log(n))
,2D的O(n^2.log(n))
。有关详细信息,请参阅:- 我正在寻找一种用于矩阵 [NxM] 的快速 DCT 和 IDCT 的简单算法
这种方法被更多地使用,因为它更容易实现。关于如何从DFT派生DCT,还有更多方法,一些使用相同的阵列大小,另一种使用双倍大小的DFT。
-
快速直流电转换器
那里也有快速的DCT方程,但它们并不常用,因为它们不是很知名,也没有在网上有很好的记录。另一个更重要的一点是,递归分解涉及DCT和DST,并且拆分通常分为3个热而不是2个热,这使得实现更加困难。此外,我们需要快速的DST实现,类似于DCT,因此它也分解为3热,并且同时使用DCT和DST。好的一面是它不涉及复杂的域,但正如您可以想象的那样,与#1相比,需要更多的代码。
从快速搜索中我找到了这个
- 通过MDCT进行快速的DCT-IV/DST-IV计算
但是在实际领域找到有关快速DCT的相关信息是一个问题,因为大多数文章要么是硬连线(常量
n
(实现,要么正在使用方法#1。当你发现它通常会包含错误并且不起作用的东西时。这种方法的最佳选择是找到一些关于计算机图形学或离散数学的旧论文或书籍。