引言:我们在利用FFT IP核进行FPGA设计时,需要理解FFT相关的操作理论,比如FFT蝶形运算带来的位宽扩展、FFT实现资源与性能的权衡、如何实时更新FFT变换点数、缩放等相关配置及FFT操作时序等。本文我们就针对这些问题进行详细的介绍。
1.有限字长考虑
突发I/O架构通过连续地传递输入数据来处理一组数据阵列。在每个过程中,算法执行Radix-4或Radix-2蝴蝶运算(butterfly),其中每个butterfly分别获取四个或两个复数,并返回四个或两个复数在同一内存中。IP核返回内存的数字可能是大于从内存中提取的数字。必须采取策略适应这种动态范围扩展。
对于Radix-4 DIT FFT,在蝶形阶段计算出的值按照以下以下因子增长,即带来3bit位宽扩展。
公式1 Radix-4 DIT 蝶形计算位宽增长
对于Radix-2 DIT FFT,在蝶形阶段计算出的值可以通过以下因子增长,即会带来2bit位宽展宽。
公式2 Radix-2 DIT FFT蝶形计算位宽增长
Bit位宽的增长可以有三种处理方式:
在不缩放的情况下执行计算,并在计算结束时携带所有有效整数位
使用固定的缩放方案在每级运算进行缩放
使用块
浮点
自动进行缩放
1.1 全精度算法考虑
当使用全精度无缩放算法时,保留所有整数bit。数据路径位宽增加以适应蝶形运算带来的位宽增长。乘法产生的小数位数的增长在乘法后被截断(或舍入)。输出位宽为(input width+log2(transform length)+1),这是最坏的位宽增长场景。
考虑未缩放Radix-2 DIT FFT:每级数据路径必须增长1bit,因为蝶形中的加、减器可能会加/减两个满标度值并生成宽度增长1位的样本。这将产生输出宽度相对于输入宽度增加的log2(变换长度)部分。复数乘法器保持了输入数据幅度(当它在复数平面上应用旋转时),当输入幅度大于1时,理论上会产生bit位宽增长(例如,1+j会产生1.414倍的幅度增长)。这意味着复数乘法器bit增长必须在整个FFT处理中考虑。例如,16bit输入,包含1位整数位,15位小数位,1024点变换,将会有27bit位宽输出,其中12位整数,15位小数。注意,IP核没有明确二进制点的位置。输出保持和输入相同的二进制点位置。对于16位输入,3位整数,13位小数,输出将会是27bit,包括14位整数bit和13位小数位。
注意:对于未缩放算法、缩放算法和块浮点算法,IP核没有明确二进制点位置。输出数据二进制点位置和输入数据和每级缩放移位有关。
1.2.缩放算法考虑
当使用缩放处理,每级的缩放因子可以为1,2,4或者8。如果缩放不充分,碟形运算输出可能会带来位宽增长,超出动态范围,从导致溢出。当将缩放处理应用于FFT实现时,缩放因子s如下定义:
公式3 缩放因子定义
其中,bi为第i级的缩放因子。因此,使用缩放因子的FFT/IFFT输出结果,由因子1/s进行修正。
公式4 缩放因子对FFT/IFFT计算影响
如果Radix-4算法在每级使用因子4进行缩放,则因子1/s等效于IFFT中的1/N。对于Radix-2,每级缩放为2,由因子1/N提供。
1.3.块浮点算法考虑(自动缩放)
使用块浮点算法,每级采用充分的缩放,保证不溢出,缩放由块指数跟踪。
2.浮点考虑
FFT可选的接收32bit单精度浮点数据,包括1位符号位,8位整数位和23为小数位,该数据组织符合Xilinx浮点操作IP要求。在FPGA内部实现完全浮点需要消耗大量资源。FFT核浮点实现是利用高精度定点实现与完全浮点类似的噪声性能。
图3-14举例了两级噪声性能,通过选择24bit和25bit相位因子宽度。相位因子越宽消耗的资源越多。
图1、FFT两级噪声性能对比
当将结果与第三方模型(例如MATLAB)进行比较时,应注意,通常需要一个比例因子来确保结果匹配。比例因子依赖于数据,因为输入数据规定了内部定点核心之前所需的标准化级别。由于核心在浮点模式下不提供此缩放因子,因此如果需要,可以在核心输出之后应用缩放。
当选择浮点输入数据时,所有优化选项(内存类型和DSP的优化)仍然可用,允许您在转换时间内权衡资源。
FFT核心的浮点接口不支持非规范化数字。为了匹配Xilinx浮点运算符核心的行为,核心将非规范化的操作数视为零,符号取自非规范化数字。
如果核心在输入端检测到NaN或±无穷大值,则与当前输入帧相关联的所有输出样本都设置为NaN。符号位设置为零,所有指数和分数位都设置为1。
3.实数输入考虑
FFT核心接收复数数据样本,但可以通过将所有虚输入样本