寻找8x8(或nxn)离散余弦变换(DCT)/IDCT伪代码

Looking for 8x8 (or nxn) Discrete Cosine Transform (DCT)/IDCT Pseudo-Code

本文关键字:DCT 变换 IDCT 伪代码 余弦 8x8 nxn 寻找      更新时间:2023-10-16

我已经在谷歌搜索了一段时间,现在找到一个相当有效的8x8(或nxn) DCT算法的伪代码,我找不到任何东西!

我实现了朴素的方法,但执行起来太长了。

如果你能发布一些伪代码或参考一本好书/文档/网站,那将会很有帮助。

C或c++的例子会更好!

按照评论的要求,源代码(稍微警告一下,这是c#,但与c++的区别应该是最小的,是的,我知道代码很蹩脚):

主循环(A = result, B = input):

for (int y = 0; y < 8; y++)
{
    for (int x = 0; x < 8; x++)
    {
        A[y * 8 + x] = 0;
        for (int u = 0; u < 8; u++)
            for (int v = 0; v < 8; v++)
                A[y * 8 + x] += alpha(u) * alpha(v) * B[u, v] *
                    cosine[u, x] * cosine[v, y];
    }
}

支持的东西:

static double alpha(int i)
{
    if (i == 0)
        return SQRT2o2 * 0.5;
    return 0.5;
}
const double SQRT2o2 = 1.414213562373095048801688724209 * 0.5;
cosine = new double[8, 8];
const double inv16 = 1.0 / 16.0;
for (int i = 0; i < 8; i++)
{
     for (int j = 0; j < 8; j++)
     {
         cosine[j, i] = Math.Cos(Math.PI * j * (2.0 * i + 1) * inv16);
     }
}
我计时了——对于512 × 512像素(单通道),它需要半秒。当然,这是缓慢的,但离"永远"还差得远呢。

FFTW有一个开源的高效实现