Verilog实现fir和iir滤波器的细节问题

最近要求用fpga仿真fir和iir滤波器并比较它们的性能。fir一天即完成,而iir花了近一个多上星期才搞出来,没有想象中这么简单,需要考虑很多细节。

fir滤波器由于没有反馈,因此跟着时间往前计算,实现流水线也不难,总能得到结果。而iir滤波器由于存在反馈,很容易由于量化误差问题而导致不稳定。还有其他一系列细节问题,如下:

1、  考虑好输入是有符号的,滤波器系数也是有符号的。

2、  Iir有直接1型和直接2型两种形式,考虑到节约寄存器和实现方式简单化,多用直接2型。

3、  对于4阶以上的iir滤波器,如果直接采用直接2型,那么当系数量化取整后,由于量化误差及其反馈迭代的影响,误差足以使极点超过单位圆使得滤波器不稳定(表现为输出波形溢出)。因此,高阶情况下必须用2阶滤波器进行级联实现,因为在2阶条件下极点离单位圆较远,误差不足以使极点偏离到单位圆外。

4、  存在一次除法,课本中a0是1,但由于量化的作用,这个数非1。最好放大2的幂次方,这样除法可以用移位处理。另外,经过尝试发现,移位会造成向下取整,而不是仿真中的四舍五入。由于向下取整的误差比四舍五入大,所以结果频谱会多直流分量,因此必须在中间结果进行四舍五入处理(判断的算法)

5、  还是由于反馈的问题,使得每次乘加后得到的输出又会返回输入,再进行乘加后位数增长了又要反馈回输入,导致我们困惑到底应该定义多少位数。因此对于8*8,我们可以都扩充为16*16,得到32位中截取16位作为结果反馈回去。理论上讲,如果iir是稳定的,最后肯定不会溢出。所以,可以预设大点的容量,通过Modelsim观测每次结果占多少位,然后再选择更合适的位数。

6、  由于反馈,在时序上必须保证,乘加等运算结束后,才能把这个数反馈回去而不能反馈回一个还没算完的数。因此,并行语言要实现串行的思想,可以考虑状态机。

你可能感兴趣的:(FPGA学习)