91 lines
6.1 KiB
Markdown
91 lines
6.1 KiB
Markdown
|
# 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配置流程
|
|||
|
|
|||
|
1. 将数据放到至指定的内存地址空间。
|
|||
|
2. 配置源数据所在地址和计算输出数据所在地址(目的地址)寄存器,源数据地址和目的地址可重复,重复情况下输出覆盖掉输入。
|
|||
|
3. 配置fft_en,fft_size,is_fft,is_complex等寄存器。
|
|||
|
4. 把寄存器sw_trig_in拉高,触发硬件启动fft计算。
|
|||
|
5. 硬件根据源数据地址,自动读取源数据,根据寄存器配置情况,进行相应的fft计算,并将计算结果搬移到目的地址,并肩sw_fft_done信号拉高。
|
|||
|
6. 原件根据sw_fft_done信号输出或者中断信号指示,从目的地址读取数据。
|
|||
|
7. 软件将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:
|
|||
|
1. 实数模式下:0~5分别表示计算点数为256、512、1024、2048、64、128
|
|||
|
2. 复数模式下: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位,阶码(指数位)为第30~23位,共8bit,尾数为第22~0位,共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。
|