FFT算法介绍及OAI中FFT的实现

本文介绍了快速傅立叶变换(FFT)的基本原理和在OAI(开放无线接入网)中的实现。从DIT radix-2、DIF radix-2到DIF radix-4 FFT,详细讲解了不同类型的FFT算法,并通过OAI中的dft16()函数分析了FFT的实现细节,包括特殊的中间结果重排序策略,以及如何通过较小规模的DFT计算构建更大规模的FFT。
摘要由CSDN通过智能技术生成

OAI中FFT的实现

FFT介绍

FFT是DFT(离散傅立叶变换)的一种快速算法。
DFT是一种常用的信号处理方式,可以将时域信号转换到频域。它的原理在《信号与系统》课程中有详细阐述。
但是因为DFT的运算复杂度太高,在实际应用中都是采用FFT的快速算法。
快速傅立叶变换算法(FFT)最开始是由库利(T.W.Cooley)和图基(J.W.Tukey)于1965年提出。其基本思想就是分治。从时域或者频域序列中抽取出不同的子序列从而降低计算复杂度。
根据抽取对象的不同又细分为不同的算法:基于时域的数据做抽取的称为DIT(Decimation in Time), 基于频域的抽取就称为DIF(Decimation in Frequency)。
另外一个区分不同FFT算法的标准称为基(radix)。嗯,基无处不在。
基决定FFT算法的最小组成单位,这个最小组成单位一般是用被称为蝶形图的方式来表示的。

图1
图中,(a)表示一个基-2的基本蝶形图,(b)的左半部分表示一个基-4的基本蝶形图。
可以看到,基数决定来基本蝶形图的输入数据数。除了2和4之外,当然也有可能是其他的基数,或者混合使用几种不同的基数。
库利和图基当时提出的就是时域的基-2算法,因此这个算法又被称为库利-图基算法。
下面我们举几个FFT的例子,来形象的理解一下这个伟大的算法。

DIT radix-2 FFT(时域抽取基-2 FFT)

先给出离散傅立叶变换的一般形式:
(1) X [ k ] = ∑ n = 0 N − 1 x [ n ] W N k n , 0 ≤ k ≤ N − 1 X[k]=\sum_{n=0}^{N-1} x[n]W_N^{kn},\qquad \scriptsize 0 \leq k \leq N-1 \normalsize \tag{1} X[k]=n=0N1x[n]WNkn,0kN1(1)
其中, N N N是时域离散序列 x [ n ] x[n] x[n]的长度,并且是2的指数倍。 W N = e − j 2 π / N W_N=e^{-j2\pi /N} WN=ej2π/N称为旋转因子,有如下性质:
1)周期性
W N ( k + N ) n = W N k n = W N k ( n + N ) W_N^{(k+N)n}=W_N^{kn}=W_N^{k(n+N)} WN(k+N)n=WNkn=WNk(n+N)
2)对称性
W N n k + N / 2 = − W N n k W_N^{nk+N/2}=-W_N^{nk} WNnk+N/2=WNnk
3)可约性
W m N n m k = W N n k W_{mN}^{nmk}=W_N^{nk} WmNnmk=WNnk
所谓radix-2 DIT就是把时域的序列按照奇偶抽取为2个子序列,这2个子序列的长度都是原序列的一半长度,使得计算复杂度减小到原序列的一半。把这个分治过程递归应用到这两个子序列,直到最后剩下2点的DFT。(其实2点DFT还可以继续递归这个过程到1点)
用公式表示,就是把时域序列按照奇偶划分为两个子序列,如下:
(2) X [ k ] = ∑ n = 0 N − 1 x [ n ] W N k n , k = 0 , 1 , . . . , N − 1 = ∑ n   e v e n x [ n ] W N k n + ∑ n   o d d x [ n ] W N k n = ∑ m = 0 N / 2 − 1 x [ 2 m ] W N 2 m k + ∑ m = 0 N / 2 − 1 x [ 2 m + 1 ] W N k ( 2 m + 1 ) X[k] =\sum_{n=0}^{N-1}x[n]W_N^{kn},\qquad \scriptsize k=0,1,...,N-1 \normalsize \\ =\sum_{n \, even}x[n]W_N^{kn} + \sum_{n \, odd}x[n]W_N^{kn} \\ =\sum_{m=0}^{N/2-1}x[2m]W_N^{2mk}+\sum_{m=0}^{N/2-1}x[2m+1]W_N^{k(2m+1)} \tag{2} X[k]=n=0N1x[n]WNkn,k=0,1,...,N1=nevenx[n]WNkn+noddx[n]WNkn=m=0N/21x[2m]WN2mk+m=0N/21x[2m+1]WNk(2m+1)(2)
(公式没有对齐,LaTex的对齐语法老是提示错误。)
上式中等号右边第一部分是偶数部分,第二部分是奇数部分,两者合起来正好是原时域离散数列。
如果我们令:
f 1 [ m ] = x [ 2 m ] f 2 [ m ] = x [ 2 m + 1 ] f_1[m]=x[2m] \\ f_2[m]=x[2m+1] f1[m]=x[2m]f2[m]=x[2m+1]
再令:
F 1 [ k ] = D F T ( f 1 [ m ] ) F 2 [ k ] = D F T ( f 2 [ m ] ) F_1[k]=DFT(f_1[m]) \\ F_2[k]=DFT(f_2[m]) F1[k]=DFT(f1[m])F2[k]=DFT(f2[m])
那么利用前面提到的旋转因子的性质, ( 2 ) (2) (2)式就可以表示为:
X [ k ] = ∑ m = 0 N / 2 − 1 f 1 [ m ] W N / 2 k m + W N k ∑ m = 0 N / 2 − 1 f 2 [ m ] W N / 2 k m = F 1 [ k ] + W N k F 2 [ k ] , k = 0 , 1 , . . . , N − 1 X[k]=\sum_{m=0}^{N/2-1}f_1[m]W_{N/2}^{km}+W_N^k\sum_{m=0}^{N/2-1}f_2[m]W_{N/2}^{km} \\ =F_1[k]+W_N^kF_2[k], \qquad \scriptsize k=0,1,...,N-1 X[k]=m=0N/21f

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值