FFT(FastFourierTransform,快速傅里叶变换)算法是离散傅里叶变换的快速算法,FFT算法可以分为按时间抽取和按频率抽取,通过FFT可以将一个信号从时域变换到频域。
一、FFT和IFFT的C语言编程
(1)对于快速傅里叶变换FFT,第一个要解决的问题就是码位倒序。
码位倒序首先要解决两个问题:a、将t位二进制数倒序 b、将倒序后的两个存储单元进行交换
如果输入序列的自然顺序号i用二进制数表示,例如最大序号为7,即用3位就可表示n2n1n0,则其倒序后j对应的二进制数就是n0n1n2,然后利用C语言的移位功能实现倒序。
(2)第二个要解决的问题就是蝶形运算
a、第1级(第1列)每个蝶形的两节点“距离”为1,第2级每个蝶形的两节点“距离”为2,第3级每个蝶形的两节点“距离”为4,第4级每个蝶形的两节点“距离”为8。由此推得,第m级蝶形运算,每个蝶形的两节点“距离”L=2m-1。
b、对于16点的FFT,第1级有16组蝶形,每组有1个蝶形;第2级有4组蝶形,每组有2个蝶形;第3级有2组蝶形,每组有4个蝶形;第4级有1组蝶形,每组有8个蝶形。由此可推出,对于N点的FFT,第m级有N/2L组蝶形,每组有L=2m-1个蝶形。
c、旋转因子的确定
以16点FFT为例,第m级第k个旋转因子为,其中k=0~2m-1-1,即第m级共有2m-1个旋转因子,根据旋转因子的可约性,,所以第m级第k个旋转因子为
,其中k=0~2m-1-1。
(3)算法实现
N点FFT从左到右共有log2N级蝶形,每级有N/2L组,每组有L个。所以FFT的C语言编程只需用3层循环即可实现:最外层循环完成每一级的蝶形运算(整个FFT共log2N级),中间层循环完成每一组的蝶形运算(每一级有N/2L组),最内层循环完成单独1个蝶形