Logarithmic interpolation, 對數線性插值


 

為何要研究這個 ? 話說, 有需要用到一些儀表, 其實就是電阻表, 測量電阻的, 單位是歐姆 (ohm). 不過, 類似功能儀表都有很多種類, 不知道會被嚇死, 知道的可能會笑死.

首先, 看看測量 ohm 一般工具, DMM, 現在很便宜, 準確度不差, 有賴半導體和電子行業發展所恩賜, 大約RMB50元以內就可以測量 1 ohm – 20M (二百萬) ohm , 相對來說不會很差, 主要的方案就是3又1/2位的 ICL7106 或兼容的產品, 例如看看 https://datasheets.maximintegrated.com/en/ds/ICL7106-ICL7107.pdf

問題來了, 如果要測量 0.001 ohm 或者 200M 甚至 2000M (2G), 哪怎麼辦 ?

首先, 要測量 0.001 ohm, 可以試試看 milli-ohm (m-ohm) meter, 千份歐姆計, 比較好解決, DIY 毫歐姆表 (mini-ohm metre) 製作, 用 LM317, 原理有說明, 不會太差, 當你需要分辨 0.010 ohm 和 0.020 ohm 時, 勝任有餘, 準到哪裏去就天曉得, 分辨是主要的目的, 不在乎絕對準確度, 就好像眼睛分辨黑灰白容易, 但是硬凹要憑肉眼看出來多灰多白只會曠日廢時, 除非兩個不同灰度物件擺在一起比對, 一樣的意思, 不是眼睛或儀表好壞, 而是觀念不當和使用不當, 仍然是人品的問題.

然後, 要測量 2G ohm 的話, 就沒有 [很簡單] 的方法了, 一般再貴的 DMM 到 50M 以上已經無能為力, 不過還是有辦法做到的, 已經有人圖文並茂做過實驗, 看起來有點參考價值, http://www.giangrandi.ch/electronics/gigaohm/gigaohm.shtml

這樣一來, 大概問題都有解, 當然, 這個世界的工具和儀表是人設計出來的, 付錢通常可以解決, 或者得到更好更準確的工具. 不過, 加錢的比例並不是倍數增加的, 通常拾級而上, 精確一些要加10倍的錢, 再精確一些要加100倍的錢. 這樣除了國防公家科研院, 幾乎個人財力無法負擔. 所以有 [泛用儀表] 和 [精密儀表] 的市場和分野, 簡單說明, 便宜不是很精準卻堪用, 很貴比較精準只能放在實驗室用.

可是, 很多人一看到標榜 [精密儀表] 和貴貴的價格, 就會認為真的是精密. 實在是這個世界有種動物會寫字, 會賣東西, 會吹噓, 真的是否精密, 用適當的照妖鏡分辨一下, 就可以看出來. 所以賣儀表或賣產品的都會有 specification – 規格書這東西, 賣的寫出來, 買的看著比對實物, 驗收過關就是如其言 [精密儀表], 不然只能是商品說明不實, 根本不夠格.

儀表的精密程度, 需要兼顧花費和需求的平衡. 以前人看天, 白天黑夜很夠了, 所以有早出晚歸的概念, 販夫走卒, 只要用簡單的 [儀表] – 眼睛就可以, 不必要像皇帝或欽天監非得時刻看著日晷做事不可. 後來有人發現需要分辨更精細的時辰, 就發明了打更, 把早出晚歸的概念進一步強化和精讀. 再後來, 有了時鐘, 時辰再被精讀能分辨出分秒, 有了大笨鐘之類的東西, 其實大笨鐘是看不到秒數的, 試問誰會閒著看大笨鐘秒數辦事, 大概看到幾點幾分就夠了. 這也是兼顧花費和需求的平衡作法.

歐姆儀表一樣的狀況存在, 當需求是要分辨 1000M 和 10000M, 其實並不要很精準, 只需要明顯看到比對1000M / 5000M / 10000M 分別, 已經可以交差了, 沒必要抱著實驗室等級的儀表到處跑, 只需要簡單可靠的工具就可以了. 測試了幾個市售的產品, 價錢和規格都是 [泛用儀表] 的等級, 沒想到還很有取巧的商品, 估計開發 FIRMWARE 的人, 真的把對數儀表內插值的技巧完全拋開, 把對數插值的方法給忘記了, 純粹用線性內插的方法設計, 結果不倫不類, 讀數除了整點以外完全超出自述的規格在300%以上, 居然還敢寫 [高精度] 來賣. 另外一個, 基本校正做完後, 完全符合商品說明, 估計是很有功力, 做得很好的對數插值.

 

為什麼要對數, 為什麼要內插值, 這裡有一篇教科書, 簡單握要的解釋了原因和原理, 應該是中學教科書本的內容. 擷取一個畫面, 嘗試理解什麼是對數, 如何內插值.

參考原文, 學習常用對數表, 及內插法

https://www.learnmode.net/upload/flip/book/50/50b756e673379691/aa3c2d5714f3.pdf

 

有了一定的基礎, 寫軟體或FIREMARE 才不會進退失據, 才可以寫出來一個合格的東西, 不然會淪為 [快樂儀表], 不能用也不堪用, 並不是價錢的問題, 而是商品說明失實, 等同賣假貨.

這個是常用對數表, 有時間練習一下 http://www.mathland.idv.tw/scene/tables/LogarithmTables.pdf

當然, 把一個對數表寫在 FIRMWARE 內可能很費空間, 再加上插值運算的開銷, 並不是每顆 MCU 都可做到, 通常要有好的算法設計, 還有巧妙的對數表格才能成功. C 語言裡面有 Log 的函數, 對於 8 BIT MCU 是不小的開銷, 但總比亂用線性內插來得好. 對數內插和線性內插不同, 因為基數不同. 另外有人用圖像法解釋了, 為什麼對數內插和線性內插不同,

https://www.cmu.edu/biolphys/deserno/pdf/log_interpol.pdf

http://courses.ce.metu.edu.tr/wp-content/uploads/sites/45/2016/11/How-to-make-interpolation-on-logarithmic-scale.pdf

 

 

 

做個表格, 觀察log10(10^x), 當幂值 x  並非整數, 代表該數值不是1×10^x, 例如,

10^2 = 100 = 1 x 10^2

10^2.5 = 316.22 = 3.16 x 10^2

10^3 = 1000 = 1 x 10^3

因此, x 整數部分不需要考慮, 單獨處理小數的部分就可以準確查表, 每次細分10份, 表格容量增加10倍. 比方說, 1 – 10, 佔用 8bit (x255) 解析度要10 BYTES, 佔用 16bit (x65535) 解析度要20 BYTES; 換成 1.0 – 10.0 的話, 1.0 – 2.0 之間有 1.1, 1.2 … 1.9, 2.0 – 10.0 也是如此類推, 佔用空間就是 10×10 BYTES 或 10×20 BYTES. 如果查表沒有一樣的數據, 就只能用插值, 也就是插值誤差 interpolation error 的來源. 不論用什麼插值公式都會存在一定的誤差, 這個就是其中一種顯示讀值會出現的, 並非 non-linearity, 而是近似值, 注意需求和精度就可以避免或者忽略.

xiaolaba_Log10_scale_non-integer_index.pdfxiaolaba_Log10_scale_non-integer_index

實驗看看用 10BIT ADC 讀值查表, 可以明顯看到階梯的狀況是大幅度趨向小幅度, 然後下一個數量級再重複. 每個數量級內, 步級距離不同, 但是都固定的, 原因是 log10 ( 10^ (n/10) ), n = 0…10.

xiaolaba_log10_scale_ADC_calibration

-END

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.