FPGA实现FIR滤波器
请教大家个问题,FPGA实现FIR滤波器,系数都是先经过matlab计算,然后乘以2^N之后得到的,那么,最后计算结束后必须除以2^N(截位或者舍入),但是在哪里除比较好呢?
大家都知道FIR的结构,输入数据移位,然后和系数在乘法器相乘得到积,所有的积进入加法器相加的到结果。
是在乘法器输出那里(截位或者舍入),还是在最后加法器输出那里呢?
我下面瞎掰一个WCDMA的RRC滤波器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fs = 15.36e6;
fd = 3.84e6;
r = 0.22;
delay = 16;
b = rcosine(fd,fs,'fir/sqrt',r,delay);
%得到129阶,取15位小数,还有1位符号位,COE必须用16bit才能表示
COE = round(b*2^15);
%可以把COE的前面几个值打印出来
COE(1:10)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
可以看到COE的前面的10个值:
-3 17 23 9 -14 -25 -14 11 29 22
以-3这个系数来说,他和12位的数据相乘,积最多14位,这样,如果
在相乘结果那里就截位(15位)的话,截位之后值为0了,所以这个系数
对滤波器的输出没有任何贡献,也就是说这样设计的这个滤波器根本不是
129阶的,误差大可想而知。
所以我也比较认可,在最终加法器的后面截位(或者舍入),但是
阶数大了,那么这个加法器很庞大,为了保证速度当然也可以用流水线,
但太耗资源
甚是纠结……不知道大家是怎么做的