如果 x 是一个 2N 信号,在 N 上方用零填充,它的 DFT 写成:
因此,偶数频率的系数来自x(n)的N点离散傅里叶变换。
因此,奇数频率的系数来自x(n)exp(i*M_PI*n/N)的N点离散傅里叶变换。
因此,零填充的 2N 信号的离散傅里叶变换恢复为长度为 N 和 fftw 信号的两个 DFT 可用于计算它们。
总计算时间为2*c*N*ln(N),其中c 是一个常数。预计它会比直接计算 DFT c*2*N*ln(2*N) 更快。请记住 ln(2*N)=ln(2)+ln(N) :随着 N 变大,与 ln(N) 相比,直接计算的额外工作可以忽略不计:即使维度大于 1,这个技巧也变得毫无用处。。它不影响复杂性。
此外,FFTW 非常高效,如果安装正确,它会使用您 PC 的许多功能,而且无论如何都很难做得比这更好,即使使用了所提供的技巧。 最后,如果输入信号是真实的,你可以使用fftw_plan fftw_plan_dft_r2c_2d:只有傅里叶空间中的一半系数被计算和存储。
关于内存需求,如果真的内存不足,可以使用FFTW_IN_PLACE标志,输入输出使用同一个数组。但是,它会稍微慢一些。
上面介绍的过程可以扩展为计算用 (L-1)N 个零填充的 N 点信号的 LN 信号的 DFT:它继续计算长度为 N 的 L 个 DFT。
与 FFTW 相比,您是否有任何参考资料显示 MATLAB 如何处理和优化填充信号的 DFT?
编辑:关于 3D 案例的进一步研究:
填充的 3D 信号 x(n,m,p) 的 3D DFT 是:
如果k_n、k_m 和k_p 是偶数:
如果k_n 和k_m 是偶数而k_p 是奇数:
...有8个案例。
因此,尺寸为 NxNxN 的 3D x 填充到 2Nx2Nx2N 的 3d dft 的计算恢复为尺寸为 NxNxN 的 8 3d dft 的计算。 Size a 3d dft 是 3 1d dft 的组合,大小为 N 的 dft 总数为 3x8xNxN,而直接计算需要大小为 2N 的 3x(2N)*(2N) dft。计算时间是 24cN^3ln(N) 对 24cN^3ln(2N) :有可能小幅增长...再次 fftw 很快...
然而,我们不使用黑盒 3d fft,而是通过在每个方向上执行 1d dft 来一次计算大小为 N 的 8 个 dft。
- 沿 N 的 1d dft:2 例,
NxN dfts => 2cN^3ln(N)
- 沿 M 的 1d dft:2 箱,
2NxN dfts => 4cN^3ln(N)
- 沿 P 的 1d dft:2 例,
2Nx2N dfts => 8cN^3ln(N)
因此,总计算时间预计为 14cN^3ln(N) 与 24cN^3ln(2N) :可能会有小幅增长...再次 fftw 很快...
另外,计算
只需要一次调用 exp :首先计算 w=exp(I*M_PI/N) 然后更新 wn=wn*w; x(n)=x(n)*wn 或使用 pow 如果精度成为问题。