二元編碼與一元編碼

一言以蔽之:一元編碼的線性度比二元編碼好。

Coding

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是好的)。