在sigma-delta ADC的数字滤波器设计过程中,由于CIC滤波器在通带处存在一定的衰减,因此需要CIC补偿滤波器对通带进行补偿,以实现较为平稳的低纹波通带。
一般在设计sigma-delta ADC的数字降采样滤波器的过程中,通常第一级为CIC滤波器进行主要的降采样工作,第二级为CIC补偿滤波器对CIC滤波器衰减的通带进行补偿,并实现2倍的降采样,后级为半带滤波器实现较陡的过渡带和2倍的降采样。
而在实际的工程设计过程中,由于需要保证硬件实现的低成本,通常会在CIC滤波器后面先接一级半带滤波器进行2倍的降采样,然后再接CIC补偿滤波器。这样一来会使得原本在第二级阶数较高的CIC补偿滤波器阶数降低,并且工作频率为之前的一半,得以降低硬件成本,节省功耗。(将CIC滤波器放在第三级的位置,相当于CIC补偿滤波器的通带边缘的归一化频率变成将CIC补偿滤波器放在第二级时的通带边缘归一化频率的2倍,因此可大幅降低CIC补偿滤波器的阶数)
然而在Matlab中使用传统的CIC补偿滤波器设计方法,如FDAtool、fir2函数等设计方法设计将CIC补偿滤波器放在第三级位置的级联滤波器存在一定困难,无法在低成本条件下实现较好的补偿效果或较大的阻带衰减,而使用firceqrip函数便能很方便的设计一个采样频率降低一半还能实现很好补偿效果的补偿滤波器。
firceqrip(Constrained equiripple FIR filter)函数的形式如下:
B = firceqrip(n,Fo,DEV)
其中:
-n表示所设计滤波器的阶数
-Fo表示通带边缘值(归一化频率)
-DEV是一个二元向量,若DEV输入值为[d1 d2],则d1表示滤波器通带纹波,d2表示阻带纹波。
利用firceqrip设计CIC补偿滤波器的形式如下:
B = firceqrip(n,Fo,DEV,'invsinc',C)
-'invsinc'表示反正弦(inverse sinc)
-C同为一个二元向量,如果C作为实值标量或二元向量的第一个元素,firceqrip构造一个幅值响应为1/sinc(C*pi*F)的滤波器,其中F是归一化频率;如果将C作为二元向量,则反sinc形状的幅度响应将提高C(2)次幂,如果设P=C(2), firceqrip构造一个幅度响应为1/(sinc(C*pi*F)^P)的滤波器,即P=C(2)表示前级CIC滤波器的阶数。
例如,CIC滤波器的阶数为3阶,直接在CIC滤波器后直接级联一个补偿滤波器(相当于补偿滤波器的输出相对于CIC滤波器降了2倍的采样),那么C的值为
[0.5 3]
若在CIC滤波器和补偿滤波器之间需要加一个半带滤波器先降2倍采样再进行补偿(相当于补偿滤波器的输出相对于CIC滤波器降了4倍的采样),那么C的值为
[0.25 3]
例:
设计一个通带边缘为0.4,通带纹波为1e-3,阻带纹波为1e-6(阻带衰减为120dB),滤波器长度为26的5阶CIC滤波器的补偿滤波器
b = firceqrip(25,0.4,[1e-3 1e-6],'invsinc',[0.25 5]); fvtool(b)
滤波器响应如下:
通带部分:
欢迎各位大神指正~