我已经在 Google 上搜索了一段时间,以找到一个相当高效的 8x8(或 nxn)DCT 算法的伪代码,但我什么也找不到!
我实施了幼稚的方法,执行时间太长了。
如果您可以发布一些伪代码或参考一本好书/文档/网站,那将很有帮助。
C 或 C++ 示例会更好!
根据评论中的要求,来源(稍微警告一下,它在 C# 中,但与 C++ 的差异应该很小,是的,我知道代码很蹩脚):
主循环(A = 结果,B = 输入):
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 x 512 像素(单通道)需要半秒。当然这很慢,但远不及“永远”。
FFTW有一个开源的高效实现