基于FPGA的快速傅立叶变换
而在基2蝶形中,Wk0和Wk2的值均为1,这样,将A,B,C和D的表达式代入图2中的基2运算的四个等式中,则有:
A′=r0+(r1×c1-i1×s1)+j[i0+(i1×c1+r1×s1)]? (8)
B′=r0- (r1×c1-i1×s1)+j[i0-(i1×c1+r1×s1)] (9)
C′=r2+(r3×c3-i3×s3)+j[i0+(i3×c3+r3×s3)]? (10)
D′=r2-(r3×c3-i3×s3)+j[i0-(i3×c3+r3×s3)]? (11)
在上述式(4)~(11)中有很多类同项,如i1×c1+r1×s1和r1×c1-i1×s1等,它们仅仅是加减号的不同,其结构和运算均类似,这就为简化电路提供了可能。同时,在蝶形运算中,复数乘法可以由实数乘法以一定的格式来表示,这也为设计复数乘法器提供了一种实现的途径。
以基4为例,在其运算单元中,实际上只需做三个复数乘法运算,即只须计算BWk1、CWk2和DWk3的值即可,这样在一个基4蝶形单元里面,最多只需要3个复数乘法器就可以了。在实际过程中,在不提高时钟频率下,只要将时序控制好?便可利用流水线(Pipeline)技术并只用一个复数乘法器就可完成这三个复数乘法,大大节省了硬件资源。
图2 基2和基4蝶形算法的信号流图
3 FFT的地址
FFT变换后输出的结果通常为一特定的倒序,因此,几级变换后对地址的控制必须准确无误。
倒序的规律是和分解的方式密切相关的,以基8为例,其基本倒序规则如下:
基8可以用2×2×2三级基2变换来表示,则其输入顺序则可用二进制序列(n1 n2 n3)来表示,变换结束后,其顺序将变为(n3 n2 n1),如:X?011?→ x?110?,即输入顺序为3,输出时顺序变为6。
更进一步,对于基16的变换,可由2×2×2×2,4×4,4×2×2等形式来构成,相对于不同的分解形式,往往会有不同的倒序方式。以4×4为例,其输入顺序可以用二进制序列(n1 n2 n3 n4)来表示变换结束后,其顺序可变为((n3 n4)(n1 n2)),如: X?0111?→ x?1101?。即输入顺序为7,输出时顺序变为13。
在2k/4k/8k的傅立叶变换中,由于要经过多次的基4和基2运算,因此,从每次运算完成后到进入下一次运算前,应对运算的结果进行倒序,以保证运算的正确性。
4 旋转因子
N点傅立叶变换的旋转因子有着明显的周期性和对称性。其周期性表现为:
FFT之所以可使运算效率得到提高,就是利用
FFT之所以可使运算效率得到提高,就是利用了对称性和周期性把长序列的DFT逐级分解成几个序列的DFT,并最终以短点数变换来实现长点数变换。
根据旋转因子的对称性和周期性,在利用ROM存储旋转因子时,可以只存储旋转因子表的一部分,而在读出时增加读出地址及符号的控制,这样可以正确实现FFT。因此,充分利用旋转因子的性质,可节省70%以上存储单元。
实际上,由于旋转因子可分解为正、余弦函数的组合,故ROM中存的值为正、余弦函数值的组合。对2k/4k/8k的傅立叶变换来说,只是对一个周期进行不同的分割。由于8k变换的旋转因子包括了2k/4k的所有因子,因此,实现时只要对读ROM的地址进行控制,即可实现2k/4k/8k变换的通用。
5 存储器的控制