Vhdl FFT的定点乘法

Vhdl FFT的定点乘法,vhdl,fft,xilinx,fixed-point,Vhdl,Fft,Xilinx,Fixed Point,我正在用VHDL编写一个基数为2的DIT FFT算法,它需要用旋转因子(TF)对输入数据进行一些分数乘法。我使用定点算法来实现这一点,每个字的长度为16位,其中1位是符号位,其余的分布在整数和分数之间。因此,我的困境是: 我不知道我的输入数据在什么范围内,所以如果我决定4位为整数,其余11位为分数,如果我得到的整数大于4位=15位小数,我就完蛋了。这同样适用于50/50,比如7位是整数,其余是分数。如果我得到的数字非常小,我会因为截断或舍入而陷入困境,即: 假设输入端有一个整数“3”(0000

我正在用VHDL编写一个基数为2的DIT FFT算法,它需要用旋转因子(TF)对输入数据进行一些分数乘法。我使用定点算法来实现这一点,每个字的长度为16位,其中1位是符号位,其余的分布在整数和分数之间。因此,我的困境是:

我不知道我的输入数据在什么范围内,所以如果我决定4位为整数,其余11位为分数,如果我得到的整数大于4位=15位小数,我就完蛋了。这同样适用于50/50,比如7位是整数,其余是分数。如果我得到的数字非常小,我会因为截断或舍入而陷入困境,即:

假设输入端有一个整数“3”(0000 0011),TF为“0.7071”(0.10110101-8位),为简单起见,假设数据长度为8位,因此:

3x0.7071=2.1213

3x0.7071=0000 0010。0001 1111=2.12109375(对于16位)

技巧来了-我需要向上/向下取整或将16位截断为8位,因此,我得到0000 0010,即2-错误太高了

我的问题是:

  • 如果您不知道输入数据的范围,并且需要用定点表示数字,您将如何解决范围与精度的问题
  • 我应该做一个过程,在每次乘法后决定逗号的位置吗?这不会使乘法运算变慢吗
  • Xilinx IP Core有3种不同的固定数算术方法-无标度(与我想做的类似,只是在发生溢出时截断)、标度固定点(我假设,在这种情况下,它会在每次乘法后决定逗号应该在哪里以及应该舍入什么)和块浮点(不知道它是什么,也不知道它是如何工作的-希望得到一个解释)。那么这个IP核心如何决定将逗号放在哪里呢?如果决定是根据我的数据集中的最高值做出的,那么如果我只有一个峰值,而其余的数据是低的,那么错误将非常高

我将非常感谢关于任何已知方法的任何想法或信息。

您不需要知道输入的定点格式。您可以安全地将其视为标准化的-1到1范围或完整整数范围

原因是您的输出将与输入具有相同的格式。或者,对于FFT,更可能是一种已知的关系,如3位增加,即输出比输入多3个整数位


知道小数点将在哪里结束是核心用户的负担,当然,您必须记录对动态范围的更改。

关于第二点:每次操作后动态重新缩放定点操作数类似于使用浮点(包括由指数表示的动态缩放因子2**N)。关于你的第一点:在对输入域一无所知的情况下使用定点计算给我的印象是非常危险的:我建议要么与对用例有深入了解的人合作,更好地处理输入域,要么考虑使用浮点算法(它不必符合IEEE-754,您可以使用简化的自定义格式):这是一种操作数由所有操作数之间共享的尾数和公共指数表示的格式。尾数上的操作基本上是定点操作,这使其适用于定点平台。如果操作正确,基本上可以获得浮点动态范围的大部分好处,使用降低定点硬件的成本。我不能确切地说这有多灵活,因为我从未使用过它(只使用纯定点或纯浮点)。快速的互联网搜索将找到多个相关的应用程序注释。@njuffa,谢谢你的回答!关于我的第一个问题,很遗憾,我正在与之合作的团队到目前为止还没有完成他们的工作,我也没有时间等他们。所以要么成功,要么失败。固定对浮动也是如此。在我看来,浮动将是b这是一个更好的解决方案,但从“上面”决定,我们应该使用fixed,你可以死,但应该使用它。所以,是的,基本上,我受到来自各个方面的限制。谢谢你的帖子,Jonathan。我可能想得太多了。我会假设输入是标准化的,只是把它放到我的IP核心规范中。