# <font face="fantasy">*Brief Introduction to Converters*</font> <div style="text-align: center;"> <img width="20%" src="https://hackmd.io/_uploads/ryhXRiaFp.png" > </div> <div style="text-align: center; color:black; font-family:math; font-weight: bold;"> ▲ 先附上可愛貓貓 </div> ### <font color="#008080" face="Comic sans MS">Code</font> <font face="math"> 數位訊號常以Binary Representation來表示,對於一個4 bit的二進位表示,若要把11表示成無號數的二進位,則: $$ \left ( 11 \right ) _{10} = \left ( 1011 \right ) _{2} $$ 這個等式所代表著意義是: $$ 11 = 1\cdot 2^{3} + 0\cdot 2^{2} + 1\cdot 2^{1} + 1\cdot 2^{0} $$ 4 bit的最高位元(Most Significant Bit,通常簡稱為MSB)就是$2^{3}$旁邊所乘的1,最低位元(Last Significant Bit,通常簡稱為LSB)就是$2^{0}$旁邊所乘的1。對於把類比訊號轉換成數位訊號的Converter而言,<font color="red">**輸出的數位訊號所能夠允許呈現的離散數位訊號個數**</font>,假設為N,我們就稱這個Converter有<font color="red">**N位元解析度(N bits resolution)**</font>。對於上面把類比訊號11轉換成1011,我們稱這轉換是4 bits resolution,如果類比訊號11轉換成001011,則我們稱這轉換是6 bits resolution。 對於現今的Converter Technology而言,一個Converter會有一個參考電壓V~ref~,以用來衡量輸入訊號的振幅V~in~,如果今天訊號V~in~ = V~ref~,則我們稱這個輸入訊號是<font color="red">**Full-Scale**</font>(全尺度的,通常簡稱為<font color="red">**FS**</font>)。在數位領域編碼,我們通常使用Whole Binary(整數二進位法)來表示,但是對於Converter Technology而言,Fractional Binary(小數二進位法)則是所採用的表示法。 Fractional Binary的做法很簡單,假設目前Converter是N bits Resolution,則我們只要把目前想表示的數字除以$2^{N}$後,再重新以二進位表示即可。 <div style="text-align: center;"> <img width="70%" src="https://hackmd.io/_uploads/H1fVGSe5p.png" > </div> <div style="text-align: center; color:#1E8449 ; font-family:math; font-weight: bold;"> ▲ 我們發現Fractional Binary除以2ᴺ的行為,就是在對該N bit的Full Scale做正規化(Normalized to Full Scale) </div> Fractional Binary的表示對於Converter的意義在於,今天規範的參考電壓值就是長這樣,可能只是個位數之類的。但是我今天要表達的數字卻遠高於參考電壓值,為了能夠讓額外的bit而夠被有效地表達在這Full Scale的電壓值,而不會超過Full Scale所能表達的範圍,Fractional Binary在Data Conversion中是必要的。 Converter需要能夠去支援Signed Code(有號碼)的數位訊號轉換,並非只有無號數。而Signed Code大方向可以有四種表達方式: ==**1. Sign + Magnitude:MSB表示正負號(Sign),其餘bit表示大小。**== $$0000100(+4)、1000100(-4)$$ ==**2.1's Complement(1的補數):正數轉成負數的時候,只要把0變成1,而1變成0就好。**== $$0000100(+4)、1111011(-4)$$ ==**3.Offset Binary(移碼):定義最小值為000...0,並定義最大值為111...1,中間值(零)為100...0。**== 對於7 bit的數而言,最小值為$-64$,Offset Binary表示為$0000000$;最大值為$63$,Offset Binary表示為$1111111$,而中間值,即零,Offset Binary表示為$1000000$,則: $$1000100(+4)、0111100(-4)$$ ==**4.2's Complement(2的補數):把1的補數再加上1即可,現今DSP都使用這種表示法。**== $$0000100(+4)、1111100(-4)$$ <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/HkW6CuNcT.png" > </div> <div style="text-align: center; color:#1E8449; font-family:math; font-weight: bold;">▲Offset Binary和2's Complement皆具有Wrap-Around的特性。</div></font> ### <font color="#008080" face="Comic sans MS">Ideal DAC</font> <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/ByG_BEx9T.png" > </div> <font color="#1E8449">**▲DAC(Digital-to-Analog Converter,數位類比轉換器),顧名思義就是負責把數位訊號轉換成類比訊號的轉換器。其輸入訊號有兩個,一個是參考電壓$V_{ref}$,一個是數位訊號$B_{in}$。其輸出訊號為$V_{out}$**</font> * <font face="math">$B_{in}$ 被定義為N bit的數位訊號,其關係式為 $$\begin{align}B_{in} = \left ( b_{1} , b_{2} , b_{3} , ..., b_{N} \right ) = b_{1}\cdot 2^{-1} + b_{2}\cdot 2^{-2} + b_{3}\cdot 2^{-3} +...+ b_{N}\cdot 2^{-N}\tag{0} \end{align}$$其中$b_{1}$是$B_{in}$的MSB,$b_{N}$是$B_{in}$的LSB。 * $V_{out}$ 為輸出電壓,是一種類比訊號,它等於參考電壓和數位訊號的相乘結果,即: $$\begin{align} V_{out} &= V_{ref}\cdot B_{in} \\&= V_{ref}\cdot\left ( b_{1}\cdot 2^{-1} + b_{2}\cdot 2^{-2} + b_{3}\cdot 2^{-3} +...+ b_{N}\cdot 2^{-N} \right ) \\ &= V_{ref}b_{1}2^{-1} + V_{ref}b_{2}2^{-2} +...+ V_{ref}b_{N}2^{-N} \\ &=V_{MSB} + V_{2} + V_{3} + ... + V_{N-1} + V_{LSB} \end{align}$$其中$$\begin{align} V_{MSB}&=V_{ref}b_{1}2^{-1} \tag{1} \\ V_{LSB}&=V_{ref}b_{N}2^{-N}\tag{2}\end{align} $$</font> <font face="math">其中(2)式的衍伸結果對於之後Converter的指標相當重要,這之後會再詳述。 理想的DAC在輸入數位訊號對輸出類比訊號,是具明確數值(well-defined values)的,我們可以解讀成具**1對1**的關係,但是ADC卻不是一對一的關係。 DAC的輸出電壓最大值會受到當前參考電壓$V_{ref}$和該Converter所能支援的Resolution的bit數N影響,其結果可由等差級數算出,這裡直接把(0)式的$B_{in}$設為(1111...1),即 $b_{1}=1$、$b_{2}=2$、...、$b_{N}=1$,因為(1111...1)就是$B_{in}$的最大值: $$\begin{align}V_{out} &= V_{ref}\cdot \left ( 2^{-1} + 2^{-2} + ... + 2^{-N} \right ) \\&= V_{ref}\cdot \frac{2^{-1}\left [ 1-\left ( 2^{-1} \right )^{N} \right ] }{1-\left ( 2^{-1} \right )} \\&= V_{ref}\cdot \frac{\frac{1}{2}\left [ 1-\left ( 2^{-1} \right )^{N} \right ] }{\frac{1}{2}} \\&= V_{ref}\left ( 1-2^{-N}\right )\tag{3}\end{align} $$所以我們可以得知對於一個N bit Resolution的DAC而言,其$V_{out}$的最大值為$V_{ref}\left ( 1-2^{-N}\right )$。 不論是DAC還是ADC,Converter的輸入和輸出電壓有其最小單元(但實際上也不是最小),也就是說所有Converter的電壓都會是這個最小單元的倍數。我們直接講結論,這個最小單元的電壓就是如果今天$B_{in}$為(000...001)時,即$b_{N}=1$但其他$b_{i}=0$時,其DAC轉換出來的電壓,這種電壓等價上就是從一個最小的數位訊號,即LSB,轉換過來的,我們記這個最小單元電壓為$V_{LSB}$,其表示法可從(2)式推得: $$\begin{align}V_{LSB}&=V_{ref}b_{N}2^{-N} \\ \overset{b_{N}=1}{\Longrightarrow}V_{LSB}&=V_{ref}2^{-N} \\ \Longrightarrow V_{LSB}&=\frac{V_{ref}}{2^{N}} \tag{4} \end{align} $$在很多Data Conversion理論中,$V_{LSB}$經常會正規化於$V_{ref}$,則此時我們會說這正規化完的結果(基本上都是一個小於1的分數)為**LSB**: $$V_{LSB} =\frac{V_{ref}}{2^{N}} \Longrightarrow \frac{V_{LSB}}{V_{ref}} = \frac{1}{2^{N}}\equiv LSB\tag{5}$$</font> <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/S1oHh8e56.png" > </div> <font color="#1E8449"> **▲對於一個2 bit的Ideal DAC而言,如果輸入為00,則輸出為0個LSB;如果輸入為01,則輸出為1個LSB;如果輸入為10,則輸出為2個LSB;如果輸入為11,則輸出為3個LSB。**</font> ### <font color="#008080" face="Comic sans MS">Ideal ADC</font> <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/Hkau6Igq6.png" > </div> <font color="#1E8449">**▲ADC(Analog-to-Digital Converter,類比數位轉換器),顧名思義就是負責把類比訊號轉換成數位訊號的轉換器。其輸入訊號有兩個,一個是參考電壓$V_{ref}$,一個是類比訊號$V_{in}$。其輸出訊號為數位訊號$B_{out}$**</font> <font face="math">DAC的關係式是$V_{out}=V_{ref}\cdot B_{in}$,為兩Input Signal相乘後得到Output Signal,然而ADC卻不是這樣,ADC的I/O關係式是:$$V_{in} \pm V_{x} =V_{ref}\cdot B_{out} \tag{6}$$其中$V_{x}$介於$-\frac{1}{2}V_{LSB}$到$\frac{1}{2}V_{LSB}$之間,其範圍區間剛好是一個$V_{LSB}$,即:$$-\frac{1}{2}V_{LSB} \le V_{x} \le \frac{1}{2}V_{LSB}\tag{7}$$從以上(6)/(7)式中,我們可以觀察到ADC的一些特性: * 不同於DAC,ADC的I/O關係看起來像兩Input Signal相除後得到Output Signal:$B_{out}$,但是不論是哪一種Converter,<font color="red">**$V_{ref}$和Binary Signal永遠是相乘關係**</font>,因為Binary Signal需要透過一個參考電壓才有辦法以電壓的形式出現在I/O的等價關係式上。 * ADC的輸入類比電壓訊號在特定的範圍下(理想情況下,這範圍應介於$-\frac{1}{2}V_{LSB}$到$\frac{1}{2}V_{LSB}$之間),會得到一個相對應的輸出數位訊號,如下圖所示。<div style="text-align: center;"><img width="60%" src="https://hackmd.io/_uploads/SkwCl6Gca.png" ></div><font color="#1E8449"> **▲對於一個2 bit的Ideal ADC而言,如果輸入為0個LSB,則輸出為00;如果輸入為1個LSB,則輸出為01;如果輸入為2個LSB,則輸出為10;如果輸入為3個LSB,則輸出為11。因為ADC是2 bit Resolution,所以輸出數位訊號只支援到2 bit的最大數,即11。**</font> ADC這樣的設計方式是希望其中點(midpoint)的對應能和DAC一樣,即Analog Signal$\Leftrightarrow$Digital Signal能有以下對應:$V_{LSB}\Leftrightarrow 01$、$2V_{LSB}\Leftrightarrow 10$、$3V_{LSB}\Leftrightarrow 11$。但是事與願違的是,本質為電壓的Analog Signal其值不只是$V_{LSB}$的倍數而已,電壓可以為任意實數,只要它小於$V_{ref}$。<font color="red">**因為ADC支援的bit數很小(在後期我們會比較常說這ADC的Sampling Rate很低),ADC輸出的數位訊號不能夠如實地反應原先輸入的類比訊號的值**</font>,例如今天輸入電壓如果是$0.9487V_{LSB}$和$1.2345V_{LSB}$,其經過2 bit ADC轉換出來的結果都會是01。<div style="text-align: center;"><img width="80%" src="https://hackmd.io/_uploads/H1J5e6M5T.png" ></div><font color="#1E8449"> **▲ADC的Resolution的bit數過小,將會導致如果今天把ADC產生出來的數位訊號都乘上$V_{ref}$的話(在電路上的等效行為就是再把ADC的Output Signal過一個DAC),其結果(註記為訊號2)會和當初灌入ADC的上升電壓訊號(註記為訊號1)會有一個誤差。**</font> 我們稱這誤差為<font color="red">**Quantization Error(量化誤差)**</font>,不過通常若以更加正式的講法,廣泛用於講述ADC本身的Performance的話,我們會說<font color="red">**Quantization Noise(量化雜訊)**</font>。</font> ### <font color="#008080" face="Comic sans MS">Quantization Noise</font> <font face="math"> <div style="text-align: center;"><img width="90%" src="https://hackmd.io/_uploads/rybG0TM5T.png" ></div> <font color="#1E8449">**▲ADC的Resolution的bit數過小,將會導致如果今天把ADC產生出來的數位訊號都乘上$V_{ref}$的話(在電路上的等效行為就是再把ADC的Output Signal過一個DAC),其結果(註記為訊號2)會和當初灌入ADC的上升電壓訊號(註記為訊號1)會有一個誤差,這誤差在訊號處理上而言就是一種雜訊,故以Noise命名。**</font> Quantization Noise記為$V_{Q}$,定義為經過ADC的類比訊號$V_{ADC}$和尚未經過ADC的類比訊號$V_{in}$的差值: $$V_{Q} \equiv V_{ADC} - V_{in}\tag{8}$$對於理想的ADC而言,Quantization Noise有一些細節需要注意: * Quantization Noise必須介於$-\frac{1}{2}V_{LSB}$到$\frac{1}{2}V_{LSB}$之間,<font color="red">**如果ADC超過了這個限制,我們稱此現象為量化器超載(Quantizer Overloaded)**</font>。 <div style="text-align: center;"><img width="90%" src="https://hackmd.io/_uploads/S10KY0G96.png" ></div> <font color="#1E8449">**▲如果ADC的Input Signal的兩兩Transistion Voltage之間的間隔超過一個$V_{LSB}$,則這個ADC就是Quantizer Overloaded,注意到對於2 bit ADC而言,$V_{LSB}=\frac{1}{4}V_{ref}$。**</font> * 我們從上圖也可以看到,因為對於Ideal 2 bit ADC而言,輸入的類比訊號允許有$\frac{1}{2}V_{LSB}$的加減誤差,所以對於2 bit最小值0而言,只要輸入電壓介於$-\frac{1}{2}V_{LSB}$和$\frac{1}{2}V_{LSB}$之間,ADC就能夠無誤地轉換成輸出數位訊號0;對於2 bit最大值3而言,只要輸入電壓介於$\frac{5}{2}V_{LSB}$和$\frac{7}{2}V_{LSB}$之間,ADC就能夠無誤地轉換成輸出數位訊號3。換句話說,<font color="red">**對於2 bit ADC而言,Input Signal的允許範圍為**</font>: $$\begin{align} -\frac{1}{2}V_{LSB}\le V_{in} \le \frac{7}{2}V_{LSB} \\\Longrightarrow -\frac{1}{8}V_{ref}\le V_{in} \le \frac{7}{8}V_{ref}\tag{9}\end{align} $$ <div style="text-align: center;"><img width="90%" src="https://hackmd.io/_uploads/rybG0TM5T.png" ></div> <div style="text-align: center;"><img width="90%" src="https://hackmd.io/_uploads/ryaalJQ96.png" ></div> <font color="#1E8449">**▲在討論理想ADC的訊號轉換下,並繪製Quantization Noise的波形,我們發覺Quantization Noise本身性質可以以一個鋸齒波(Sawtooth Wave)來當作其數學模型。**</font> 鋸齒波是一個週期波,它會從波的峰值開始以一個穩定的斜率(這裡我們假設其斜率為s)下降,經過一個週期後,它剛好會到達波的谷值,接下來會瞬間回到最高點,接著繼續以相同斜率下降到達最低點,周而復始<div style="text-align: center;"><img width="90%" src="https://hackmd.io/_uploads/SJEsvyXca.png" ></div><font color="#1E8449">**▲模擬Ideal ADC的Quantization Noise的Sawtooth Waveform,其時間軸制定與數學量測**</font> 我們可藉由上圖得知Quantization Noise的週期為:$$T=\frac{V_{LSB}}{s}\tag{10}$$我們可藉由上圖寫出Quantization Noise的數學表達式:$$V_{Q}=st,(-\frac{V_{LSB}}{2s} \le t \le \frac{V_{LSB}}{2s})\tag{11}$$ * 由於Sawtooth Wave的特性,<font color="red">**理想ADC的平均Quantization Noise為零!**</font> 已知某直流電壓施於同一電阻時的功率與交流電壓的平均功率相同時,此直流等效電壓是該交流電壓的方均根(root-mean-square,rms) 值,為了方便分析Quantization Noise的功耗,我們應當把Quantization Noise的方均根值給算出來,則藉由(9)式和(10)式:$$\begin{align} V_{Q,rms}&=\sqrt{\overline{ V_{Q}^{2}}}= \sqrt{\frac{1}{T}\int_{-\frac{T}{2} }^{\frac{T}{2}}(V_{Q})^{2}dt}\\&=\sqrt{\frac{1}{\frac{V_{LSB}}{s}}\int_{-\frac{V_{LSB}}{2s} }^{\frac{V_{LSB}}{2s}}(st)^{2}dt} \\&=\sqrt{\frac{s}{V_{LSB}}\cdot \frac{1}{3}s^{2}t^{3}|_{-\frac{V_{LSB}}{2s}}^{\frac{V_{LSB}}{2s}}} \\ &=\sqrt{\frac{s^{3}}{V_{LSB}}\cdot\frac{2}{3}\cdot\frac{(V_{LSB})^{3} }{8s^{3}}} \\ &=\sqrt{\frac{(V_{LSB})^{2} }{12}} \\ &=\frac{V_{LSB}}{\sqrt{12}}\tag{12} \end{align}$$因此得知<font color="red">**Quantization Noise的RMS值為$\frac{V_{LSB}}{\sqrt{12}}\tag{12}$**</font>,這是個重要的結論,日後一些理論的運算會很常使用到此結論。 * 由(12)式我們可以看到Quantization Noise的RMS值和週期無關,這意味著<font color="red">**Quantization Noise Power與Sampling Frequency無關,只與ADC本身所使用的Reference Voltage有關。**</font> </font> ### <font color="#008080" face="Comic sans MS">SNR</font> <font face="math">SNR,是rms **S**ignal-to-**N**oise **R**atio的縮寫,中譯通常翻為「訊號雜訊比/訊噪比」,其定義為: $$SNR\equiv 20\log_{}{\left ( \frac{rms\enspace value\enspace of\enspace Full-Scale\enspace Input}{rms\enspace value\enspace of\enspace Quantization\enspace Noise} \right ) }=20\log_{}{\left ( \frac{V_{in,rms} }{V_{Q,rms} } \right ) } \tag{13}$$ 假設今天灌入ADC的輸入訊號是一個Sin波,其Peak-to-Peak Value恰好為Reference Voltage,也就是說該Sin波的振幅為$V_{in}=\frac{1}{2}V_{ref}$,同時也代表該Sin波的rms值為$V_{in,rms}=\frac{1}{2\sqrt{2}}V_{ref}$,並應用(4)式的結論,則其SNR為:$$\begin{align}SNR&=20\log_{}{\left ( \frac{V_{in,rms} }{V_{Q,rms} } \right ) } \\ &=20\log_{}{\left ( \frac{\frac{V_{ref}}{2\sqrt{2}}}{\frac{V_{LSB}}{\sqrt{12} } } \right ) }\\&=20\log_{}{\left ( \frac{V_{ref}}{V_{LSB}}\cdot\frac{\sqrt{3}}{\sqrt{2}} \right ) }\\&=20\log_{}{\left ( 2^{N}\cdot\sqrt{\frac{3}{2} } \right ) }\\&=10\log_{}{\frac{3}{2} }+N\cdot 20\log_{}{2} \\&\approx\: 1.76\:+\:6.02N\:(dB)\tag{14} \end{align}$$ :::info <font color="black" style="text-align:center;">**範例:A $200mV_{pp}$ sinusoidal signal is applied to an ideal 12-bit A/D converter for which $V_{ref}=5(V)$, find the SNR of the digitized output signal.** </font> ::::::success <font color="black" >(14)式的大前提是假設今天灌進ADC的訊號是Full Scale的,但是今天範例所灌入的類比訊號小於ADC的參考電壓,也就是說$200mV<5(V)$,故我們先算出12bit ADC的FS input Signal下的SNR:</font><font color="black" >$$SNR_{FS,12bit}=1.76\:+\:6.02\cdot 12\:=74(dB)$$</font><font color="black" >我們已經算出Full Scale下的SNR,若要求出$V_{in,pp}=200mV_{pp}$的SNR,則只要把SNR的log的分子換掉就好了:$$\begin{align}SNR_{200,12bit} &= 20\log_{}{\left ( \frac{V_{200,rms}}{V_{ref,rms} } \right ) } \\&= 20\log_{}{\left ( \frac{V_{FS,rms}}{V_{ref,rms} } \right ) }-20\log_{}{\left ( V_{FS,rms} \right ) }+20\log_{}{\left ( V_{200,rms} \right ) }\\&=SNR_{FS,12bit}-20\log_{}{\left ( \frac{V_{FS,rms}}{V_{200,rms} } \right ) }\\&=SNR_{FS,12bit}-20\log_{}{\left ( \frac{V_{FS,pp}}{V_{200,pp} } \right ) }\\&=74\:-20\log_{}{\left ( \frac{5000(mV)}{200(mV)} \right ) }\\&\approx74\:-27.96\\&=46.04\:(dB)\:\#\end{align}$$</font> ::: 所以由(14)式和範例,我們可以觀察到一些概念: * 從SNR的定義上來看,Input Signal在分子而Quantization Noise在分母,如果今天<font color="red" >**SNR越大,則代表Noise的功率相對於Input Signal的功率還小,則Noise的功耗微乎其微,則大的SNR就會不會有太大的Noise,這是一個好的設計方向**</font>。<div style="text-align: center;"><img width="80%" src="https://hackmd.io/_uploads/SkoLVd456.png" ></div> <font color="#1E8449">**▲以一個10 bit ADC為例,Input Signal越大,SNR將會獲得更大的改善;當今天Input Signal達到了Full Scale,則同時SNR會達到它在這個系統的最大值。**</font> * 由(14)式的結論可以看到,<font color="red" >**當ADC的Resolution每多增加一bit,SNR就會多增加6.02(dB),所以在此又可以看到一個設計方向,如果想要讓ADC擁有高的SNR,我們必須讓它能夠支援更多的bit數**</font>。 </font> ### <font color="#008080" face="Comic sans MS">Offset Error & Gain Error ( Absolute Accuracy )</font> <font face="math">我們先前都會利用Resolution來探討ADC/DAC他對於支援數位訊號的能力,如N bit Resolution的DAC可以解析(Resolve)出$2^{N}$個不同的電位值(類比訊號)。但是**Resolution是一個沒有和別人比較的指標,既然沒有跟別人比,那我們也就不知道我們這個Converter是否是一個好的設計**,因此ADC會在Spec上有很多的細分指標,這個大方向spec叫做Accuracy(準確度),<font color="red" >**Accuracy本身就是想要去和Ideal Converter的Transfer Characteristics相比,究竟工程師所設計的Converter的Data Conversion成效為何?**</font>而Accuracy又可以再往下細分,可以分成兩大類,即Absolute Accuracy(絕對準確度)和Ralative Accuracy(相對準確度)。</font> ```graphviz digraph hierarchy { nodesep=0.1 node[color=orange,fontname=math,shape=doubleoctagon] edge [color=Blue, style=line] Accuracy->{"Absolute Accuracy" "Ralative Accuracy"} "Absolute Accuracy"->{"Offset Error" "Gain Error"} "Ralative Accuracy"->{"INL\n(Integral Nonlinearity)" "DNL\n(Differential Nonlinearity)"} } ``` <font color="#1E8449" face="math">**▲Accracy可以分成Absolute Accuracy(絕對準確度)和Ralative Accuracy(相對準確度)來探討,Absolute Accuracy所重視的是實際Converter和理想Converter的<font color="orange" >「整體曲線」</font>上的參數關係,而Relative Accuracy所重視的是實際Converter和理想Converter的<font color="orange" >「點與點之間變化」</font>上的相依關係。**</font> <font face="math">就是因為Absolute Accuracy重視在整體Data Conversion曲線的趨勢上,理想Converter和實際Converter之間的比較。所以理所當然地「偏移量(Offset)」和「增益/斜率(Gain/Slope)」的差異就會是Absolute Accuracy重視的點。我們假設有一種現實生活中不可能存在的ADC,其Resolution無限大並且Reference Voltage可以無限支援,輸入一個Analog Signal,$A$,必會輸出一個Digital Signal,$D$,這ADC的I/O關係式為:</font> $$D = Offset \:+\:Gain\cdot A\tag{15}$$ <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/B1R07qI5p.png" > </div> <font color="#1E8449" face="math">**▲對於理想的ADC而言,Offset為0,對於實際的ADC而言,Offset會是一個值,這個值就是Offset Error。理想與實際ADC的斜率會有一個落差,這個落差就是Gain Error。**</font> <font face="math">上面的圖只是方便解釋Offset Error和Gain Error的大致定義,如果要套用到實際的Converter的算法會更加地複雜,所以現在我們來分開來討論DAC和ADC實際上的Offset Error和Gain Error的算法。</font> <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/H1DY4pL96.png" > </div> <font color="#1E8449" face="math">**▲我們利用一個2 bit的DAC來當作例子,左側為理想DAC的Transfer Characteristics,右側為實際DAC的Transfer Characteristics,注意左側理想與右側實際的$V_{00}、V_{01}、V_{10}、V_{11}$皆為不同的電壓值。**</font> <font face="math">Ideal DAC的$V_{00}$必為0,Actual DAC的$V_{00}$會有一個值,這個值就會是DAC的Offset Error!在Converter的指標中,我們通常**使用LSB作為表示的單位**,只要把$V_{00}$對$V_{LSB}$做正規化($V_{00}$ is normalized to $V_{LSB}$)即可,我們把表達式從原先的2 bit DAC擴展成N bit DAC,則N bit DAC的Offset Error為:</font>$$E_{offset,DAC} = \frac{V_{000...00}}{V_{LSB}} \tag{16}$$ <font face="math">計算Gain Error時,我們會去觀察對應相同區間下的Digital Input Signal,其Analog Output Signal的上下變化的差別。一般而言,就是設定全波形,對Digital而言從00開始,到11結束;對Analog而言就是從$V_{00}$開始,到$V_{11}$結束,我們去觀察相同數位訊號區間下,$V_{00}$上升到$V_{11}$的幅度為何。注意到<font color="red" >**$V_{11}$和$V_{FS}=V_{ref}$差了一個$V_{LSB}$的電位,這是因為2 bit DAC的最大輸出電壓不是DAC本身的參考電壓,而是2 bit的最大值,即$2^{2-1}=3$所對應到的電壓值**</font>,這現象可以呼應到(3)式的結果。所以我們就可以推導出DAC的Gain Error,同樣把表達式從原先的2 bit DAC擴展成N bit DAC,並直接套用(4)式的結果:</font> $$\begin{align} E_{gain,DAC} &= \frac{1}{V_{LSB}}\cdot \left ( \triangle V_{out,actual} - \triangle V_{out,ideal} \right ) \\ &= \frac{1}{V_{LSB}}\cdot \left [ \:\left ( V_{111...11} - V_{000...00} \right ) \:-\:\left ( V_{ref} - V_{LSB} \right ) \right ] \\ &= \left ( \frac{V_{111...11} }{V_{LSB} } - \frac{V_{000...00} }{V_{LSB} } \right ) \:-\: \left ( \frac{V_{ref} }{V_{LSB} }-1 \right ) \\ &=\left ( \frac{V_{111...11} }{V_{LSB} } - \frac{V_{000...00} }{V_{LSB} } \right ) \:-\: \left ( 2^{N} -1 \right )\tag{17}\end{align} $$ <font face="math">在談ADC的Offset Error和Gain Error算法之前,我們談談ADC的轉換。不像Ideal DAC的轉換是一對一的關係,Ideal ADC的轉換是存在多對一的關係的。意思是說只要在該區間寬度為$V_{LSB}$的Analog Signal Input,都會產生相同的Digital Signal Output,這種現象叫做Quantization Uncertainty(量化的不確定性)。 <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/rJLUL0L9a.png" > </div> <font color="#1E8449" face="math">**▲今天要定義出ADC的Static Transfer Characteristic(即ADC的I/O圖上的斜線位置),若使用Code Centers的形式(左),則我們無法透過直接量測立馬就得出今天Digital Signal對應到的Analog Signal電位;若使用Code Transitions的形式(右),則我們可以直接量測Digital Signal對應到的Analog Signal電位,因為該點就在Digital Signal從上一個值跳往下一個值的瞬間發生的,比較容易觀察到,所以我們一般ADC的Transfer Function都會採用Code Transitions的形式。**</font> 我們之所以要提及Code Transitions,是因為這樣才能夠比較知道Ideal ADC的在Output為$111...11$時,所對應到的輸入電位。</font> <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/HJS_O1w5p.png" > </div> <font color="#1E8449" face="math">**▲我們利用一個2 bit的ADC來當作例子,左側為理想ADC的Transfer Characteristics,右側為實際ADC的Transfer Characteristics,注意左側理想與右側實際的$V_{00}、V_{01}、V_{10}、V_{11}$皆為不同的電壓值。**</font> <font face="math">由於Transfer Function(斜直線)採用Code Transistion的形式,所以斜直線皆從ADC的Waveform由$00$升上$01$處開始往上延伸,同時<font color="red">**定義由$00$升上$01$這個瞬間所發生的電位為$V_{01}$**</font>,是數位訊號01對應到ADC類比訊號的電位。對於Ideal ADC而言,$V_{01}$就是$0.5V_{LSB}$,然而今天換成Actual ADC的話,$V_{01}$除了$0.5V_{LSB}$本身以外,還會有一個偏移量,這個量值就是ADC的Offset Error。所以要萃取出這個Offset很簡單,只要把Actual ADC的$V_{01}$扣掉$0.5V_{LSB}$,剩餘的量就會是我們要的Offset Error。同樣地,我們也把Offset Error對$V_{LSB}$做正規化,並 把表達式從原先的2 bit ADC擴展成N bit ADC:$$\begin{align}E_{offset,ADC} &= \frac{1}{V_{LSB}} \cdot \left ( V_{000...01}-\frac{1}{2} V_{LSB} \right ) \\ &= \frac{V_{000...01}}{V_{LSB}} -\frac{1}{2} \tag{18}\end{align} $$對於Ideal ADC而言,$V_{11}$就是當數位輸出訊號從10升到11這個瞬間所發生的電壓處,他的值可以由$V_{FS}=V_{ref}$往回推導。我們知道,對於一個ideal 2 bit ADC而言,它只能夠接受$-\frac{1}{2}V_{LSB}$到$\frac{7}{2}V_{LSB}$的輸入電壓,因為2 bit ADC的$V_{ref}$為$2^{2}V_{LSB}=4V_{LSB}$,所以我們由$\frac{7}{2}V_{LSB}=2^{2}V_{LSB}-\frac{1}{2}V_{LSB}$可以推出一個結論:對於Ideal N-bit ADC而言,其最大輸入電壓為: $$V_{in,max}= V_{ref}-\frac{1}{2}V_{LSB}=\left ( 2^{N}-\frac{1}{2} \right ) V_{LSB}\tag{19}$$ 由上圖可知,Ideal ADC的$V_{11}$離$V_{in,max}$剛好差一個$V_{LSB}$的間距,故推得: $$V_{11}=V_{in,max,2bit}-V_{LSB}=\left ( 2^{2}-\frac{3}{2} \right ) V_{LSB}$$</font> <font face="math"><font color="red">**計算2 bit ADC的Gain Error,我們只會觀察在輸出為$01$到$11$之間,輸入電壓上升速率差異**</font>。則得: $$\begin{align} E_{gain,ADC} &= \frac{1}{V_{LSB}}\cdot \left ( \triangle V_{in,actual} - \triangle V_{in,ideal} \right )\\ &= \frac{1}{V_{LSB}}\cdot \left [\: \left( V_{111...11} - V_{000...01} \right )\:- \: \left( V_{FS} - 2V_{LSB} \right )\: \right ] \\ &= \left ( \frac{V_{111...11}}{V_{LSB}} - \frac{V_{000...01}}{V_{LSB}} \right ) \:-\:\left ( \frac{V_{ref}}{V_{LSB}} - 2\frac{V_{LSB}}{V_{LSB}}\right ) \\ &=\left ( \frac{V_{111...11}}{V_{LSB}} - \frac{V_{000...01}}{V_{LSB}} \right ) \:-\:\left ( \:2^{N} - 2\:\right )\tag{20} \end{align} $$ </font><font face="math">以上的Offset Error和Gain Error皆屬Absolute Accuracy的範疇,所討論出來的東西是**大方向**的,接下來要介紹討論曲線小方向特性的指標,Relative Accuracy。</font></font> ### <font color="#008080" face="Comic sans MS">INL & DNL ( Relative Accuracy )</font> <font face="math"><font color="red">**在討論Relative Accuracy時,我們首先要移除Offset Error和Gain Error所造成的影響,如果本身曲線就有這樣Error,我們一定要先把它們移除後再進行量測與計算**</font>。Relative Accuracy可以分成INL Error和DNL Error,以下分別介紹。另外基於避免Quantization Uncertainty所造成的量測誤差,**同樣以Code Transitions的位置來作為ADC中類比電位訊號的取樣點**,並同樣以$V_{LSB}$作為正規化的對象,我們首先先來談DNL。 <font color="#0000FF">**微分非線性誤差**</font>(<font color="#0000FF">**D**</font>ifferential <font color="#0000FF">**N**</font>on<font color="#0000FF">**L**</font>inearity Error,常用簡稱:<font color="#0000FF">**DNL**</font>),DNL是**相鄰兩個類比訊號的電壓差(即$V_{n}-V_{n-1}$)和理想電壓差(即$V_{LSB}$)之間的誤差**,其數學定義為:$$DNL_{n}\equiv\frac{V_{n}-V_{n-1}}{V_{LSB}} -1 \qquad\forall (n\in Z^{+}:正整數,大於0的整數) \tag{21}$$ 對於n=0的情形,一般書籍會把它當作是未定義,因為0沒有上一個數字,但也有一派認為不應該是無定義,而是直接定義為0,同時我也採信這個說法,即: $$DNL_{0}\equiv 0\tag{22}$$$DNL_{n}$叫做DNL at the n code(數位訊號n所對應到的DNL),且n是一個非負整數,**$DNL_{n}$表現的意義就是說,今天數位訊號$n、n-1$分別對應到的類比訊號$V_{n}、V_{n-1}$,$V_{n}$距離上一個類比訊號$V_{n-1}$相差的電位差,和$V_{LSB}$相比會差多少**。 理想狀況下,對於任意的$V_{n}$,它和上一個類比訊號$V_{n-1}$一定會相差一個$V_{LSB}$,使得理想Converter的所有$DNL_{n}$必為0。 <font color="#0000FF">**積分非線性誤差**</font>(<font color="#0000FF">**I**</font>ntegral <font color="#0000FF">**N**</font>on<font color="#0000FF">**L**</font>inearity Error,常用簡稱:<font color="#0000FF">**INL**</font>),INL是**同一個數位訊號所對應到的類比訊號的電位(即$V_{n}$)和理想的類比訊號電位(即$V_{n,ideal}$)的差值**,其數學定義為:$$INL_{n}\equiv \frac{V_{n}-V_{n,ideal}}{V_{LSB}} \qquad \forall (n\in N:非負整數、自然數)\tag{23} $$由於理想的類比訊號電位$V_{n}$之間必定差一個$V_{LSB}$,並且對於Ideal ADC而言,以Code Transitions作為Transfer Function的話,其$V_{0,ideal}=-0.5V_{LSB}$,並且因為INL和DNL已經改善完Offset Error和Gain Error,所以對於實際ADC和理想ADC而言,$V_{0}=V_{0,ideal}$,但為了更加general一點,我們對於理想的類比訊號電位可以表示為:$$V_{n,ideal}=V_{0}+nV_{LSB}=V_{0,ideal}+nV_{LSB}\tag{24}$$則INL可以改寫為:$$\begin{align}INL_{n}&=\frac{V_{n}-V_{n,ideal}}{V_{LSB}}\\&=\frac{V_{n}-V_{0}-nV_{LSB}}{V_{LSB}}\\&=\frac{V_{n}-V_{0}}{V_{LSB}}-n\tag{25}\end{align}$$ 從這之中,我們可以看到DNL和INL之間在數學式上有一些關聯性: $$\begin{align}INL_{n}&=\frac{V_{n}-V_{0}}{V_{LSB}}-n\\&=\frac{V_{n}-V_{n-1}+V_{n-1}-V_{n-2}+V_{n-2}-...-V_{1}+V_{1}-V_{0}}{V_{LSB}}-n\\&=\frac{V_{n}-V_{n-1}}{V_{LSB}}+\frac{V_{n-1}-V_{n-2}}{V_{LSB}}+...+\frac{V_{1}-V_{0}}{V_{LSB}}-n \\ &=\left ( \frac{V_{n}-V_{n-1}}{V_{LSB}}-1 \right ) +\left ( \frac{V_{n-1}-V_{n-2}}{V_{LSB}} -1\right ) +...+\left ( \frac{V_{1}-V_{0}}{V_{LSB}}-1 \right ) \\ &=DNL_{n}+DNL_{n-1}+DNL_{n-2}+...+DNL_{1} \\&=\sum_{i=0}^{n} DNL_{i} \tag{26} \end{align}$$所以我們可以看到**INL本身就是DNL累積下的結果**。我們可以透過簡易的DAC例子來更加視覺化INL和DNL的意義: <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/SkaPhC5c6.png" > </div> <font color="#1E8449" face="math">**▲左邊是理想狀況下的2 bit DAC的轉換情形,右邊是實際狀況下的2 bit DAC的轉換情形,在做INL和DNL計算時,我們會把Offset Error和Gain Error先給校正掉,但此處為了方便解釋,我僅把Offset Error拿掉,也就是說把實際DAC的所有$V_{n}$都先減掉$V_{0}=0.5V_{LSB}$。**</font> <div style="text-align: center;"> <img width="100%" src="https://hackmd.io/_uploads/SJBcpA5cp.png" > </div> <font color="#1E8449" face="math">**▲若只拔除掉Offset Error,則$DNL_{00}$和$INL_{00}$都會是0LSB,但坦白說我這樣是錯誤示範,因為最正確的INL/DNL算法還是要把Offset Error和Gain Error一同拿掉。**</font> 如果今天連Gain Error都拔除掉,則我們會發覺$INL_{11}$(最大數位訊號的INL)也會是0,以下是其例子: :::info <font color="black" style="text-align:center;">**範例:3-bit D/A converter, $V_{ref}=4(V)$, with following analog values which is converted from digital values [000, 001, 010, 011, 100, 101, 110, 111]: [0.011, 0.507, 1.002, 1.501, 1.996, 2.495, 2.996, 3.491], please find the DNL error and INL error of this 3 bit DAC.**</font> <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/SkeMNWpcp.png" > </div> ::::::success <font face="math" color="black">我們先算出這個DAC如果要轉換一個LSB,所能夠得到的類比訊號,即$V_{LSB}$:$$V_{LSB}=\frac{V_{REF} }{2^{N} }= \frac{4(V)}{2^{3}}=0.5(V) $$我們提及過很多次了,<font color="red">**在進行INL和DNL的計算時,我們首先要算出Offset Error和Gain Error,並將他們從Data Conversion的數據中移除掉。**</font> 我們觀察到當DAC把最小的數位訊號000轉換成類比訊號時,如果今天是理想情況,轉換出來的電位應該要是0(V),但實際上轉換出來卻是$0.011(V)=11(mV)$,因此我們可以把這電位(又可稱為Offset Voltage)對$V_{LSB}$做正規化,就會直接得到Offset Error,也就是(16)式的結論: $$E_{offset,DAC} = \frac{V_{000...00}}{V_{LSB}}=\frac{0.011(V)}{0.5(V)}=0.022(LSB) $$同樣地,對於整個類比訊號的上限$V_{111}$和下限$V_{000}$,我們可以藉由比較實際DAC的差值和理想DAC的差值,來算出Gain Error,也就是(17)式的結論: $$\begin{align}E_{gain,DAC}&=\left ( \frac{V_{111...11} }{V_{LSB} } - \frac{V_{000...00} }{V_{LSB} } \right ) \:-\: \left ( 2^{N} -1 \right )\\ &=\left ( \frac{3.491(V)}{0.5(V)} - \frac{0.011(V)}{0.5(V)} \right ) \:-\: \left ( 2^{3} -1 \right ) \\ &= -0.04(LSB)\end{align}$$我們藉由把所有數據減掉$E_{offset,DAC}$來移除Offset Error,並藉由把數據減掉$\frac{i}{2_{N}-1}$比例的$E_{gain,DAC}$來移除Gain Error: $$\frac{V_{i,new}}{V_{LSB}}=\frac{V_{i,old}}{V_{LSB}}-E_{offset}-\frac{i}{2^{N}-1}E_{gain} \tag{27}$$這樣的校正方式會使得類比訊號上限和下限的INL都會是0,因為移除掉Gain Error後,上限和下限的類比訊號值會完全貼合理想的上限和下限,此時利用Endpoint Method來讓DAC上限和下限之間有一條直線,這條直線就是DAC的Transfer Function,以下是把Offset Error和Gain Error移除後的數據:$$\begin{align}\frac{V_{0,new}}{V_{LSB}} &=\frac{0.011(V)}{0.5(V)}-0.022-\frac{0}{2^{3}-1}\cdot \left ( –0.04 \right ) =0(LSB) \\ \frac{V_{1,new} }{V_{LSB}}&=\frac{0.507(V)}{0.5(V)}-0.022-\frac{1}{2^{3}-1}\cdot \left ( –0.04 \right ) \approx 0.9977(LSB) \\ \frac{V_{2,new}}{V_{LSB}}&=\frac{1.002(V)}{0.5(V)}-0.022-\frac{2}{2^{3}-1}\cdot \left ( –0.04 \right ) \approx 1.9934(LSB) \\ \frac{V_{3,new} }{V_{LSB}}&=\frac{1.501(V)}{0.5(V)}-0.022-\frac{3}{2^{3}-1}\cdot \left ( –0.04 \right ) \approx 2.9971(LSB) \\ \frac{V_{4,new} }{V_{LSB}}&=\frac{1.996(V)}{0.5(V)}-0.022-\frac{4}{2^{3}-1}\cdot \left ( –0.04 \right ) \approx 3.9929(LSB) \\ \frac{V_{5,new} }{V_{LSB}}&=\frac{2.495(V)}{0.5(V)}-0.022-\frac{5}{2^{3}-1}\cdot \left ( -0.04 \right ) \approx 4.9966(LSB) \\ \frac{V_{6,new} }{V_{LSB}}&=\frac{2.996(V)}{0.5(V)}-0.022-\frac{6}{2^{3}-1}\cdot \left ( -0.04 \right ) \approx 6.0043(LSB) \\ \frac{V_{7,new} }{V_{LSB}}&=\frac{3.491(V)}{0.5(V)}-0.022-\frac{7}{2^{3}-1}\cdot \left ( -0.04 \right ) = 7(LSB) \end{align}$$所以,我們得到了一個校正Error過後的DAC的數據: <div style="text-align: center;"> <img width="60%" src="https://hackmd.io/_uploads/rkc345yia.png" > </div> 藉由定義,我們可以先用相鄰電位差求出DNL,再累加DNL來求出INL,也可以直接扣掉理想電壓值來求出INL,主要是看哪種取法比較直觀和方便: <div style="font-size:13px; text-align:center; " > |$V_{001}-V_{000}$|$V_{010}-V_{001}$|$V_{011}-V_{010}$ |$V_{100}-V_{011}$|$V_{101}-V_{100}$|$V_{110}-V_{101}$|$V_{111}-V_{110}$| | - | -------- | -------- | -------- | -------- |-------- | -------- | |0.9977|0.9957|1.0037|0.9958|1.0037|1.0077|0.9957| </div> <div style="font-size:14px; text-align:center; color:purple " > |$DNL_{000}$|$DNL_{001}$|$DNL_{010}$|$DNL_{011}$|$DNL_{100}$|$DNL_{101}$|$DNL_{110}$|$DNL_{111}$| | - | - | - | - | - |- | - | - | |$0$|$-0.0023$|$-0.0043$|$0.0037$|$-0.0042$|$0.0037$|$0.0077$|$-0.0043$| </div> <div style="font-size:14px; text-align:center; color:green " > |$INL_{000}$|$INL_{001}$|$INL_{010}$|$INL_{011}$|$INL_{100}$|$INL_{101}$|$INL_{110}$|$INL_{111}$| | - | - | - | - | - |- | - | - | |$0$|$-0.0023$|$-0.0066$|$-0.0029$|$-0.0071$|$-0.0034$|$0.0043$|$0$| </div> <div style="text-align: left;"> <img width="50%" src="https://hackmd.io/_uploads/r1bGPjkjT.png" ><img width="50%" src="https://hackmd.io/_uploads/H1UAhjyjp.png" > <img width="50%" src="https://hackmd.io/_uploads/S1vNaiJo6.png"><img width="50%" src="https://hackmd.io/_uploads/HyjYTiyj6.png"> </div> <font color="#1E8449" face="math">**▲DNL、INL、校正Error前的DAC、校正Error後的DAC的圖表比較,可以發現0 Code的DNL和INL都為0,這是基於定義的緣故,而最大code的INL也為0,這則是基於把Error校正後的緣故。**</font></font> ::: </font> ### <font color="#008080" face="Comic sans MS">Sampling Theorem</font> ### <font color="#008080" face="Comic sans MS">參考資料</font> <font face="math">0.ALL ABOUT ELECTRONICS, Successive Approximation ADC Explained(**這個人真的很屌**) https://www.youtube.com/watch?v=h0CGtr4SC9s</font> <font face="math">1.Barley Li,ADC 的基本概念 - 量化雜訊與訊噪比 https://forum.digikey.com/t/adc/29973</font> <font face="math">2.高速類比數位轉換器(ADC) INL/DNL參數的測量 https://reurl.cc/YVE28a</font> <font face="math">3.ADC参数之 INL和DNL https://zhuanlan.zhihu.com/p/306857241</font> <font face="math">4.INL/DNL Measurements for High-Speed Analog-to-Digital Converters (ADCs) https://lurl.cc/AGMouK</font> <font face="math" color="#800080">**5.(強烈推薦)News123, ADC特性參數筆記 - Offset Error、Gain Error、INL、DNL** https://reurl.cc/rrEnYO</font> <font face="math" color="#800080">**6.(強烈推薦)News123, ADC特性參數筆記 - SNR、SNDR、ENOB、SFDR** https://reurl.cc/RWYQ2e</font> <font face="math" color="#800080">**7.國立陽明交通大學,何振綱碩士,洪浩喬教授指導,每秒五十億次取樣六位元類比數位與數位類比轉換器之設計,碩士論文** https://ir.nctu.edu.tw/bitstream/11536/80649/1/251801.pdf </font> <font face="math" color=black>8.關於DNL的定義,我參考這裡 https://inst.eecs.berkeley.edu/~ee247/fa08/files07/lectures/L12_f08.pdf </font> <font face="math" color=black>9.成大資工 https://wiki.csie.ncku.edu.tw/embedded/ADC#stm32f4xx-onchip-adc-%E4%BB%8B%E7%B4%B9 </font> <font face="math" color=black>10.黃騰毅教授,訊號與系統OCW https://www.youtube.com/watch?v=KqweFuHcSVc&list=PLX6FA3vfNTfChkbNQGxVPrIsvkC_DwNV6 </font>