使用CIC抽取滤波器时的FIR滤波器补偿器


Answers:


3

您的问题没有一个唯一的答案:与任何滤波器设计问题一样,这取决于您的要求。正如在Wikipedia页面上很好地描述的那样,CIC(级联积分器梳状)滤波器由许多对积分器和梳齿级组成(因此得名)。每个积分梳齿级都有一个总的脉冲响应,它相当于一个箱式滤波器(即具有矩形频率响应的滤波器)。棚车的频率(幅值)响应具有类似于Sinc函数的形状,因此整个CIC结构将具有一个幅值响应,看起来像对某些功率的Sinc函数,其中是积分梳齿级数。NNN

但是,没有很多旋钮可以根据特定于应用程序的要求进行调整。您可以调整CIC结构的抽取/内插比,梳状延迟和级数,但仍然会遇到类似Sinc的频率响应,这并不是特别理想,因为它在整个SIC上并不平坦主瓣,具有较高的旁瓣。因此,通常在CIC之后是另一个“清理”整体响应的过滤器。

难题:您需要在应用程序中定义在CIC之后放置的任何补偿滤波器中的需求。真正重要的是整体级联的响应,您将根据应用程序的需求对其进行约束。没有“最合适”的特定过滤器。


在您撰写“具有矩形频率响应的一个”的地方,您的意思不是“具有矩形脉冲响应的一个吗?”
nibot 2012年

你是对的。感谢您指出错误。
杰森R

4

有一个类似的问题,https://dsp.stackexchange.com/a/1551/306,以下是另一篇文章的答案的子集。

通常,为了补偿CIC滤波器,可以使用CIC滤波器响应的反函数来生成补偿滤波器。CIC的回应为2

H(ω)=|sin(ωD/2)sin(ωM/2)|N

其中D是微分延迟,M是抽取率,N是滤波器阶数(级联滤波器的数量)。逆可指定为

H(ω)=|sin(ωM/2)sin(ωD/2)|N

一旦有了补偿滤波器的频率响应,我们就可以简单地选择所需的FIR滤波器的长度。FIR的长度取决于应用程序。显然,FIR滤波器越长,补偿越好。

以下是这种直接补偿的曲线图。

以下是创建频率响应和图的Python代码。

从numpy导入sin,abs,pi导入numpy作为np导入pylab

D = 1; M = 7; N = 3

Hfunc = lambda w : abs( (sin((w*M)/2)) / (sin((w*D)/2.)) )**N
HfuncC = lambda w : abs( (sin((w*D)/2.)) / (sin((w*M)/2.)) )**N

w = np.arange(1024) * pi/1024

G = (M*D)**N
H = np.array(map(Hfunc, w))
Hc = np.array(map(HfuncC, w))
# only use the inverse (compensation) roughly to the first null.
Hc[int(1024*pi/M/2):] = 1e-8
plot(w, 20*log10(H/G))
plot(w, 20*log10(Hc*G))
grid('on')

sinc1

1 Altera,“了解CIC补偿滤波器”

2 R. Lyons,“了解数字信号处理”,第二版,新泽西州上萨德尔河Prentice Hall,2004年


您在补偿滤波器中显示了所需的频率响应...但是如何获得滤波器系数,以产生近似于该响应的滤波器?我认为这就是问题所在。
nibot 2012年

0

ISOP(内插二阶多项式)通常用于补偿CIC通带下垂。

该过滤器的Matlab响应可使用以下方式显示:

alpha = 0.01 ;
b     = [1, alpha, -alpha] ; 
h     = mfilt.firsrc(1,1,b)
freqz( b )

为您的需求选择Alpha是棘手的部分。最坏的情况是瓶坯蛮力仿真,以0.001的增量在0到0.5之间循环,找到导致最佳下垂补偿的alpha。将最佳下垂补偿定义为通带边缘的最小误差。

为了提高效率,通常将此滤波器以较低的数据速率放置在插值CIC之前和抽取CIC之后。


有关此补偿方法的另一种解释/说明,请参见dsp.stackexchange.com/questions/19584/…
Dan Boschen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.