Files
kunlun/dtest/dtest3/kl3_fft_test
2024-09-28 14:24:04 +08:00
..
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00

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_enfft_sizeis_fftis_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位阶码指数位为第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。

case8fft模块中断功能测试

kl3的fft模块支持中断在使能fft_done_int_ena的情况下中断信号会在计算完成之后自动触发。

测试方法比较简单即配置好中断信号之后通过偏底层的api主动发起一次fft计算观察中断信号是否被正确触发并观察fft计算结果是否准确即可。测试结果OK。