似乎没有快速 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 为原始向量的长度(在将其长度加倍之前)。
那么前 N 个系数
.5 * fft(w)/exp(复数(虚数=pi / 2 / N)*(seq(2*N)-1))
应该同意计算
DCT(v)
但在几乎所有情况下它应该要快得多。
速度考虑因素。如果您对质因数 N 进行计算,则计算快速 dct 所需的时间就像对每个质因数进行慢速 dct 所需的时间一样。因此,如果 N 是 2^K,就像对长度为 2 的向量进行 K 个不同的慢速 dct 变换,所以它really快速地。如果 N 是素数(最坏情况),则根本没有加速。最大的加速是在长度为 2 的幂的向量上。
注意:上面的 R 代码看起来非常不友好,所以让我说一下发生了什么。以正确的方式将长度加倍后,得到的 fft 的前 N 个系数是almost正确的事情。然而,系数需要稍微调整。令 P 代表 e^(pi * i / 2 / N)。保留第一个系数。将第二个系数除以 P,将第三个系数除以 P^2,将第四个系数除以 P^3,依此类推...然后除以all将系数除 2(包括第一个)以与 R 用于 DCT 的归一化一致。
This should提供与使用 dtt 包中的 dct 函数相同的功能,但几乎在所有情况下速度都要快得多。