1 基本原理#
級聯積分梳狀濾波器(Cascade Intergrator Comb)是多速率信號處理中一種十分高效的數位濾波器。CIC 濾波器具有低通濾波器的特性,同時具有以下優勢:
- 濾波器係數全為 1,設計時不需要存儲濾波器係數,節省存儲單元,同時使得濾波時只需要加法器和累加器,不需要乘法器
- 結構規則,可靈活設置插值因子而不影響整體結構
1.1 積分器#
積分器結構為

時域上可表示為
y1(n)=x(n)+y1(n−1)
頻域上可表示為
H1(ejw)=1−e−jw1
可得積分器的幅度譜為
H1(ejw)=1−e−jw1=e−jw/2(ejw/2−e−jw/2)1=2sin(2w)1
從公式可以得出積分器只有極點 $(\omega = 2k \pi,k 為整數)$ 而無零點,且對直流信號具有無限大的增益。

1.2 梳狀濾波器#
時域上可表示為
yC(n)=x(n)−x(n−RM)
其中
頻域上可表示為
HC(z)=1−z−RM
幅度譜為
HC(ejw)=1−e−jRMw=e−jRMw/2(ejRMw/2−e−jRMw/2)=2sin(2RMw)

可知梳狀濾波器只有零點,沒有極點
若 R=8、M=1,則結構為

由此可知單級 CIC 濾波器的幅度譜為
HCIC(ejw)=H1(ejw)⋅HC(ejw)=sin(2w)sin(2RMw)
當 $\mathrm {RM\omega}/2=\mathrm {k}:\pi $ 時,即 $w=\frac {2k\pi}{RM}\quad (k=\pm1,\pm2,\cdots,\pm (RM-1))$ 時可以確定零點
當 $\omega /2 =k\pi,即 \omega = 2k\pi$ 時,可得此時的幅頻響應為
HCIC(ejω)ω=2kπ=RM
從而實現了零極點相消
單級 CIC 濾波器在 $\omega =0 時 \left| H_{CIC}(e^{j\omega}) \right|=RM$,所以主瓣區間為 $\begin {bmatrix} 0,\frac {2\pi}{RM}\end {bmatrix}$,其餘都為旁瓣,第一旁瓣電平為
A1=HCIC(ejw)w=RM3π=sin(21×RM3π)sin(2RM×RM3π)=sin(2RM3π)1
因此旁瓣抑制為
A=RMsin(2RM3π)
當 $\mathrm {R}\rightarrow\infty $ 時,旁瓣抑制為
A=20lg(R→∞limA)=20lg(23π)=13.46dB
單級 CIC 濾波器的阻帶衰減為
α=−20lgb
帶內容差(通帶波紋)為
δ=20lgsin(bπ)bπ
其中 b 為帶寬比例因子
b=fs/(RM)B
單級 CIC 濾波器的旁瓣電平較高,可通過多級 CIC 級聯改善。
H(ejw)=sin(2w)sin(2RMw)N

對於 N 級 CIC 級聯濾波器,旁瓣抑制、阻帶衰減、帶內容差可表示為
⎩⎨⎧AN=13.46NdBαN=−20NlgbδN=20Nlgsin(bπ)bπ
增大 CIC 濾波器階數的話,可以增加旁瓣抑制和阻帶衰減,但是會導致帶內容差變大。因此考慮到通帶性能,通常選擇 $N\leq5$。在 N 不變的情況下,帶寬比例因子 b 越小,CIC 濾波器的通帶和阻帶特性也越好,因此 CIC 一般位於插值系統的最後一级(輸入速率最高)
2 位增長問題#
由多級濾波器的幅頻響應可知,當 $\omega \rightarrow 0$ 時
w→0limH(ejw)=w→0lim21⋅cos(w/2)2RM⋅cos(RMw/2)N=(RM)N
由此可知多級 CIC 濾波器可以引起的幅度增益的最大值為
Gmax=(RM)N
假設輸入的數據 $x (n)$ 為有符號數,位寬為 $B_{in}$,取值範圍為 $[-2^{B_{in}-1},2^{B_{in}-1}-1]$,則輸出 $y (n)$ 的最大值為
ymax=−2Bm−1⋅(RM)N
因此輸出的最大位寬為
Bout=ceil[log2∣ymax∣]+1=N⋅ceil[log2(RM)]+Bin
在 FPGA 設計時,要合理地設置輸出信號的位寬,防止數據的溢出,為了節省資源,也可以在每一级適當的進行截位
3 Matlab 設計 CIC 補償濾波器#
由於 CIC 濾波器通帶內不平坦,因此需要在前級加入 CIC 補償濾波器。Matlab 中的對應函數為 **fdesign.ciccomp,** 語法如下
d = fdesign.ciccomp
d = fdesign.ciccomp(d,nsections,rcic)
d = fdesign.ciccomp(...,spec)
h = fdesign.ciccomp(...,spec,specvalue1,specvalue2,...)
其中梳狀濾波器的延遲長度為 d,濾波器階數為 nsections,CIC 速率轉化因子為 rcic。
3.1 example#
h = fdesign.ciccomp;
set(h,NumberOfSections=5,DifferentialDelay=1);
cicComp = design(h,'equiripple',SystemObject=true);
filterAnalyzer(cicComp)