如何将 DFT 转换为 DCT

信息处理 图像处理 离散信号
2022-02-05 18:08:06

我一直试图找到一个快速的 16 点 dct2 和 dct3 实现,但是我只能在以数学方程表示的文献中找到它,老实说我无法理解。

但是我确实找到了一个输出 dft 转换的代码生成器。我遇到的主要问题是 DFT 和逆 DFT 没有相同的数字进出。

// Before DFT              // After DFT and IDFT
inputArray[ 0] = 12;       outputArray[ 0] = 184;
inputArray[ 1] = 12;       outputArray[ 1] = 194;   
inputArray[ 2] = 12;       outputArray[ 2] = 178;
inputArray[ 3] = 14;       outputArray[ 3] = 198;
inputArray[ 4] =  8;       outputArray[ 4] = 155;  
inputArray[ 5] = 10;       outputArray[ 5] = 141;
inputArray[ 6] = 12;       outputArray[ 6] = 164;
inputArray[ 7] = 12;       outputArray[ 7] = 149;
inputArray[ 8] = 12;       outputArray[ 8] = 138;
inputArray[ 9] = 12;       outputArray[ 9] = 121; 
inputArray[10] = 12;       outputArray[10] = 107;
inputArray[11] = 12;       outputArray[11] = 90;
inputArray[12] = 12;       outputArray[12] = 74;  
inputArray[13] = 12;       outputArray[13] = 55;
inputArray[14] = 12;       outputArray[14] = 37;
inputArray[15] = 12;       outputArray[15] = 19; 

我意识到前 5 个左右的索引在除以 16 时确实等于输入,但是随着您下降,这种趋势不会继续。

这是预期的行为吗?或者我还需要做些什么来获得正确的转换吗?

此外,我确实找到了一个 8点 dct效果很好并给出了正确的结果,有没有办法将它扩展到一个快速的 16 点 dct?

编辑:

我想找到一个快速的 16x16 DCT 的原因是因为我正在开发一个支持透明度的 javascript 视频编解码器。

所以在帧间预测完成后,我留下了很多残留物。因为它在 javascript 中,并且每秒处理 24 帧,所以我需要尽可能快的方法来压缩和解压缩这个残留物。

1个回答

这取决于哪个 DCT(其中有四个以上),其想法是获取您的原始数据并将其附加到该数据的镜像反射副本。现在您的数据长度是原来的两倍,并且您对两倍的长度执行 FFT。但是你有一些对称性,允许你在 DFT 的结果中折腾一半的数据。

具体如何,取决于它是 DCT I、DCT II、DCT III、DCT IV 还是“MDCT”,或者是本月的 DCT 风格。

在这里看起来很有用。 它可能需要进一步探索。