FFT 的定点乘法
Fixed Point Multiplication for FFT
我正在用 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 位)。
技巧来了 - 我需要 up/down 将 16 位舍入或截断为 8 位,因此,我得到 0000 0010,即 2 - 错误太高了。
我的问题是:
- 如果您不知道输入数据的范围并且要用定点表示数字,您将如何解决这个范围与精度的问题?
- 我应该做一个过程,在每次乘法后决定把逗号放在哪里吗?不会让乘法变慢吗?
- Xilinx IP Core 有 3 种不同的定数运算方式 – 未缩放(类似于我想做的,只是在发生溢出时截断),缩放定点(我假设,在那种情况下它决定之后每个乘法,逗号应该在哪里,什么应该四舍五入)和块浮点数(不知道它是什么或它是如何工作的 - 希望得到解释)。那么这个IP Core是如何决定把逗号放在哪里的呢?如果根据我的数据集中的最高值做出决定,那么如果我只有 1 个高峰而其余数据都很低,则错误将非常高。
对于任何已知方法的任何想法或信息,我将不胜感激。
您不需要知道输入的定点格式。您可以安全地将其视为标准化的 -1 到 1 范围或完整整数范围。
原因是您的输出将具有与输入相同的格式。或者,更可能的是,对于 FFT,已知关系如 3 位增加,这将使输出比输入多 3 个整数位。
知道小数点在哪里结束是核心用户的负担,当然你必须记录动态范围的变化。
我正在用 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 位)。
技巧来了 - 我需要 up/down 将 16 位舍入或截断为 8 位,因此,我得到 0000 0010,即 2 - 错误太高了。
我的问题是:
- 如果您不知道输入数据的范围并且要用定点表示数字,您将如何解决这个范围与精度的问题?
- 我应该做一个过程,在每次乘法后决定把逗号放在哪里吗?不会让乘法变慢吗?
- Xilinx IP Core 有 3 种不同的定数运算方式 – 未缩放(类似于我想做的,只是在发生溢出时截断),缩放定点(我假设,在那种情况下它决定之后每个乘法,逗号应该在哪里,什么应该四舍五入)和块浮点数(不知道它是什么或它是如何工作的 - 希望得到解释)。那么这个IP Core是如何决定把逗号放在哪里的呢?如果根据我的数据集中的最高值做出决定,那么如果我只有 1 个高峰而其余数据都很低,则错误将非常高。
对于任何已知方法的任何想法或信息,我将不胜感激。
您不需要知道输入的定点格式。您可以安全地将其视为标准化的 -1 到 1 范围或完整整数范围。
原因是您的输出将具有与输入相同的格式。或者,更可能的是,对于 FFT,已知关系如 3 位增加,这将使输出比输入多 3 个整数位。
知道小数点在哪里结束是核心用户的负担,当然你必须记录动态范围的变化。