在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8444|回复: 15

[求助] 做fft蝶形运算时如何截位

[复制链接]
发表于 2013-8-13 10:34:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

现在在用verilog编写fft程序,256点fft,输入数据14bit,旋转因子8bit,最高位都是符号位,输出也是14bit,蝶形运算根据点数来算是8级,每个蝶形运算的结果是23位,为保证下级蝶形运算的进行,需将这次的结果截位为14位。

但是在截位这块不知道怎么处理,

我现在想到两种方案:

1保留低13位和最高的符号位,对于低13位绝对值大于2^14的取值为2^14-1,否则直接选取低13位,这样做我担心经过每级的运算后数会变得越来越大,会不会导致很多溢出。

2.保留高13位和符号位,但是这样做得到的数据都很小,分辨率不高。

我的想法肯定有很多局限性,我想大家能不能指导我一下,我觉得这块应该是比较普遍的问题,希望版主也能帮帮我,谢谢大家!

发表于 2013-8-13 14:47:26 | 显示全部楼层
也可以二者兼顾,取中间13位啊,你自己做个估计,通常典型情况下,数据的范围有多大,然后高的截几位,低的截几位。
对于溢出部分,根据符号位取为正的最大或负的最小。
截取小数时四舍五入,对正的如此,对负的呢,最好是反着来,就是比如+1.5,那取2,要是-1.5,不是直接截掉后面的位,而是取-2,这样平均值还在0,不会发生人为哪方面偏移。
发表于 2013-8-13 15:23:49 | 显示全部楼层
这里没有取巧可言,必须截低位。
发表于 2013-8-13 16:26:27 | 显示全部楼层
取高位,截低位
 楼主| 发表于 2013-8-13 21:44:20 | 显示全部楼层
我现在改测试8点fft,输入的数据是1,2,3,4,5,6,7,8.第一次蝶形运算的其中一个结果是:1276,1532,1276,1532.
很明显,我取高位,即:1276/1024,1532/1024,1276/1024,1532/1024.
只能得到四个均是1的结果。

可能这个结果和输入数据太小有关系。
 楼主| 发表于 2013-8-13 21:58:20 | 显示全部楼层
把输入数据改大,结果也也相应的变大,相比于之前的基频为0,这次结果比较好,但还是不对,怎样截位结果才能不失真呢?
 楼主| 发表于 2013-8-13 22:06:22 | 显示全部楼层
截位一定会导致精度降低吗?我之前将fft IP核得到的结果和matlab相比较,结果完全一样。
这是怎么做到的,竟然没有一点误差。
发表于 2013-8-14 10:00:20 | 显示全部楼层
回复 7# janstina

那matlab最后的结果也截位了吗?数据如何处理属于算法,matlab也好,verilog也好,只是实现的方式,只是思路一致,最后实现的结果是一致的,通常做算法的会先用matlab把算法设计好,然后改verilog实现,再仿真进行数据比对,要完全一致才算通过。
 楼主| 发表于 2013-8-14 11:51:44 | 显示全部楼层
回复 8# eaglelsb


    matlab里没有做截位,我在编程之前先在matlab里设计的,只不过到verilog这边后发现好多东西需要具体的表达,matlab里只是把思路设计好了。


我想了一下,做截位肯定要失真,要达到完全不是真的结果必须用浮点运算,所以我把数据都转成浮点,看看可不可行。
 楼主| 发表于 2013-8-14 22:04:03 | 显示全部楼层
浮点运算可行,8位的完美解决。如果早点知道这其中是用的浮点运算就不会浪费哪几天的纠结了。
不过摸索着学习的过程也很重要。
期望明天会有更好的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-20 09:35 , Processed in 0.033798 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表