1. Arm RAN加速库中的FFT与DCT函数深度解析
在5G无线通信系统的物理层实现中,快速傅里叶变换(FFT)和离散余弦变换(DCT)是支撑OFDM调制解调与信道编码的核心算法。Arm RAN加速库针对这些计算密集型操作进行了深度优化,提供了从半精度浮点(f16)到单精度浮点(f32)的多精度支持,以及从一维到二维的变换能力。
1.1 FFT函数架构设计原理
FFT实现采用经典的"计划(plan)+执行"两阶段模式,这种设计源于FFTW库的成功经验。创建计划时,系统会根据变换规模预先计算旋转因子(twiddle factors)、确定最优的基算法组合(如Cooley-Tukey或Bluestein算法),并分配必要的临时缓冲区。这种设计使得多次执行相同规模的FFT时,可以避免重复的初始化开销。
以armral_fft_create_plan_f32_cf32为例,其函数原型为:
c复制armral_status armral_fft_create_plan_f32_cf32(armral_fft_plan_t **p, int n);
其中n指定变换点数,支持任意正整数(不限于2的幂次)。实际测试表明,对于n=2048的FFT,预创建计划可将后续执行时间减少40%以上。
1.2 多维FFT的内存布局处理
二维FFT函数如armral_fft_create_2d_plan_f32_cf32采用行优先(row-major)存储格式,输入数组尺寸为n0×n1。特别需要注意的是输出数组的尺寸计算:
c复制// 对于实数输入复数输出的2D FFT
输出元素数 = n0 × (n1/2 + 1)
这是因为实数FFT具有共轭对称性,只需存储一半频谱即可完整重建信号。库函数内部会自动处理这种对称性,用户只需确保输出缓冲区足够大。例如当n0=1024、n1=2048时,输出数组至少需要1024×1025个复数元素。
重要提示:进行原地(in-place)变换时,必须保证输入缓冲区大小足以容纳输出数据。对于f32格式,实际需要的存储空间为n0×(n1+2)个float32_t元素。
1.3 混合精度FFT的特殊考量
库中提供了如armral_fft_execute_f16_cf32这样的混
