【问题标题】:FFT in Numpy (Python) when N is not a power of 2当 N 不是 2 的幂时 Numpy (Python) 中的 FFT
【发布时间】:2012-11-30 05:56:57
【问题描述】:

我的问题是关于 Numpy 的 FFT 函数中使用的算法。

Numpy 的文档说它使用 Cooley-Tukey 算法。但是,您可能知道,该算法仅在点数 N 是 2 的幂时才有效。

numpy 是否填充我的输入向量 x[n] 以计算其 FFT X[k]? (我不这么认为,因为我在输出中的点数也是 N)。我如何才能真正“看到” numpy 用于其 FFT 功能的代码?

干杯!

【问题讨论】:

标签: python numpy fft


【解决方案1】:

文档说 numpy 的 FFT 基于 FFTPACK

在 FFTPACK 文档中,我发现以下内容:


子程序 rffti(n,wsave)


子程序 rffti 初始化数组 wsave ,它在两者中都使用 rfftf 和 rfftb。 n 和 a 的素数分解 三角函数的列表被计算并存储在 保存。

标准的 Cooley-Tukey 算法是“radix-2 with decimation in time”,它递归地将大小为 2*n 的 FFT 的计算减少为大小为 n 的 2 个 FFT,加上大小为 2 的 n 个 FFT。有一个同一算法的通用分解版本,将大小为m*n的 FFT 转换为大小为 m 的 n 个 FFT 加上大小为 n 的 m 个 FFT。 FFTPACK 中的准备例程计算输入大小的素因数分解这一事实似乎表明这就是他们正在做的事情。因此,除非您选择质数元素,或者您的元素数具有非常大的质因数,否则您仍然应该获得相当不错的加速。

几年前,我在博客中提到了 Cooley-Tukey 算法的 radix-2general factorization 版本。阅读这些内容可能有助于理解 NumPy 内部发生的事情。下图是从那里拍摄的,描绘了 CT FFT:

【讨论】:

  • 对于素数大小,它只是进行蛮力 DFT,而不是 FFT,对吧?
  • @endolith 这似乎正在发生。有FFT algorithms for prime sized inputs,我认为FFTW 有一些。但是在我的 numpy 安装中,做一些计时似乎表明素数大小是蛮力的,是的。
【解决方案2】:

根据我的经验,算法不会自动填充,或者至少其中一些不会。例如,对长度不长 == 2 的幂的信号运行 scipy.signal.hilbert 方法大约需要 45 秒。当我自己用零填充信号到这样的长度时,花了 100 毫秒。

YMMV 但基本上每次运行信号处理算法时都需要仔细检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多