关于CIC滤波器溢出处理
最后在同事的帮助下找到了问题所在,需要对CIC中间计算结果进行溢出处理,最后才能得到想要的结果。
问题来了,我搭建的CIC滤波器参与运算的数据类型都是double的,我也统计了中间计算结果最大的也就5e18,远远没有达到运算溢出。那为什么还是要对中间运算结果进行类似定点补码运算的溢出处理呢?
而且如果进行溢出处理的阈值设置的太大或者太小也会造成信号严重失真。
比如我给的激励中最大值为0.2086,CIC为5级2倍抽取,那么就CIC的增益来说:运算中的最大值为0.2086*2^5 = 6.6656。
如果我的溢出阈值的绝对值小于6.6656,经过CIC之后的信号就会存在比较明显的失真。
另外当溢出阈值大于2^32以后,经过CIC之后的信号也会渐渐开始失真,越大失真越严重。
有没有哪位大神能解释一下为什么会有这样的现象出现,溢出阈值取多大是最合适的?
在MATLAB板块发了半天没人理,还是只有来这里寻找大神啊
如果你的cic每一级的位宽都能够满足输出最大增益的幅度,内部的溢出处理是完全没有必要的。
参考下这篇文章吧:
http://www.dsprelated.com/showcode/269.php
我用的matlab做的CIC,matlab内部运算都是双精度浮点的,肯定是不会出现溢出的问题,但是如果不做溢出处理,出来的频谱就完全不对了。但是中间值肯定有超过增益后最大幅度的,难道一定要按照增益最大幅度做溢出处理?
你用matlab的filterbuilder做一个定点的cic看看吧,你就明白了。
大神果然都出自最底层的设计师!
m是不会溢出。
定点的CIC我也做了的,如果你把位宽设置的很大,也就是溢出阈值设置很大,还是是会出现很严重的失真。
你前面给的那个链接我也看了,跟我说的这个问题应该没有什么关联,只是关于怎样节省资源的一篇文章。
可以直接回答一下我提出的问题吗?
m确实不会溢出,但是就是因为不会溢出反而带来了会导致信号失真,事实上MATLAB里面只提供了定点的CIC函数和模型,并不支持浮点CIC,我是根据CIC的结构自己写的,调试的蛮折腾的,因为单音信号以及单位脉冲信号都没有问题。
关于你说的失真,我觉得原因出在matlab的浮点数表示上。因为cic滤波器,其本质是与其原型滤波器--矩形窗滤波器(假设是M抽头)具有一样响应的,只不过CIC是其递归实现而已。这就要求积分器部分跟梳状滤波器部分不能有任何的数值误差,才能将以前的样点全部减掉。如果用浮点表示,积分器输出到达一定的大小,其浮点数的尾数应该会有舍入的动作,导致积分器输出有误差。从而导致失真。为什么定点没有问题?因为它利用了二进制补码的特点,积分器最终会有溢出,但是这个溢出,不会导致最终的结果出错,即梳状滤波器的输出是正确的。当然,对积分器的位宽不是没有要求的,积分器的位宽必须大于等于(输入位宽+(用于表示CIC M抽头原型滤波器的增益所需要的位宽))。
关于浮点数相加由于尾数部分表示不了造成舍弃确实会存在这样的问题,我也怀疑过,但是觉得双精度浮点尾数有52bit来表示,就往别的方向考虑了,这个我后面再想办法验证,确实有可能是这上面造成的。
i need your help. pdf file...
Ok, very good.
