《算法导论》是我目前为止看到的最好的有关于写FFT的书,虽然和信号处理一类的树不太相同,算法导论对于FFT的出发点更加纯粹一点,那就是如果快速计算DFT,而并不深究DFT的物理意义,切入点也是多项式乘法。说实话,这个算法很难,并不是很直观,理解困难的很大原因是算法构造的如此精妙,以至于让人迷失了究竟算法的目的在何处,当然,现在很多库集成的FFT高效且稳定,不过深入学习一下FFT的原理我认为还是有必要的。
详细的原理就不说了,直接上python实现的代码
python由于支持了复数运算,所以和书中的伪代码基本差不多,无须做更多修改,计算结果和numpy中自带的FFT函数完全一致,当然,此算法只能应用于输入时2的幂次的时候。
其中第一个函数是递归版本的FFT,第二个则是迭代版本的FFT。
def recursiveFFT(a):
n = len(a)
if n == 1:
return a
wm = np.exp((2*np.pi*1j)/n) #旋转因子
#wm = np.cos(2*np.pi/n)+1j*np.sin(2*np.pi/n) # 欧拉展开后的旋转因子,与上式相同
w = 1
a0 = a[[x for x in range(0,n) if x%2 == 0]] # 提取出下标为偶数的系数
a1 = a[[x for x in range(0,n) if x%2 == 1]] # 提取出下标为奇数的系数
y0 = recursiveFFT(a0) # 递归调用
y1 = recursiveFF