|
发表于 2012-9-1 12:55:55
|
显示全部楼层
为提高信噪比,一般在乘累加过程中不截位,在所有乘累加结束后再截位。关键是决定乘累加过程中的运算位宽。不考虑系数对称的优化,7阶FIR滤波器有8个系数,需要做8次乘法运算,假定系数为a0,a1,a2,a3,a4,a5,a6,a7,延时线数据为x0,x1,x2,x3,x4,x5,x6,x7。
8位乘8位有符号的结果在最坏情况下要用16位有符号数来表示,最坏情况是-128×-128=16384,如果不考虑这种情况的话,用15位即可。若其中一个是常数,则可以进一步优化,如8位有符号数x*10,输出结果的范围位[-1280,1270],落在[-2048, 2047]范围内,用12位有符号数表示即可。FIR滤波器有多种实现方式,在时钟频率等于采样率的情况下,要采用全并行方式,即卷积运算过程中的每一个乘法运算都映射到一个乘法器中,那么每个乘法器的输出位宽都可以根据乘法的输出范围来决定;若时钟频率远高于采样率,可采用全串行方式,即卷积运算过程中的所有乘法运算都映射到一个乘法器中,将乘法器时分复用,那么乘法器的输出位宽由”输出位宽最大的那个乘法“来决定。
累加器的位宽同样由最坏情况下的输出来决定,我们可以构造出这个最坏情况:所有乘法运算的输出都是同符号的,并且输入的绝对值也达到最大值,那么累加器的输出就达到最大值。用公式表示:
|x0*a0| +|x1*a1|+...+|x7*a7| = |x0|*|a0| +|x1|*|a1|+...+|x7|*|a7|
当|xi|取最大值M时,累加器输出的绝对值达到最大:
M*(|a0|+|a1|+...+|a7|)
若输入为8位有符号数,输入范围为[-128,127],则M为128。若系数为10, -20, 30, -40, 50, -60, 70, -80,那么累加器输出绝对值的最大值为:
128 * (10 + 20 + 30 + 40 + 50 + 60 + 70 + 80) = 46080,落在[-65536, 65535]范围内,用17位有符号数即可。
M也不一定要取128,若输入的模拟信号根本达不到ADC的输入量程,如ADC在无论什么情况下也只能达到[-100, 100],那么M取100。 |
|