关于FIR滤波器仿真的有限字长效应分析
任何数字系统由于受有限字长存储单元的限制,记录输入的模拟量时,必然带来一定误差,给系统引入噪声。这一点在理论中很清楚,但学习中,用的滤波器都比较简单,所以并没有遇到影响很明显的噪声,还是没有特别具体的而印象深刻体验。但是最近在项目中,居然真的碰上了,由于定点制与浮点制的量化误差导致的噪声!这里记录一下!
如图,用MATLAB的fdatool设计一个两个通带的FIR滤波器,因为要求的通带较窄而信噪比要求又高,就达到了900阶。

保存后进行仿真,仿真结果如图:

图上第一行是原始信号及其傅里叶变换,而第二行是滤波后信号及其傅里叶变换。原始信号有六个频谱。其中两条在通带上,另外四条在阻带上。滤波后总是很难完全滤除另外四个不需要的频谱分量,信号总是带有噪声。
后期,将程序移植到FPGA进行仿真。使用Vivado的仿真结果如图:

将波形数据导出,放入MATLAB里分析波形,结果如图:

波形完美的滤干净了!明明输入信号文件一样,滤波器文件也是读取同一个,MATLAB的滤波仿真结果和vivado却不一样。Vivado滤除以后信号没有噪声,MATLAB滤除有明显噪声。
初步分析原因,这是由于定点制与浮点制运算方式不同导致的。FIR滤波器只涉及加法和乘法。此项目中,FPGA在运算时采用24位定点制的方式。在这种情景下,只要定点制运算在没有溢出,就不存在截尾误差或舍入误差,信号还原得很好。而MATLAB使用浮点制运算,分为尾数部分和指数部分。尾数总是被归一化到第一位保持为1。浮点制运算过程中,不论是相乘还是相加都需要做尾数量化的处理,因而都存在量化误差。