我为我的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以得到合理的系数近似值。
我们说我使用这种结构:
使用此乘法方法, z-1寄存器和y输出的总线宽度应该是多少?
感谢Jonathan的帮助,我仍然需要了解一些事情,所以让我们说实话:首先,您认为哪种结构最适合FPGA实现?
在任何情况下,让我说我倍增:
b = 3.1416e-6 * 2^36 --> 110100101101001111
a = 0.999993716 * 2^17 --> 011111111111111111
现在怎样? :d
答案 0 :(得分:1)
您可以通过将它们乘以2 ** N来处理小数系数,就像您想象的那样。这为您提供了具有N个二进制小数位的定点表示。您必须注意跟踪小数部分宽度。
例如,如果将输入(16位整数,0位小数)与系数(1位整数,N位小数)相乘,则最终得到17 + N位数,17位整数,N比特分数。添加数字时,请确保将整数部分对齐...
N应该多大,这取决于你! Matlab的fdatool可以帮助您可视化比特量化对滤波器的影响。 Matlab / Simulink是分析量化的最佳工具,无论它在过滤器IMO中发生在哪里。
在FPGA中,我会把N和乘数一样大。例如,如果使用18x18乘法器,则只需使用18位(必须符号)作为系数。如果还不够,那么考虑预先输入你的输入,更大的乘数输入将花费更多,但也许你有足够的乘数。
另请注意,截断定点数时,您可以 round 来降低噪音。只需在截断前添加0.5,通常可以在管道上的某个位置以最低成本完成。
Xilinx有一个很好的whitepaper on IIR filtering可以帮助你比我好。
否则,我只是意识到你的滤波要求非常激烈(300Hz以下的1Hz截止频率)。我怀疑你能用18位乘法器实现稳定性。例如,您可能希望寻找一种不同的设计,一种将输入抽取到较低频率的设计作为第一阶段操作。
如果您需要保持当前的要求不变,则必须使用更大的乘数和加法器。