算法导论FFT代码

《算法导论》提供了精妙的FFT算法,主要关注快速计算DFT而非深入其物理意义。虽然理解难度较高,但对学习者来说依然有价值。本文提供Python实现的递归和迭代版FFT代码,结果与numpy的FFT函数一致,适用于2的幂次输入。
摘要由CSDN通过智能技术生成

《算法导论》是我目前为止看到的最好的有关于写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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值