VHDL - 设计简单的一阶IIR滤波器

时间:2015-04-24 16:54:03

标签: filter vhdl xilinx digital

我为我的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以得到合理的系数近似值。

我们说我使用这种结构: First order IIR filter

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

感谢Jonathan的帮助,我仍然需要了解一些事情,所以让我们说实话:首先,您认为哪种结构最适合FPGA实现?

Possible structures

在任何情况下,让我说我倍增:

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

现在怎样? :d

1 个答案:

答案 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位乘法器实现稳定性。例如,您可能希望寻找一种不同的设计,一种将输入抽取到较低频率的设计作为第一阶段操作。

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