如何避免 FFT 位增长?

信息处理 fft 位深度
2022-01-27 12:52:51

我尝试在 FPGA 中实现 radix-2 DIT FFT 算法。但是,我不明白如何为旋转因子和输入数据的乘法和加法过程设置位增长。

例如,我的输入数据是 13 位有符号数,其分数为 0 位(sfix13_0),而我的旋转因子是 16 位有符号数,分数为 15 位(sfix16_15)。所以第一步是将这两个数字相乘。之后,我添加了乘法运算的输入和输出的第一个样本。我得到 32 位有符号数,只有 15 位的一小部分。问题是如果我为 FFT 算法做 10 个阶段,我的输出有很大的位深度。

如何在每个阶段的乘法和加法运算后设置位深度?在不破坏FFT结果的情况下应该进行什么样的操作,我们如何从理论上解释它?

例如,我在 MATLAB 中模拟 16 点 FFT 和 4 个阶段的位增长。但是,我用 60 位小数达到 128 位有符号数。我认为如果我将这种方法应用于 10 个阶段,输出将获得非常高的位深度。

我添加 MATLAB 输出:

在此处输入图像描述

该图像具有输入和输出数据。图片左侧显示输入,图片右侧显示输出,图片中间显示乘法和加法运算(称为蝶形)。

在进行 1024 点 FFT 时,如何处理这种位增长,尤其是整数部分?

1个回答

定点 FFT 很棘手。不幸的是,这在很大程度上取决于您正在处理的信号类别。

我们如何从理论上解释它?

让我们从 FFT 的能量守恒定义开始

X[k]=1Nn=0N1x[n]ej2πknN

这保留了两个域中的能量,即x2[n]=|X[k]|2

如果将此应用于“类噪声”信号,则输出通常具有与输入相同的幅度范围,因此只需添加一些保护位就可以了。

但是,如果将其应用于正弦波,峰值幅度将大约大,这意味着您至少需要保护位来适应频域的非常大的波峰因数信号。Nlog2(N)/2

如何在每个阶段的乘法和加法运算后设置位深度?

这在很大程度上取决于您的实施的具体要求:所需的 SNR 是什么,输入信号的类型是什么,您对偶尔削波的敏感程度等。这始终是信噪比和削波风险之间的权衡(这只是一种不同类型的噪音)以及您想要花费多少比特。

我会从

  1. 使用缩放,即每第二阶段的结果右移 1N
  2. 所有的旋转因子都等于或小于 1。您可以将它们表示为 Q0.15
  3. 您的数据是 Q13.0,因此乘法将导致 Q13.15
  4. 对于 1024 位 FFT,您应该添加至少 5 个保护位,因此所有中间结果和输出可能应该在 Q18.15 或 Q19.15 中。
  5. 使用 Q19.15 中的数据和 Q0.15 中的旋转因子执行所有蝴蝶。将结果截断到 Q19.15 并重复。
  6. 每隔一个阶段缩放 0.5(右移)或将每个阶段缩放 sqrt(0.5),如果这样做便宜的话。
  7. 您的输出将在 Q19.15 中,因此您可以将其截断/舍入为您需要的任何格式或位深度。您只需要确保可以容纳输出的波峰因数
  8. 如果您仅限于 32 位,那么我会选择 Q18.13 和 Q0.13 中的旋转。您的信噪比会降低 12 dB,但这可能已经足够了。