做fft蝶形运算时如何截位
现在在用verilog编写fft程序,256点fft,输入数据14bit,旋转因子8bit,最高位都是符号位,输出也是14bit,蝶形运算根据点数来算是8级,每个蝶形运算的结果是23位,为保证下级蝶形运算的进行,需将这次的结果截位为14位。
但是在截位这块不知道怎么处理,
我现在想到两种方案:
1保留低13位和最高的符号位,对于低13位绝对值大于2^14的取值为2^14-1,否则直接选取低13位,这样做我担心经过每级的运算后数会变得越来越大,会不会导致很多溢出。
2.保留高13位和符号位,但是这样做得到的数据都很小,分辨率不高。
我的想法肯定有很多局限性,我想大家能不能指导我一下,我觉得这块应该是比较普遍的问题,希望小编也能帮帮我,谢谢大家!
也可以二者兼顾,取中间13位啊,你自己做个估计,通常典型情况下,数据的范围有多大,然后高的截几位,低的截几位。
对于溢出部分,根据符号位取为正的最大或负的最小。
截取小数时四舍五入,对正的如此,对负的呢,最好是反着来,就是比如+1.5,那取2,要是-1.5,不是直接截掉后面的位,而是取-2,这样平均值还在0,不会发生人为哪方面偏移。
这里没有取巧可言,必须截低位。
取高位,截低位
我现在改测试8点fft,输入的数据是1,2,3,4,5,6,7,8.第一次蝶形运算的其中一个结果是:1276,1532,1276,1532.
很明显,我取高位,即:1276/1024,1532/1024,1276/1024,1532/1024.
只能得到四个均是1的结果。
可能这个结果和输入数据太小有关系。
把输入数据改大,结果也也相应的变大,相比于之前的基频为0,这次结果比较好,但还是不对,怎样截位结果才能不失真呢?
截位一定会导致精度降低吗?我之前将fft IP核得到的结果和matlab相比较,结果完全一样。
这是怎么做到的,竟然没有一点误差。
那matlab最后的结果也截位了吗?数据如何处理属于算法,matlab也好,verilog也好,只是实现的方式,只是思路一致,最后实现的结果是一致的,通常做算法的会先用matlab把算法设计好,然后改verilog实现,再仿真进行数据比对,要完全一致才算通过。
matlab里没有做截位,我在编程之前先在matlab里设计的,只不过到verilog这边后发现好多东西需要具体的表达,matlab里只是把思路设计好了。
我想了一下,做截位肯定要失真,要达到完全不是真的结果必须用浮点运算,所以我把数据都转成浮点,看看可不可行。
浮点运算可行,8位的完美解决。如果早点知道这其中是用的浮点运算就不会浪费哪几天的纠结了。
不过摸索着学习的过程也很重要。
期望明天会有更好的结果。
肯定是可以的,但是浮点运算占用资源太多了,我之前用纯浮点运算做过一个64点的fft,综合完之后估算了一下,用去100多万门。
8位?不是32位的单精度浮点数吗?你用FPGA做还是asic?
哦,打错了,嘿嘿,是8个点的,请问占用资源在哪里可以看到啊?
fpga里面如何用浮点算法实现fft呢?可以分享代码吗?
顶楼上,使用fpga如何计算浮点算法
小编有没有基4的256点FFT啊?
