前言
本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好,
还是老实调IP吧,了解内部机理即可,无需重复发明轮子。
参考
流程
FFT能做什么在此就不赘述了,只了解数据的运算流程。
1.FFT的基本公式:
第一眼看这个公式,肯定是脑袋瞬间宕机。
2.旋转因子:记住旋转因子具有可约性,对称性,周期性。
表示方法有两种,通过欧拉公式转换,本质上是一致的。
Wn=exp(-j*2*k*pi/N) ,N表示FFT点数,k表示第几个旋转因子。
Wn = cos(2*pi*k/N) - i*sin(2*pi*k/N)
第二次脑袋瞬间宕机。
3.蝶形图:
好在数学家为了普通人类能理解公式,绘制了帅气的蝴蝶漫画图,8点FFT的如下:
不直观,添加几条辅助线再看:可以看到分为三级蝶形运算。
比如第一级的蝶形运算结果:x0’=x[0]+x[4]*w0,x1’=x[0]-x[4]*w0。其他节点以此类推。
注意-1的位置和旋转因子的位置。注意数据和旋转因子都是复数,这就是说蝶形图中的乘法和加减都是复数运算。
而所谓代码实现,不管什么代码,本质上就是对各级的公式进行实现,从而得到结果。
觉得讲得不清楚,那么看下图更直观:当然图中少标识了-1。