0

我正在为我的 Spartan-6 设计一个简单的一阶 IIR 滤波器,但我正在努力解决总线宽度和系数量化问题。

输入数据为 16 位宽,来自集成 ADC,量化噪声是前端噪声的主要噪声来源。

输入信号以大约 300kHz 的频率进行滤波,我想在 1Hz、10Hz、100Hz、1kHz、10kHz 的可调频率下实现一阶 IIR 滤波器:让我们关注 1Hz 滤波。理论上我应该能够获得 N = log2(300k) = 18 位的分辨率。

我计算了滤波器系数:

增益:3.1416e-6

分子:[1 1]

分母:[1 -0.999993717]

如何处理分数系数?我正在考虑将系数乘以 2^N,然后削减 N 个 LSB,选择 N 以获得系数的合理近似值。

假设我使用这种结构: 一阶 IIR 滤波器

z-1 寄存器的总线宽度和使用这种乘法方法的 y 输出应该是多少?


感谢 Jonathan 的帮助,我仍然需要了解一些东西,所以让我们实际操作一下:首先,您认为哪种结构最适合 FPGA 实现?

可能的结构

无论如何,假设我乘以:

b = 3.1416e-6 * 2^36   --> 110100101101001111
a = 0.999993716 * 2^17 --> 011111111111111111

怎么办?:D

4

1 回答 1

1

就像您想的那样,您通过将它们乘以 2**N 来处理小数系数。这为您提供了具有 N 个二进制小数位的定点表示。您必须注意跟踪小数部分宽度。

例如,如果您将输入(16 位整数,0 位小数)与系数(1 位整数,N 位小数)相乘,您最终将得到一个 17+N 位数字和 17 位整数,N 位小数。添加数字时,请确保将整数部分对齐...

N应该有多大,由你决定!Matlab 的 fdatool 可以帮助您可视化位量化对滤波器的影响。Matlab/Simulink 是分析量化在您的过滤器 IMO 中发生的任何地方的影响的最佳工具。

不过,在 FPGA 中,我会将 N 放在乘数允许的范围内。例如,如果您使用 18x18 乘法器,只需使用 18 位(必须有符号)作为系数。如果这还不够,请考虑预先调整您的输入,更大的乘数输入将花费更多,但也许您有足够的乘数可用。

另请注意,在截断定点数时,您可以四舍五入以减少噪音。只需在截断前添加 0.5,这通常可以在管道的某处以最低成本完成。

更新

Xilinx 有一个很好的关于 IIR 滤波的白皮书,它可以比我更好地帮助你。

否则,我刚刚意识到您的过滤要求非常苛刻(300kHz 中的 1Hz 截止)。我怀疑你可以用 18 位乘法器实现稳定性。例如,您可能希望寻找一种不同的设计,将输入抽取到较低频率作为第一阶段操作。

如果您需要保持当前要求不变,则必须使用更大的乘法器和加法器。

于 2015-04-24T17:43:43.160 回答