Performance 我正在寻找一种简单的快速DCT和矩阵IDCT算法[NxM]

Performance 我正在寻找一种简单的快速DCT和矩阵IDCT算法[NxM],performance,algorithm,mathematical-optimization,dct,Performance,Algorithm,Mathematical Optimization,Dct,我正在寻找一种简单的算法来快速(类型2)处理任意大小的矩阵[NxM],还需要一种逆变换算法(也称为DCT类型3) 我需要一个DCT-2D算法,但即使是DCT-1D算法也足够好,因为我可以使用DCT-1D实现DCT-2D(而IDCT-1D实现IDCT-2D) PHP代码更可取,但任何足够清晰的算法都可以 当矩阵大小大于[200x200]时,我当前用于实现DCT/IDCT的PHP脚本非常慢 我正在寻找一种方法,在不到20秒内将DCT预成高达[4000x4000]。有人知道怎么做吗?下面是我用相同长度

我正在寻找一种简单的算法来快速(类型2)处理任意大小的矩阵[NxM],还需要一种逆变换算法(也称为DCT类型3)

我需要一个DCT-2D算法,但即使是DCT-1D算法也足够好,因为我可以使用DCT-1D实现DCT-2D(而IDCT-1D实现IDCT-2D)

PHP代码更可取,但任何足够清晰的算法都可以

当矩阵大小大于[200x200]时,我当前用于实现DCT/IDCT的PHP脚本非常慢


我正在寻找一种方法,在不到20秒内将DCT预成高达[4000x4000]。有人知道怎么做吗?

下面是我用相同长度的FFT计算的一维FDCT和IFDCT:

//---------------------------------------------------------------------------
无效DFCTrr(双*dst、双*src、双*tmp、int n)
{
//N-DFFT精确归一化DCTⅡ
int i,j;
双nn=n,a,da=(M_PI*(nn-0.5))/nn,a0,b0,a1,b1,M;
对于(j=0,i=n-1;i>=0;i-=2,j++)dst[j]=src[i];
对于(j=n-1,i=n-2;i>=0;i-=2,j--)dst[j]=src[i];
DFFTcr(tmp、dst、n);
m=2.0*sqrt(2.0);
对于(a=0.0,j=0,i=0;i=0;i-=2,j--)dst[i]=src[j]-m;
}
//---------------------------------------------------------------------------
  • dst
    是目标向量
    [n]
  • src
    是源向量
    [n]
  • tmp
    是温度向量
    [2n]
这些数组不应重叠它取自我的转换类,所以我希望没有忘记复制一些东西

  • XXXrr
    意味着目的地是真实的,而来源也是真实的域
  • XXXrc
    意味着目的地是真实的,而来源是复杂的域
  • XXXcr
    意味着目的地是复杂的,而源是真实的域
所有数据都是
double
数组,对于复数域,第一个数字是实部,第二个虚部,所以数组是
2N
大小。这两个函数都使用FFTiFFT,如果您还需要它们的代码,请注释我。只是为了确保我在下面添加了它们的快速实现。复制它要容易得多,因为快速的转换使用了太多的转换类层次结构

用于测试的慢速DFT、iDFT实现:

//---------------------------------------------------------------------------
void transform::DFTcr(双*dst,双*src,int n)
{
int i,j;
双a、b、a0、n、q、qq、dq;
dq=+2.0*M_-PI/double(n);_-n=2.0/double(n);

对于(q=0.0,j=0;jIf)来说,如果没有太多的行,你能告诉我们到目前为止你做了什么吗?到目前为止,我或多或少地,通过它们的形式定义来计算DCT和IDCT,这是非常慢的。有一个叫做
kiss fft
的,它比其他实现要小(代码更少)。你想要哪个DCT(1,2,3,4)?我建议使用FFT计算DCT,因为快速DCT非常复杂,编码速度往往比FFT慢。您还需要直接或规范化的DCT?DFCT算法的文档记录也非常糟糕!!!(从未见过函数实现,只是不完整的方程)此外,你可以在网上找到许多快速余弦变换,但它们都只适用于8x8这样的恒定大小,这一点都没有帮助…要实现直接DFCT或iDFCT,你还必须实现DST、iDST,递归不像DFT、iDFT那样容易分离,你将得到3个therms而不是2个…非常感谢,但我真的需要[NxM]。你知道我如何修改你的代码[NxN]来得到[NxM]?要应用任何一种快速算法,N和M都必须是2的幂,你可以在NxM上做2D变换,方法与在NxN上相同,只需调整转置函数。。。(唯一可以改变的是归一化常数…大多数算法使用NM,1/NM,但我更喜欢16,1/16,因为它不会改变信号的大小)我尝试编译并运行DFTcr函数,但似乎dst[j+j+1]=b*\n当超过dst数组大小时,会在循环内的某个点导致异常。您是否忘记分配比实际数组长两倍的复杂数组?当您的DCT/iDCT工作时,请不要忘记实现快速FT,如果您的DCT、iDCT也会变快
 DFCT(tmp.line(i),src.line(i),t,N)
 DFCT(dst.line(i),tmp.line(i),t,N)