寻找8x8(或nxn)离散余弦变换(DCT)/IDCT伪代码
Looking for 8x8 (or nxn) Discrete Cosine Transform (DCT)/IDCT Pseudo-Code
我已经在谷歌搜索了一段时间,现在找到一个相当有效的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有一个开源的高效实现
相关文章:
- 基于范围的变换以实现正常循环
- OpenCV 傅里叶变换复杂输出问题
- SFML 纹理变换(放大)
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在特征中显示仿射变换
- 离散傅立叶变换C++
- ICP变换矩阵平移和旋转
- 如何从2D数组为QHeightMapSurfaceDataProxy创建高度图以显示2D傅立叶变换结果
- 将 3D 变换转换为 2D
- 使用变换翻转地图,接收错误"type int unexpected"
- 指示 Qi 变换属性失败的适当方法是什么?
- 如何在 c++ 中将变换与对的向量一起使用
- 骨骼动画:变换矩阵(collada)之间的插值
- 函数已知时的傅里叶变换
- 与 fftw3 相比,错误的 2D CuFFT 逆变换
- DFT(离散傅里叶变换)与C++代码
- 3D 矢量 - 变换和减号
- 快速计算变换/旋转马里克斯4x4
- 寻找8x8(或nxn)离散余弦变换(DCT)/IDCT伪代码