FFT在通信领域有着很重要的地位,因为它运算快,易于硬件实现,例如OFDM符号的生成就可以直接利用FFT,今天我们就分析一下FFT的原理。

一、DFT复杂度

我们知道FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform)。那么为什么要有这种高效算法呢?就先从DFT说起。下面是DFT的公式:

FFT变换python代码 信号处理 fft变换原理_复杂度


式中

FFT变换python代码 信号处理 fft变换原理_复杂度_02


既然FFT是为了减小DFT的运算复杂度,那么咱们先分析DFT的运算复杂度。举一个简单的例子,假如采用N=3,采用的是BPSK调制,那么假设信号序列是101,经过BPSK调制之后,信号如下:

FFT变换python代码 信号处理 fft变换原理_FFT_03


根据欧拉公式有:

FFT变换python代码 信号处理 fft变换原理_FFT_04


其中N=3,所以对于k=0:

FFT变换python代码 信号处理 fft变换原理_FFT变换python代码 信号处理_05


还有k=1和k=2时X(1)和X(2)。

从这个具体的例子中不难推导出DFT的运算复杂度,对于一个k值,需要进行4N次实数相乘和4N-2次实数相加,所以总共需要4N*N次相乘和N(4N-2)次相加,也就说它的复杂度是O(n^2)。二、FFT推导

FFT方便处理长度N=2^M的情况,如果长度不是2的整数次幂的情况,则通过补零即可。

首先将x(n)分为奇偶两个序列之和:

FFT变换python代码 信号处理 fft变换原理_蝶形运算_06


则两个序列的长度都为N/2,则:

FFT变换python代码 信号处理 fft变换原理_复杂度_07


由于:

FFT变换python代码 信号处理 fft变换原理_FFT_08


所以:

FFT变换python代码 信号处理 fft变换原理_DFT_09


对于其中的X1(k)和X2(k),我们可以推导下面过程:

FFT变换python代码 信号处理 fft变换原理_DFT_10


所以:

FFT变换python代码 信号处理 fft变换原理_FFT变换python代码 信号处理_11


即:

我们把一个N点的DFT拆成了两个N/2的DFT。同理逐渐拆下去,直到2^m的DFT拆成m-1个2点DFT为止。就以8点DFT为例,可以拆成两个4点DFT:

FFT变换python代码 信号处理 fft变换原理_复杂度_12


然后继续可以拆成4个2点DFT:

FFT变换python代码 信号处理 fft变换原理_FFT_13


这就是FFT的蝶形运算。