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 - 错误太高了。

我的问题是:

对于任何已知方法的任何想法或信息,我将不胜感激。

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

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

知道小数点在哪里结束是核心用户的负担,当然你必须记录动态范围的变化。