如何在R中执行*Fast*DCT(离散余弦变换)?

Joh*_*son 6 r fft dct

使用Rprof显示dtt包中的dct是一段运行速度非常慢的R代码中的主要攻击者.在stats包中交换它为fft(这不是相同的转换,但应该花费相同的时间来计算)我的运行时间显着改善.事实上,我的Rprof线路中有2/3是先前的dct呼叫,而且在进行切换后仅有3行约600个fft呼叫.

dtt包中的dct实现是不是使用快速离散傅立叶变换完成的?如果是这样,是否有一个包有一个?(我知道可以将数据加倍,然后从那些fft系数中提取dct的系数,但是直接的快速dct肯定会更好,并且确实应该在某个地方).

Joh*_*son 10

似乎没有快速dct,但stats包中有一个fft(快速傅里叶变换),所以这里是你如何使用fft获得快速dct.

使用此风险需要您自担风险.我没有认真检查它.我在几个不同大小的向量上检查了它,它给出了与包dtt中的函数dct相同的结果.如果有人想通过将它与dct的输出进行比较来仔细检查我,那么请随意这样做并发布您的结果.

取你的向量并将其扩展到向量的两倍,如下所示:如果向量是v =(1,2,3),则将条目加倍到w =(1,2,3,3,2,1).请注意订购.如果你的向量是v =(1,2,4,9),那么将条目加倍到w =(1,2,4,9,9,4,2,1)

设N是ORIGINAL向量的长度(在你的长度加倍之前).

那么.5*fft(w)/ exp(复数(虚数= pi/2/N)*(seq(2*N)-1))的前N个系数应该与计算dct(v)一致,除非它应该是几乎在所有情况下都快得多.

速度考虑.如果你推理因子N那么计算快速dct所花费的时间就像为每个素数因子做一个缓慢的dct所花费的时间.因此,如果N是2 ^ K,就像在长度为2的向量上进行K个不同的慢dct变换,因此它非常快.如果N是素数(最坏的情况)那么根本没有加速.最大的加速是在长度为2的幂的向量上.

注意:上面的R代码看起来非常不友好,所以让我说一下发生了什么.在以正确的方式加倍长度之后,你获得的fft的前N个系数几乎是正确的.然而,系数需要稍微调整一下.设P代表e ^(pi*i/2/N).保留第一个系数.将第二个系数除以P,将第三个除以P ^ 2,将第四个除以P ^ 3等...然后将所有系数除以2(包括第一个)以符合dct的归一化R用法.

应该与在包dtt中使用dct函数相同,但几乎在所有情况下都要快得多.