FFT测试说明文档
FFT简介
kl3的fft采用主动访问模式通过dma从指定地址读取数据到内部memory,计算完成之后,再将内部计算结果通过dma搬移到指定地址。数据搬运过程和计算过程完全自动化,用户只需要在将数据准备好之后,触发sw_trig_in寄存器,然后等待sw_fft_done信号拉高,从指定地址读取结果即可。
kl3 fft支持实数和复数输入,实数fft输入为实数,输出为共轭对称的复数,实数ifft输入为共轭对称的复数,输出为实数。复数fft、ifft的输入为复数,输出也为复数。
FFT特性
- 支持64、128、256、512、1024、2048点实数fft、ifft计算,支持32、64、128、256、512、1024点复数fft、ifft计算。
- 支持16、18、20、24、28、32位定点输入,支持32位浮点输入。
- 支持输入数据的左移位操作(最大7位),支持输出数据的右移位操作(最大7位)。
- 支持浮点数指数偏移调整。
- 支持有符号和无符号输入。
- 支持浮点数和定点数转换状态查询。
- 支持fft输出硬件加窗(hanning窗,hamming窗和blackman窗)。
FFT配置流程
- 将数据放到至指定的内存地址空间。
- 配置源数据所在地址和计算输出数据所在地址(目的地址)寄存器,源数据地址和目的地址可重复,重复情况下输出覆盖掉输入。
- 配置fft_en,fft_size,is_fft,is_complex等寄存器。
- 把寄存器sw_trig_in拉高,触发硬件启动fft计算。
- 硬件根据源数据地址,自动读取源数据,根据寄存器配置情况,进行相应的fft计算,并将计算结果搬移到目的地址,并肩sw_fft_done信号拉高。
- 原件根据sw_fft_done信号输出或者中断信号指示,从目的地址读取数据。
- 软件将sw_fft_done信号拉低。
FFT工作模式
fft工作模式主要由sw_is_complex、sw_is_fft、sw_fft_size[2:0]三个寄存器控制。
- sw_is_complex:为0表示实数模式,为1表示复数模式。
- sw_is_fft:为0表示fft计算,为1表示ifft计算。
- sw_fft_size:
- 实数模式下:0~5分别表示计算点数为256、512、1024、2048、64、128
- 复数模式下:0~5分别表示计算点数为128、256、512、1024、32、64
输入输出顺序
- 时域数据顺序为时间顺序,频域数据的顺序按照频率有低到高依次输出,实部在前,虚部在后。
- 对于实数fft和ifft,频域第一个复数点的实部对应频率最低点频谱信号(直流分量,即X(0)),频域第一个复数的虚部对应频率最高点频谱信号(即X(N/2))。
数据模式
fft采用32位定点数计算,为了适应不同输入数据位宽的要求,硬件支持不同有效位的输入和输出,为了节省总线资源,硬件支持两个16位定点数拼接在一起输入,输出也是2个16位的定点数拼成32位输出,若数据有效位宽超过16位,不足32位,则硬件自动截取低N位(16<N<32)。
sw_data_mode | 说明 |
---|---|
0 | 输入32位有效,定点数 |
1 | 输入低28位有效,定点数 |
2 | 输入32位有效,浮点数 |
3 | 输入两路16位有效,定点数 |
4 | 输入低24位有效,定点数 |
5 | 输入低20位有效,定点数 |
6 | 输入低18位有效,定点数 |
7 | 输入两路16位有效,定点数,高低15位互换 |
fft支持32位单精度浮点数输入和输出,硬件自动将浮点数转为定点数进行计算,计算完成之后转成对应的浮点数。
fft按照IEEE 754标准对单精度浮点数进行解析和封装,对于32位的单精度浮点数,数符为最高1位,阶码(指数位)为第3023位,共8bit,尾数为第220位,共23bit。
其他配置
略
FFT测试例程
sfc测试例程使用到的外设包含fft、uart、gptimer。
- fft:测试对象,用于测试定点数和浮点数fft、ifft计算。
- uart:使用uart0,实现调试信息打印,接收case配置信息等与PC的交互功能。
- gptimer:使用gptimer0,用于统计fft运算用时情况。
fft测试例程遵循自动化测试框架,在例程执行之后,初始化串口0,通过串口发送“start”字段到PC,并等待PC发送“config”字段来获取本次需要执行的测试case,如果在规定时间内(9s)没有收到测试case信息,则默认测试所有的case。
在获取到case组合之后,初始化fft以及gptimer,并根据case组合开始执行测试case。
case0~case7:各种模式下的fft、ifft计算测试
kl3的测试例程,主要测试常规模式下(定点数32bit、浮点数32bit)不同点数的fft和ifft计算。得到的测试结果和matlab仿真结果(由设计者zenganhui提供)对比,如果计算结果和仿真结果的差值在基准值范围内,则认为是计算无误。
差值范围基准值的计算方法:找到实部和虚部绝对值最大的数以及该值对应的实部或者虚部数据,以这两个数据的平方根值作为基准值,计算fft结果与预期结果的差值绝对值,该值大于基准值万分之五则判定计算出错。
在测试中,分别测试了定点数64、128、256、512、1024、2048点实数fft、ifft计算,定点数32、64、128、256、512、1024点复数fft、ifft计算,以及浮点数64、128、256、512、1024、2048点实数fft、ifft计算,浮点数32、64、128、256、512、1024点复数fft、ifft计算。测试结果OK。
case8:fft模块中断功能测试
kl3的fft模块支持中断,在使能fft_done_int_ena的情况下,中断信号会在计算完成之后自动触发。
测试方法比较简单,即配置好中断信号之后,通过偏底层的api主动发起一次fft计算,观察中断信号是否被正确触发,并观察fft计算结果是否准确即可。测试结果OK。