我的问题是关于在Numpy的FFT函数中使用的算法。
Numpy的文档说它使用了Cooley-Tukey算法。但是,如您所知,此算法仅在点数N为2的幂时才有效。
numpy填充我的输入向量x [n]以计算其FFT X [k]? (我不这么认为,因为我在输出中的点数也是N)。我怎么能真正“看到”numpy用于其FFT函数的代码?
干杯!
答案 0 :(得分:11)
文档说numpy的FFT基于FFTPACK。
在FFTPACK文档中,我发现以下内容:
子程序rffti(n,wsave)
子程序rffti初始化两者中使用的数组wsave rfftf和rfftb。 n的素因子化与a 计算并存储三角函数的列表 wsave。
标准的Cooley-Tukey算法是“基数为时间抽取的基数-2”,它递归地将大小为2*n
的FFT的计算减少为2个大小为n的FFT,加上大小为2的n个FFT。是同一算法的一般分解版本,它将大小为m*n
的FFT转换为大小为m加上大小为n的FFT的n个FFT。 FFTPACK中的准备例程计算输入大小的素数因子化的事实似乎表明这是他们正在做的事情。因此,除非你选择了大量的元素,或者你的元素数量有一个非常大的素数因素,你仍然可以获得相当好的加速。
几年前,我在博客中写了Cooley-Tukey算法的radix-2和general factorization版本。阅读这些内容可能有助于了解NumPy内部的情况。以下图片描绘了CT FFT:
答案 1 :(得分:0)
根据我的经验,算法不会自动填充,或者至少其中一些不会。例如,对长度不大= = 2的幂的信号运行scipy.signal.hilbert方法大约需要45秒。当我用零填充信号到这样的长度时,花了100ms。
YMMV但是在运行信号处理算法的任何时候都要仔细检查。