一言以蔽之:一元編碼的線性度比二元編碼好。
Binary Coding
想像一下,俄羅斯天然氣公司有三條輸氣管甲、乙、丙,流速分別為4x、2x、1x。如果要提供3x的天然氣,天然氣公司就會開啟管線乙和丙、關閉管線甲;如果要提供4x的石油,石油公司就會開啟管線甲、關閉管線乙和丙。這就是所謂的binary-weighted,如下表。
甲4x | 乙2x | 丙1x | |
---|---|---|---|
0x | ❌ | ❌ | ❌ |
1x | ❌ | ❌ | ✔️ |
2x | ❌ | ✔️ | ❌ |
3x | ❌ | ✔️ | ✔️ |
4x | ✔️ | ❌ | ❌ |
5x | ✔️ | ❌ | ✔️ |
6x | ✔️ | ✔️ | ❌ |
7x | ✔️ | ✔️ | ✔️ |
當歐洲天氣冷的時候,天然氣公司就需要提供4x較多的天然氣;但當歐洲天氣熱的時候,天然氣公司只需要提供3x較少的天然氣。如果供氣量能不穩定的話,壓力一直變來變去,天然氣管線就需要開開關關,例如4x下修為3x,管線甲從開變關、管線乙從關變開、管線丙從關變開,三道管線都要變動。每一次開關氣閥,對管線都是傷害,因此管線就容易洩漏而發生爆炸。
以上這只是一個虛構的情節,北溪天然氣管道爆炸的真正原因至今仍在調查中。
Unary Coding
在類比電路利用current mirror設計current source時,也常常使用binary-code這種方式,也就是只有三顆元件,其大小比率為4:2:1,來可以打造出0~7倍的電流源。
在電子電路中(例如耳機這種數位類比轉換器DAC),訊號忽大忽小,這些電流源就得常常切來切去,然而切換這些電流源轉態是需要時間的,導致轉態期間會有一些非理想性,4x切換到3x,就類似管線爆炸,耳機會出現爆音。
要怎麼解決耳機爆音的問題呢?最簡單的方式就是用unary coding,換成thermometer-code,七條管線,每條的口徑都一樣是1x,要3x就開三條、4x就開四條,就像下面這張表。如此一來,要上修電流源就加開一條,要下修電流源就減開一條,每次變化都是連續的(專業術語叫linearity是好的)。
甲1x | 乙1x | 丙1x | 丁1x | 戊1x | 己1x | 庚1x | |
---|---|---|---|---|---|---|---|
0x | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
1x | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔️ |
2x | ❌ | ❌ | ❌ | ❌ | ❌ | ✔️ | ✔️ |
3x | ❌ | ❌ | ❌ | ❌ | ✔️ | ✔️ | ✔️ |
4x | ❌ | ❌ | ❌ | ✔️ | ✔️ | ✔️ | ✔️ |
5x | ❌ | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
6x | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
7x | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
但這表一看,直覺就不靠譜,庚這條常年在工作,甲這條只有在旺季才開工,很不公平。於是就有人發明了dynamic element matching,比如說要3x是開三條沒錯,但不一定要開戊己庚,而是偶爾開甲丙丁、偶爾開乙戊庚……等等。
就像是理髮店的輪班制一樣,如果沒有指定設計師的話,新來的客人就由休息最久的設計師服務。如此一來,每個設計師都有機會服務所有顧客,每個顧客都有機會被不同設計師服務,這樣最平均(專業術語叫matching是好的)。