求助,关于数字下变频ddc中fir滤波器的FPGA实现
自己顶一下。
再顶顶。
需要定义Round和Overflow的规则,通常在运算过程中扩展一定的位宽,在结果处再得到实际所需精度的输出。
同意LS,相加就要扩展一位,在最后再截取相应长底,如高几位、低几位砍掉,值溢出就取正的最大数、负的最小数,小数位四舍五入,注意正负号。
谢谢耐心回复哈,我想了下,还是有些不懂,你说的那个Overflow我理解的是在一定位宽下,正负数的溢出,然后用控制电路去控制,不知道对不,那个Round就不理解了,只是在matlab的时候用过;
运算过程中扩展一定位宽这个怎么确定啊?我想把那个系数弄成可变的,写到ram中,阶数也想设计成可变的,阶数低了还好说,但是
在阶数太高的时候,累加位宽就不知道该怎么办了。
最后截取的位宽当然是越宽越好,一定的精度这里就不知道怎么取舍了。
还望再指点下,谢谢哈
非常感谢解答哈,我看了你们两位的回复,考虑了下,我理解的是在一定位宽下,正负数的溢出,然后用控制电路去控制,不知道对不,还有就是中间的位宽在滤波器阶数较高的时候怎么处理,我看有的论文上说到128阶的,但是是用DA算法做的,但是如果滤波系数可变的话,那样就不够灵活了,所以就想问下,在阶数较高的时候用直接型结构或者转置型,中间系数位宽怎么处理。谢谢哈
系数位宽根据你自己的算法需要决定啊,比如你用matlab算出一组系数,决定好多少位,verilog就用多少位,它只是把算法翻译成电路而已。比如用16位,那就都用16位了。
你想系统可变,这个也不难,比如有两组系数,你可以放在RAM或寄存器里,甚至可以调试中手动输出,设置成select方式,到时直接切换下就好,最好位宽都一致,这样实现难度就小些。
主要还是看算法本身是怎么做的。如果都是自己写的算法,就看加法的个数进行扩展,比如两个数相加就最高位扩展一位,3个或者4个数相加就最高位扩展2位,5-8个数相加就扩展3位。以此类推,简单的说,加数的个数以2为底取对数,就是应该扩展的位数。
呵呵,谢谢你的回答哈,之前还想着加一个数扩一位呢,看了你的回复之后,恍然大悟,四个同样位宽的数相加才需扩2位,8个同样位宽的数相加需扩3位。这个好像用加法树来理解更好一些
如果是简单流水线乘累加的话,用寄存器完成系数实时可变,高阶高速适合采取转置型;
如果是分布式算法结构的话,ram里面可以预先存储多组FIR滤波器抽头系数;
如果滤波器系数可变是通过自适应算法实时求得的话,你的DA算法就得开辟出一段时隙用来写ram的值。
基本就这样
学习了!
我遇到了小编一样的问题,fir设计的输入输出位宽一样,最后得到的数据有溢出问题,求帮忙指点如何解决
