【问题标题】:zero padded FFT using FFTW使用 FFTW 的零填充 FFT
【发布时间】:2015-03-10 10:46:13
【问题描述】:

要在频域中插值信号,可以在时域中填充零并执行 FFT

假设给定向量 X 中的元素个数为 NYX 相同但用 N 零填充一侧。然后下面给出相同的结果。

$$\hat{x}(k)=\sum_{n=0}^{2N-1} Y(n)e^{i2\pi k n/2N},\quad k=0,...,2N-1,$$
$$\hat{x}(k)=\sum_{n=0}^{ N-1} X(n)e^{i2\pi k n/2N},\quad k=0,...,2N-1.$$

现在,如果我们使用 FFTW 包,第一个方程需要 2N 内存空间用于输入向量,而第二个方程只需要 N 内存空间(我不知道在现有的 FFTW 包中是否可以这样做)!计算复杂度也从 2N^2log(2N) 降低到 2N^2log(N)。每当我们执行 2D FFT3D FFT 时,问题都会变得更糟。是否可以使用 FFTW 包执行第二种方法?不过,这在 MATLAB 中相当容易做到。

【问题讨论】:

    标签: fft fftw


    【解决方案1】:

    如果 x 是一个 2N 信号,在 N 上方用零填充,它的 DFT 写成:

    • 如果k 是偶数:

    因此,偶数频率的系数来自x(n)的N点离散傅里叶变换。

    • 如果k 是奇数:

    因此,奇数频率的系数来自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_nk_mk_p 是偶数:

    如果k_nk_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 如果精度成为问题。

    【讨论】:

    • 我原来的问题需要3D FFTs。但是这个技巧对于 1D FFTs 很有用。虽然计算复杂度似乎低于 2N 信号的直接 FFT,但您仍然需要计算 odd 情况的指数并进行乘法,这很昂贵。
    • 很遗憾,目前我没有任何比较 MATLAB 和 FFTW 的参考资料。
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多