FFT的不动点乘法

时间:2015-12-18 00:41:35

标签: vhdl fft xilinx fixed-point

我正在用VHDL编写Radix-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 Core如何决定逗号的位置呢?如果根据我的数据集中的最高值做出决定,那么如果我只有1个高峰且其余数据都很低,则错误将非常高。

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

1 个答案:

答案 0 :(得分:0)

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

原因是您的输出格式与输入格式相同。或者,更有可能是FFT,3比特之类的已知关系会增加,这将使输出比输入多3个整数位。

知道小数点的最终位置是核心用户的负担,你必须记录当前动态范围的变化。