如何正确匹配 FIR 滤波器的比特增长与参考值

信息处理 有限脉冲响应 反卷积 位深度
2022-02-08 02:02:35

我正在尝试在ZYNQ FPGA上实现 CIC/FIR 滤波器链。到目前为止,使用Xilinx FIR 编译器工作正常,但我无法正确获得所有数学。

目前我有2个过滤器链:

  • 5×下采样,通带12.5MHz:
    → FIR 滤波器 2,5x 下采样,输入 17.7.0,输出 17.7

  • 625×下采样,通带100kHz

    → CIC 过滤器,25×下采样,输入 14 位,输出 16 位

    → 补偿 FIR 滤波器,无下采样,输入 17.7,输出 17.7

    → FIR 滤波器 1,5×下采样,输入 17.7.0,输出 17.7

    → FIR 滤波器 2,5×下采样,输入 17.7.0,输出 17.7

我有一个14位,20kHz表示我同时输入两条链:

  • 如果我将它输入到第一个链中,我会将 14 位值扩展为 17 位,并在末尾添加 7 个零位 (.7)。我得到了一个不错的输出,它让我赢得了一点。

  • 如果我将信号馈入第二个链,我直接将 14 位信号馈入 CIC 滤波器并将输出信号左移以仅保留 16 个 MSB。然后我将该 16 位值签名扩展到 17 位(是的,我也可以只保留 CIC 返回值的前 17 位,如果这样会更好,请告诉我)并在末尾添加 7 个零位 (.7) 作为好。在“FIR 滤波器 1”的输出之前,滤波器赢得了我 1-2 位,但在“FIR 滤波器 2”的输出处,我有一个输出丢失了8 位(高 8 个非符号位为 0)。这是完全相同的 FIR 滤波器,它在第一个给我 +1 位(5×下采样)链...这个断开的链在一段时间后似乎也有很多抖动...(我可以排除溢出作为错误来源,因为 Xilinx FIR 编译器保证没有溢出)。

这怎么可能,我错过了什么?

在同一个问题中,我想问:

让我们假设所有的链最终都能正常工作。然后我会有不同的位增长。最初我知道 14bit 对应于2.2Vpp这意味着12.86位对应于1V. 但现在我突然有一个17.7bit的输出。我怎么知道我的1V现在的参考水平是?因为它已经改变了一些。我很确定仅考虑直流增益会产生错误的结果。

我的波形:

输出5×链:

输出 5x 链

625×

链条 625x

我非常感谢任何提示,如果需要更多信息,我很乐意添加更多信息。

1个回答

我在 FPGA 中使用 FIR 和 IIR 滤波器做了很多工作,这里有一些建议

1 - 跟踪您的位及其各自的权重。

2 - 跟踪您的滤波器增益和系数的位数。例如,假设您有一个 14 位有符号输入。您的输入可以从 +16383 到 -16384。现在您在 17 抽头 FIR 低通滤波器中对其进行滤波(例如),其直流增益应该为“1”。假设 16 位系数,并且没有系数大于或等于 '1',则系数之和应为 32768 (2^15)。它可能会稍微小一点,这并不重要,特别是如果你对输出进行四舍五入。但是,由于缩放,系数之和可能是 32769、32770 等。在这种情况下,您的 DC 增益将略大于单位,并且您可能需要保护位。

3 - 假设过滤器的输出没有溢出,现在您需要确定需要保留多少“小数位”。没有简单的答案。假设没有抽取,保持输出格式与输入相同可能是个好主意。例如,带有 1 个符号位的 14 位输入 ---> 带有 1 个符号位的 14 位输出。但是,请在截断前对数据进行四舍五入,否则可能会插入一些 DC 偏移或其他不愉快的事情。

4 - 如果您抽取,原因之一可能是提高数据的分辨率,在这种情况下,您的输出应该比输入具有更多的小数位。

5 - 如果您的滤波器的增益高于 1(故意,而不是因为量化),例如谐振 IIR 滤波器,您将需要实现适当数量的保护位。例如,您在某个频率添加 20 dB 增益,您将需要在输出端增加 4 个保护位。