将代码从 DCT 更改为反离散余弦变换?
Change Code from DCT to Inverse Discrete Cosine Transformation?
对于一个项目,我必须演示 JPEG 压缩以及 DCTII 和 IDCT 的转换。我不知道如何实现这个公式。但是我找到了一个提供Java代码和在线IDE的网站进行测试。
https://ide.geeksforgeeks.org/FnC3bRJEAr 这里可以看到代码。
(来自 Wikipedia/JPEG 的公式)
那么,必须对代码进行哪些更改?
我尝试切换 for 循环和公式中的变量,但我得到的值肯定是错误的,其他尝试会导致错误消息。
DCT 和 IDCT 之间的唯一区别在于考虑系数cient 的位置。
您应该将代码中的第 46 行替换为
sum = sum + ck*cl*dct1;
其中 ck 和 cl 的计算与第 24-34 行相同,但对于 k 和 l
并在第 49 行抑制 ci*cj
顺便说一句,这段 java 代码非常低效ci。预先计算 Math.sqrt(2), Math.sqrt(n) 并将余弦值放入 table 中,它至少会快 3 倍。
您的求和正在进行矩阵乘法。您将 8x8 数据矩阵乘以 8x8 DCT 矩阵。
DCT 矩阵是正交矩阵,因此它的逆矩阵是它的转置。
因此,您应该能够通过交换 u 和 v 来取反。
对于一个项目,我必须演示 JPEG 压缩以及 DCTII 和 IDCT 的转换。我不知道如何实现这个公式。但是我找到了一个提供Java代码和在线IDE的网站进行测试。 https://ide.geeksforgeeks.org/FnC3bRJEAr 这里可以看到代码。
(来自 Wikipedia/JPEG 的公式)
那么,必须对代码进行哪些更改?
我尝试切换 for 循环和公式中的变量,但我得到的值肯定是错误的,其他尝试会导致错误消息。
DCT 和 IDCT 之间的唯一区别在于考虑系数cient 的位置。
您应该将代码中的第 46 行替换为
sum = sum + ck*cl*dct1;
其中 ck 和 cl 的计算与第 24-34 行相同,但对于 k 和 l
并在第 49 行抑制 ci*cj
顺便说一句,这段 java 代码非常低效ci。预先计算 Math.sqrt(2), Math.sqrt(n) 并将余弦值放入 table 中,它至少会快 3 倍。
您的求和正在进行矩阵乘法。您将 8x8 数据矩阵乘以 8x8 DCT 矩阵。
DCT 矩阵是正交矩阵,因此它的逆矩阵是它的转置。
因此,您应该能够通过交换 u 和 v 来取反。