FFT硬件算法实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Z 2 (n N ' / 2)
第N 级 第N+1级
Z1 (n)
Z 2 ( n)
BF2输出 乘旋转因子延迟
Z1 (n)
Z1 (n N / 2)
'
乘(-j)
2.移位寄存器的设计 ( 1 ) D 触发器组 ( 2 )简单双端口 RAM (需要读写控制信号,地址产生器,资源中等) ( 3 )基于 RAM 的移位寄存器(移位位数是 3 的整数倍,所以对于 N/2 点需要再加 D 触发器,资源较少) ( 4 )基于 RAM 的 FIFO (需要读写控制信号 , 本身会输出一些指示信号,可能利用起 来比较方便,但资源增多) 3.控制信号的设计
(5) 并按照索引 n2 展开,化简后我们得到一系列长度为长 N
4
点的 DFT 。
X (k1 2k2 4k3 )
N /41 n3 0
[H (k , k , n )W
1 2 3
n3 ( k1 2 k2 ) N
n3k3 ]WN 4
(6) 其中 H ( k1 , k2 , n3 )如( 6 )表示
N /4 1 1
n3 0 n2 0
k1 ( {BN 2
n3 原理:X(k)= ( x(n3 )WN x(n3 n3 0 N 1 4
N 1 4
N n3 N N N n3 N ห้องสมุดไป่ตู้ )WN 4 x(n3 )WN 4 2 ) 4 4 2
(3)
n3 0 n2 0 n1 0
BF2II
x ( n)
CLK
7 6
W 1(n)
BF2I
BF2II
W 2(n)
BF2I
BF2II
W 3(n)
BF2I
BF2II
X (k )
1 0
5
4
3
2
需要考虑的问题: 1.蝶形单元的设计
xr (n)
0 1 0 1 1 0 1 0 s
Z r (n N / 2)
xi (n)
Z i (n N / 2)
x(n
1
1
3
N N n2 n1 )W 4 2
N N ( n3 n2 n1 ) k 4 2 N
按照索引 n1 展开,则
k1 BN ( 2
N N N N n2 n3 ) x( n2 n3 ) (1)k1 x( n2 n3 ) ( 4 ) 4 4 4 2
注意:这里的旋转因子还未乘以 [0 2 1 3], 即对于 2048 点 W 2048[0…511] ,真正需要的旋
mn 转因子为 ������2048 , n = 0, 1 … 511, m = 0,2,1,3。 ������ ������������ 由 ������������ = ������������������ 可知, N / 2 点 FFT 的旋转因子是由 N 点 FFT 的旋转因子抽取得到的。 mn 即 2048 点 FFT 的旋转因子 ������2048 包含了其它点数的旋转因子。通过恰当的存储设计和地址
������−������ ������������ ∗ ������ = ������������
代表了前 2 级蝶形运算,我们把乘 ( j ) 称为无关紧要的乘法,因为它不需要复数乘法器, 而只需要对输入复数实部和虚部进行交换和取反操作。经过两级蝶形运算后,才需要复数 乘法器进行与旋转因子 WN 3 对长 N
n ( k1 2 k2 )
的复数乘法操作。
4
点的 DFT 递归的应用以上过程,我们便可以得到完整的基 2 2 SDF FFT 的信
( 1 )蝶形单元工作同步控制信号 t,s ( 2 )旋转因子地址信号 (3) 每级的旁路控制信号 4.复数乘法器的设计 普通复数乘需要 4 个乘法器: y= xreal + ximag ∗ ������������������������ + ������������������������������ = xreal ������������������������ − ximag ������������������������ + ������(xreal ������������������������ − ximag ������������������������) 为了节省乘法器,可以采用下面的公式并采用流水线结构,这样增加了 3 个加法器而 减少了一个乘法器。 y real = xreal + ximag ������������������������ + ximag (−������������������������ − ������������������������ ) y imag = xreal + ximag ������������������������ + xreal (������������������������ − ������������������������ ) 5.旋转因子的存储和取址设计 级 数 M FFT 点数 N 16 32 64 128 256 512 1024 2048 W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 256[0…63] W 512[0…127] W 1024[0…255] W 2048[0…511] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 256[0…63] W 512[0…127] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 4[0] W 8[0…1] 1 1 2 3 M 4 5 M 6 7 M 8 9 M 10 11 M
则( 1 )式可以展开为
N 4
N 4
X (k1 2k2 4k3 )
N /4 1 1 n3 0
N N ( n1 n2 n3 )( k1 2 k2 4 k3 ) N N 2 x( 2 n1 4 n2 n3 )WN 4 n2 0 n1 0 1 N N ( n2 n3 ) k1 ( n2 n3 )(2 k2 4 k3 ) N n2 n3 )WN 4 }WN 4 4
这是第一个蝶形运算结构,记为 BF1 。
我们现在对旋转因子做进一步分解,
WN 4
(
N
n2 n3 )( k1 2 k2 4 k3 )
WNNn2 k3WN4
N
n2 ( k1 2 k2 )
WNn3 ( k1 2 k2 )WN4 n3k3
4 n3 k3 ( j ) n2 ( k1 2 k2 ) WNn3 ( k1 2 k2 )WN
BF 1 BF 1 N N 3N k1 ( k1 2 k2 ) k1 H (k1 , k2 , n3 ) [ x(n3 ) (1) x(n3 )] ( j ) [ x( n3 ) ( 1) x( n3 )] 2 4 4 BF 2 (7) 公式 (7)
������������ ,其中 ������������ = ������ −������
(1)
应用 3 维线性索引映射,令
N N n1 2 n2 n3 N 2 2 (2) 2 k k1 2k2 2 k3 N n
k1 , k2 0,1, k3 0,1...( 1); 其中 n1 , n2 0,1, n3 0,1...( 1),
W
0
x(8) x(4) x(12) x(2) x(10) x(6) x(14) x(1) x(9) x(5) x(13) x(3) x(11) x(7) x(15)
W2
W4
W6
W
0
N/4 N/4 DFT DFT (k1=0,k2=1) (k1=0,k2=1)
W1
W
W
2
3
N/4 N/4 DFT DFT (k1=1,k2=0) (k1=1,k2=0)
号流图。一个 N 16 的信号流图如下:
x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) x(0) N/4 N/4 DFT DFT (k1=0,k2=0) (k1=0,k2=0)
xr (n)
0 1 0 1 1 0 1 0 t BF2结构 s
Z r (n N / 2)
xi (n)
Z i (n N / 2)
xr (n N / 2)
xi (n N / 2)
Z r ( n)
Z i ( n)
对于 BF2 ,其运算是类似的,不同点有( 1 )蝶形单元输入数据的距离变为 N/4 , (2) 乘出 (-j) 操作通过实部 / 虚部交换,取反操作实现,数据再与选转因子进行相乘。经过 BF1 和 BF2 , 乘旋转因子操作后, 我们得到了与基 - 4 DIF 算法相同的数据。 不断重复以上过程, N-1 个时钟后,整个 FFT 数据以串行,倒序方式输出。但实际实现时,为提高性能,需要 采用流水线方法,在复数乘法器前后加上寄存器。因此总的时延时钟数将增长到 N-1+3(log4N-1)。 其时序示意图如下:
xr (n N / 2)
xi (n N / 2)
Z r ( n)
Z i ( n)
BF1结构
对于 BF1, 在前 N/2 个时钟周期,2 选 1 选择器选在位置“ 0 ”,因此蝶形运算单元是空 闲的。 输入数据直接进入 N/2 延时寄存器。 待到延时寄存器为满时, 即后 N/2 个时钟周期, 2 选 1 选择器选在位置“ 1 ”,蝶形运算单元开始对输入数据和 N/2 延时寄存器中存储的值 进行 2 点 DFT 计算,即 Z1(n)=x(n)+x(n+N/2) 0 <= n < N/2 Z1(n+N/2)=x(n)-x(n+N/2)0<=n<N/2 把蝶形运算的输出 Z1(n) 送入第 2 级蝶形运算单元,同时把 Z1(n+N/2) 送回 N/2 延时寄 存器,这是与下一组 FFT 数据的前 N/2 个数据的载入是同时的。实际上这一操作把并行的 蝶形数据又变为串行 ( 单路延时反馈转接 ,SDF) ,如果两路同时进行 , 则方法变为多路延迟转 接结构(多路延时转接 ,MDC ) .
FFT 硬件算法实现
本文给出 FFT 算法的数学推导,基 22 SDF 流水线 FFT 的实现结构,以及一些需要注意 的问题。
1.数学推导
N 点 DFT 定义为:
nk X k xnWN , k 0,1...N 1 n 0 N 1
2 ������������������ ������
设计可以在节省存储空间的同时满足可变点数 FFT 的计算要求。 旋转因子的寻址方式为: p = ql2������ −2 N 2,4 … , ������������������2 ������ − 1, ������为奇数 − 1 ������ = 2������ 2,4 … , ������������������2 ������ − 2, ������为偶数 这可以通过设置一个 log2(N/2 2)比特的计数器实现 q = 0,2,1, 3 l = 0,1 … , 对于旋转因子来说 , 有性质:
j j j j
W0
W3
W6
N/4 N/4 DFT DFT (k1=1,k2=1) (k1=1,k2=1)
W9
图 N 16 的信号流图
2.基 22 SDF 流水线 FFT 实现结构
一个 256 点的 2 2 SDF FFT 的实现结构如下:
128 64 32 16 8 4 2 1
BF2I
N点FFT 数据
x1 (n)
x1 (n N / 2)
x2 (n)
x2 (n N / 2)
N / 2 寄存器
BF1输出
x1 (n)
Z1 (n)
x2 (n)
Z1 (n N / 2)
N / 2 寄存器
N' N / 2
Z1 (n)
Z1 (n N ' / 2)
Z1 (n N / 2)
Z 2 ( n)
第N 级 第N+1级
Z1 (n)
Z 2 ( n)
BF2输出 乘旋转因子延迟
Z1 (n)
Z1 (n N / 2)
'
乘(-j)
2.移位寄存器的设计 ( 1 ) D 触发器组 ( 2 )简单双端口 RAM (需要读写控制信号,地址产生器,资源中等) ( 3 )基于 RAM 的移位寄存器(移位位数是 3 的整数倍,所以对于 N/2 点需要再加 D 触发器,资源较少) ( 4 )基于 RAM 的 FIFO (需要读写控制信号 , 本身会输出一些指示信号,可能利用起 来比较方便,但资源增多) 3.控制信号的设计
(5) 并按照索引 n2 展开,化简后我们得到一系列长度为长 N
4
点的 DFT 。
X (k1 2k2 4k3 )
N /41 n3 0
[H (k , k , n )W
1 2 3
n3 ( k1 2 k2 ) N
n3k3 ]WN 4
(6) 其中 H ( k1 , k2 , n3 )如( 6 )表示
N /4 1 1
n3 0 n2 0
k1 ( {BN 2
n3 原理:X(k)= ( x(n3 )WN x(n3 n3 0 N 1 4
N 1 4
N n3 N N N n3 N ห้องสมุดไป่ตู้ )WN 4 x(n3 )WN 4 2 ) 4 4 2
(3)
n3 0 n2 0 n1 0
BF2II
x ( n)
CLK
7 6
W 1(n)
BF2I
BF2II
W 2(n)
BF2I
BF2II
W 3(n)
BF2I
BF2II
X (k )
1 0
5
4
3
2
需要考虑的问题: 1.蝶形单元的设计
xr (n)
0 1 0 1 1 0 1 0 s
Z r (n N / 2)
xi (n)
Z i (n N / 2)
x(n
1
1
3
N N n2 n1 )W 4 2
N N ( n3 n2 n1 ) k 4 2 N
按照索引 n1 展开,则
k1 BN ( 2
N N N N n2 n3 ) x( n2 n3 ) (1)k1 x( n2 n3 ) ( 4 ) 4 4 4 2
注意:这里的旋转因子还未乘以 [0 2 1 3], 即对于 2048 点 W 2048[0…511] ,真正需要的旋
mn 转因子为 ������2048 , n = 0, 1 … 511, m = 0,2,1,3。 ������ ������������ 由 ������������ = ������������������ 可知, N / 2 点 FFT 的旋转因子是由 N 点 FFT 的旋转因子抽取得到的。 mn 即 2048 点 FFT 的旋转因子 ������2048 包含了其它点数的旋转因子。通过恰当的存储设计和地址
������−������ ������������ ∗ ������ = ������������
代表了前 2 级蝶形运算,我们把乘 ( j ) 称为无关紧要的乘法,因为它不需要复数乘法器, 而只需要对输入复数实部和虚部进行交换和取反操作。经过两级蝶形运算后,才需要复数 乘法器进行与旋转因子 WN 3 对长 N
n ( k1 2 k2 )
的复数乘法操作。
4
点的 DFT 递归的应用以上过程,我们便可以得到完整的基 2 2 SDF FFT 的信
( 1 )蝶形单元工作同步控制信号 t,s ( 2 )旋转因子地址信号 (3) 每级的旁路控制信号 4.复数乘法器的设计 普通复数乘需要 4 个乘法器: y= xreal + ximag ∗ ������������������������ + ������������������������������ = xreal ������������������������ − ximag ������������������������ + ������(xreal ������������������������ − ximag ������������������������) 为了节省乘法器,可以采用下面的公式并采用流水线结构,这样增加了 3 个加法器而 减少了一个乘法器。 y real = xreal + ximag ������������������������ + ximag (−������������������������ − ������������������������ ) y imag = xreal + ximag ������������������������ + xreal (������������������������ − ������������������������ ) 5.旋转因子的存储和取址设计 级 数 M FFT 点数 N 16 32 64 128 256 512 1024 2048 W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 256[0…63] W 512[0…127] W 1024[0…255] W 2048[0…511] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 256[0…63] W 512[0…127] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 64[0…15] W 128[0…31] W 4[0] W 8[0…1] W 16[0…3] W 32[0…7] W 4[0] W 8[0…1] 1 1 2 3 M 4 5 M 6 7 M 8 9 M 10 11 M
则( 1 )式可以展开为
N 4
N 4
X (k1 2k2 4k3 )
N /4 1 1 n3 0
N N ( n1 n2 n3 )( k1 2 k2 4 k3 ) N N 2 x( 2 n1 4 n2 n3 )WN 4 n2 0 n1 0 1 N N ( n2 n3 ) k1 ( n2 n3 )(2 k2 4 k3 ) N n2 n3 )WN 4 }WN 4 4
这是第一个蝶形运算结构,记为 BF1 。
我们现在对旋转因子做进一步分解,
WN 4
(
N
n2 n3 )( k1 2 k2 4 k3 )
WNNn2 k3WN4
N
n2 ( k1 2 k2 )
WNn3 ( k1 2 k2 )WN4 n3k3
4 n3 k3 ( j ) n2 ( k1 2 k2 ) WNn3 ( k1 2 k2 )WN
BF 1 BF 1 N N 3N k1 ( k1 2 k2 ) k1 H (k1 , k2 , n3 ) [ x(n3 ) (1) x(n3 )] ( j ) [ x( n3 ) ( 1) x( n3 )] 2 4 4 BF 2 (7) 公式 (7)
������������ ,其中 ������������ = ������ −������
(1)
应用 3 维线性索引映射,令
N N n1 2 n2 n3 N 2 2 (2) 2 k k1 2k2 2 k3 N n
k1 , k2 0,1, k3 0,1...( 1); 其中 n1 , n2 0,1, n3 0,1...( 1),
W
0
x(8) x(4) x(12) x(2) x(10) x(6) x(14) x(1) x(9) x(5) x(13) x(3) x(11) x(7) x(15)
W2
W4
W6
W
0
N/4 N/4 DFT DFT (k1=0,k2=1) (k1=0,k2=1)
W1
W
W
2
3
N/4 N/4 DFT DFT (k1=1,k2=0) (k1=1,k2=0)
号流图。一个 N 16 的信号流图如下:
x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) x(0) N/4 N/4 DFT DFT (k1=0,k2=0) (k1=0,k2=0)
xr (n)
0 1 0 1 1 0 1 0 t BF2结构 s
Z r (n N / 2)
xi (n)
Z i (n N / 2)
xr (n N / 2)
xi (n N / 2)
Z r ( n)
Z i ( n)
对于 BF2 ,其运算是类似的,不同点有( 1 )蝶形单元输入数据的距离变为 N/4 , (2) 乘出 (-j) 操作通过实部 / 虚部交换,取反操作实现,数据再与选转因子进行相乘。经过 BF1 和 BF2 , 乘旋转因子操作后, 我们得到了与基 - 4 DIF 算法相同的数据。 不断重复以上过程, N-1 个时钟后,整个 FFT 数据以串行,倒序方式输出。但实际实现时,为提高性能,需要 采用流水线方法,在复数乘法器前后加上寄存器。因此总的时延时钟数将增长到 N-1+3(log4N-1)。 其时序示意图如下:
xr (n N / 2)
xi (n N / 2)
Z r ( n)
Z i ( n)
BF1结构
对于 BF1, 在前 N/2 个时钟周期,2 选 1 选择器选在位置“ 0 ”,因此蝶形运算单元是空 闲的。 输入数据直接进入 N/2 延时寄存器。 待到延时寄存器为满时, 即后 N/2 个时钟周期, 2 选 1 选择器选在位置“ 1 ”,蝶形运算单元开始对输入数据和 N/2 延时寄存器中存储的值 进行 2 点 DFT 计算,即 Z1(n)=x(n)+x(n+N/2) 0 <= n < N/2 Z1(n+N/2)=x(n)-x(n+N/2)0<=n<N/2 把蝶形运算的输出 Z1(n) 送入第 2 级蝶形运算单元,同时把 Z1(n+N/2) 送回 N/2 延时寄 存器,这是与下一组 FFT 数据的前 N/2 个数据的载入是同时的。实际上这一操作把并行的 蝶形数据又变为串行 ( 单路延时反馈转接 ,SDF) ,如果两路同时进行 , 则方法变为多路延迟转 接结构(多路延时转接 ,MDC ) .
FFT 硬件算法实现
本文给出 FFT 算法的数学推导,基 22 SDF 流水线 FFT 的实现结构,以及一些需要注意 的问题。
1.数学推导
N 点 DFT 定义为:
nk X k xnWN , k 0,1...N 1 n 0 N 1
2 ������������������ ������
设计可以在节省存储空间的同时满足可变点数 FFT 的计算要求。 旋转因子的寻址方式为: p = ql2������ −2 N 2,4 … , ������������������2 ������ − 1, ������为奇数 − 1 ������ = 2������ 2,4 … , ������������������2 ������ − 2, ������为偶数 这可以通过设置一个 log2(N/2 2)比特的计数器实现 q = 0,2,1, 3 l = 0,1 … , 对于旋转因子来说 , 有性质:
j j j j
W0
W3
W6
N/4 N/4 DFT DFT (k1=1,k2=1) (k1=1,k2=1)
W9
图 N 16 的信号流图
2.基 22 SDF 流水线 FFT 实现结构
一个 256 点的 2 2 SDF FFT 的实现结构如下:
128 64 32 16 8 4 2 1
BF2I
N点FFT 数据
x1 (n)
x1 (n N / 2)
x2 (n)
x2 (n N / 2)
N / 2 寄存器
BF1输出
x1 (n)
Z1 (n)
x2 (n)
Z1 (n N / 2)
N / 2 寄存器
N' N / 2
Z1 (n)
Z1 (n N ' / 2)
Z1 (n N / 2)
Z 2 ( n)