2nd CIFF ΔΣADC模擬與實作(中)
本文將繼續上篇模擬的理想2nd CIFF ΔΣADC,搭建Sinc Filter與FIR Filter,來達成Decimation與濾波,最後觀察輸出訊號的時域與頻域表現。
1.Sinc Filter
Sinc filter的頻率響應與Sinc函數相同,由主瓣與旁瓣組成,瓣與瓣之間的notch不具任何增益,由於ΔΣADC在高頻區域具有高能量的量化雜訊,可以透過Sinc filter先初步對量化雜訊進行濾波。
由於傅立葉變換具有對偶性(duality),因此 Sinc filter 在時域的結構,其實對應到頻域中的矩形響應(rectangular response);反過來說,理想低通濾波器在頻率域的「磚牆型(brick-wall)」響應,在時間域則對應到 Sinc 函數。
由impulse response看的出Sinc filter基本上就是對輸入訊號進行滑動平均(moving average),故其電路設計相對其他濾波器而言簡單,把輸入的離散訊號經過不同延遲後並加總即可構成Sinc filter。
這裡舉例一個Sinc1 filter,其結構與權重為1的4tap FIR相同,每個離散輸入x(n)都會經過一個延遲後再與其他tap加總,形成Sinc filter的輸出y(n),若輸入訊號為0或1,那輸出訊號則有5種可能,分別為0,1,2,3,4。
\[\Large H(z)=\frac{Y(z)}{X(z)} = 1 + z^{-1} + z^{-2} + z^{-3}\]2.CIC Filter
CIC filter(Cascaded Integrator-Comb)是一種實現Sinc Filter的結構,主要是將Sinc filter拆成積分器與微分器來實現,並加入降採樣電路,同時具備高階拓展能力,是一種實現Sinc Filter的高效方法。
一階 CIC filter 先將輸入訊號送入積分器進行累加,再經由降採樣電路在固定的 decimation factor 間隔下取樣保留部分積分結果,最後透過梳狀結構的微分器將取樣值做相減運算,以抵消積分造成的低頻累積並完成低通濾波與降採樣處理。
輸入序列x(n)是由前級ΔΣ調製器輸出,意味著積分器的操作頻率(Fs)與調製器的取樣頻率相同,接著透過一個降採樣電路,其降採比例為N,故經過N次的Ts才會觸發一次取樣,而後面的微分器則是以Fs/N的頻率進行操作,與降採電路共用相同操作頻率Fs/N。
列出CIC filter的轉移函數
\[\Large H(z) = \frac{1 - z^{-N}}{1 - z^{-1}}\]若假設降採樣率N=4則
\[\Large H(z) = \frac{1 - z^{-4}}{1 - z^{-1}}\]為了要證明此CIC filter與上一章的Sinc Filter具有相同轉移函數,將1-z^-4進行展開獲得
\[\Large H(z) = \frac{1 - z^{-1} + z^{-1} - z^{-2} + z^{-2} - z^{-3} + z^{-3} - z^{-4}}{1 - z^{-1}}\]把分子項提出1-z^-1
\[\Large H(z) = \frac{(1 - z^{-1})(1 + z^{-1} + z^{-2} + z^{-3})}{1 - z^{-1}}\]約分後可得
\[\Large H(z) = 1 + z^{-1} + z^{-2} + z^{-3}\]確實與上一章的Sinc Filter具有相同轉移函數,若在降採率N較高的情況下CIC結構可以大幅度的減少暫存器的數量。
Note: ST的”AN4990 Application note”有從Sinc filter電路演化到CIC filter的詳盡過程與數學推導。
3. 3rd CIC Filter
上述僅為一階的CIC Filter,其頻率響應為Sinc(wt),若想進一步抑制高頻成分,可以設計更高階數的Sinc來抑制量化雜訊。
三階的Sinc filter(Sinc3 filter),其頻率響應為Sinc^3(wt),同樣可以透過CIC的結構來達成,將積分器與微分器分別串接三級即可組成3rd CIC Filter。
由於積分器與微分器都是線性系統,若三級串接則轉移函式可以寫成
\[\Large H(z) = \frac{(1 - z^{-4})^{3}}{(1 - z^{-1})^{3}} = (\frac{1 - z^{-4}}{1 - z^{-1}})^{3}\]也等效於三個Sinc filter串聯的轉移函式
使用Verilog-A來描述3rd CIC Filter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//IDEAL_FILTER_CIC_3RD Verilog-A from BensonTai
`include "constants.vams"
`include "disciplines.vams"
module IDEAL_FILTER_CIC_3RD (VIN,CLK,VOUT);
input VIN,CLK;
output VOUT;
electrical VIN,CLK,VOUT;
// =========================Parameters
parameter integer OSR = 128;
// =========================Internal states
integer sample_count;
integer INTG1,INTG2,INTG3;
integer DIFF1,DIFF1_D;
integer DIFF2,DIFF2_D;
integer DIFF3,DIFF3_D;
real COMB_OUT;
analog begin
@(cross(V(CLK)-0.5, +1)) begin
// =========================Integrator
INTG1 = INTG1 + (V(VIN)>0.5 ? 1:0);
INTG2 = INTG2 + INTG1;
INTG3 = INTG3 + INTG2;
// =========================Down sampler
sample_count = sample_count + 1;
if (sample_count == OSR) begin
sample_count = 0;
// =========================Differentiator
DIFF2 = INTG3-DIFF1_D;
DIFF1_D=INTG3;
DIFF3 = DIFF2 - DIFF2_D;
DIFF2_D = DIFF2;
COMB_OUT = DIFF3 - DIFF3_D;
DIFF3_D = DIFF3;
end
end
V(VOUT) <+ transition(COMB_OUT/OSR/OSR/OSR, 0, 1p);
end
endmodule
程式大致上是描述出各個節點的數值就差不多了,值得注意的是最後輸出COMB_OUT除上OSR^3是為了要把輸出的電壓正規化到0到1之間。
4.FIR Filter
另外設計一個截止頻率為0.4*Nyqist rate的51tap FIR,進一步抑制CIC filter高頻部分的雜訊,在這邊筆者盡可能的壓低帶寬,用高OSR來換取ΔΣADC的解析度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//IDEAL_FILTER_FIR Verilog-A from BensonTai
`include "constants.vams"
`include "disciplines.vams"
module IDEAL_FILTER_FIR (CLK, IN, OUT);
input CLK;
input IN;
output OUT;
electrical CLK, IN, OUT;
// =========================
// FIR coefficients
// =========================
parameter integer N = 51;
parameter real h[0:50] = {
-1.249047e-18, -1.056236e-03, -7.693410e-04, 9.563232e-04, 1.976083e-03,
-2.620691e-18, -3.265385e-03, -2.568520e-03, 3.234633e-03, 6.519908e-03,
-6.211702e-18, -9.825739e-03, -7.365685e-03, 8.881349e-03, 1.725606e-02,
-1.065044e-17, -2.478427e-02, -1.841767e-02, 2.229953e-02, 4.422244e-02,
-1.424145e-17, -7.146981e-02, -6.043033e-02, 9.231763e-02, 3.020273e-01,
4.005234e-01, 3.020273e-01, 9.231763e-02, -6.043033e-02, -7.146981e-02,
-1.424145e-17, 4.422244e-02, 2.229953e-02, -1.841767e-02, -2.478427e-02,
-1.065044e-17, 1.725606e-02, 8.881349e-03, -7.365685e-03, -9.825739e-03,
-6.211702e-18, 6.519908e-03, 3.234633e-03, -2.568520e-03, -3.265385e-03,
-2.620691e-18, 1.976083e-03, 9.563232e-04, -7.693410e-04, -1.056236e-03,
-1.249047e-18};
// =========================
// delay line
// =========================
real x_buf[0:50];
integer i;
real acc;
// =========================
// clocked behavior
// =========================
analog begin
@(cross(V(CLK) - 0.5, +1)) begin
// shift register
for (i = 50; i > 0; i = i - 1) begin
x_buf[i] = x_buf[i-1];
end
// new sample
x_buf[0] = V(IN);
// FIR accumulation
acc = 0.0;
for (i = 0; i < N; i = i + 1) begin
acc = acc + h[i] * x_buf[i];
end
end
V(OUT) <+ acc;
end
endmodule
5.Simulation Result
把調製器的輸出接上3rd CIC filter後再接上FIR filter形成ΔΣADC,同時對三個輸出QOUT, QCIC, QFIR進行分析。
參數設定 :
這裡新增了T_START與T_STOP,T_START確保能讓FFT工具在FIR filter穩態後進行分析,而T_STOP是由相關取樣算出來的週期加上T_START所定義。
執行模擬後可以獲得
放大時域的時間軸,並且對頻譜的頻率取對數 :
在時域上面的紅線是調製器的輸出QOUT,綠線是CIC filter的輸出,CIC filter在三個周期內就能使輸出穩定,而藍線是FIR filter的輸出,若51tap的FIR則需要51個週期才能使輸出穩定,其響應較慢。
若對QOUT ,QCIC, QFIR分別取FFT,得到右邊的頻譜圖,頻譜中的線條顏色與個自時域顏色相同。紅線是調製器的輸出,在高頻部分具有高功率的量化雜訊,經過CIC filter後可以獲得綠線,由於CIC filter進行了降採樣,所以在156.25kHz(20M/128)上有一個由Sinc^3產生的notch,也就是降採樣後的輸出頻率。
頻譜上的藍線則是FIR filter的輸出,截止頻率設計在31.25kHz(156.25k/2 * 0.4),在31.25kHz至78.125kHz具有顯著的抑制能力,表示ΔΣADC的操作範圍於31.25kHz以下,可以換算OSR為320倍,設計上算是偏高的過取樣率。
Note: 繪製Spectrum的時候需滿足相關取樣,並使用Blackman window最小化頻譜洩漏,尤其是ΔΣ這種Noise shaping ADC更需注意。
最後使用FFT工具計算輸出的ENOB,積分帶寬上限設定為78.125kHz(Nyquist rate),CIC filter輸出約為13.8bit,而FIR filter則為18.0bit,體現了ΔΣADC透過過採樣與雜訊整形所帶來的解析度提升。








