Hardware Image Signal Pipeline Implementation Tricks

從物理光波模型、透鏡設計、CMOS光電轉換、ISP、Codec、Transition Protocol、Display Driver、Display SoC 都略懂一些,根據一般 IC 的設計原則,整理一些常識性的分享。

 

1. Line Buffer

line buffer 直接關係到硬體的大小,若非得以,我們盡量不會進入 DDR 處理,因為 IO 速度會影響 frame rate。並且在許多行動裝置上也沒有 DDR 可用,故在硬體方面節省 line buffer 的技巧是重要的。

  • filter kernel 不須是正方形的 (但通常還是需要對稱)。由於影像是水平 scan line 讀入,通常高度越小,可以直接影響 line buffer 的個數。觀察許多 ISP 的 artifact 皆為長方形。
  • 縮圖讓一個同樣大小的 kernel 獲得更大的影響範圍。在某些情況可以 trade-off 降低 line buffer 的數量,儘管(垂直)縮圖本身也是需要 line buffer 的。但是空間複雜度可以以 log_{2}{N} 速度降低,最多僅需要兩條 line buffer 即可完成 pyramid 架構。
  • 水平方向的 convolution 僅需消耗數個 register 即可,無須 line buffer;若是數值統計上需要 smooth data,可以考慮盡量在水平方向發展。
  • kernel 不須是連續的。可以跳著取樣(如 Bayer pattern),抑或是幾種類似隨機圖案間隔取樣( random pattern )以消除跳著取樣的 artifact。因此需要儲存的 pixel 也會減少許多。
  • 能在 Bayer pattern 解的問題就提早處理,因為 demosaic 之後可能會變成 3 倍大(  RGB )。同理在 YCbCr 也是如此。
  • Read only 的 line buffer 可以盡量共用。這邊可能需要調整 pipeline module 的順序。

2. Fix-Point & bits

硬體實作上用固定長度的整數來表示有限精度的浮點數,而在軟體實作上,某些情況轉換為 fix point 也不失為一個加速手段,尤其是整數運算有 bit shift 的優勢,一個良好架構的 fix point program 自然是比 floating point 快上許多。

  • 對要給人看的東西而言,人眼影響不大的 channel 其 bit 數或 pixels 可以粗分一些。如 YUV 中的 UV domain(YUV420);或高亮度 pixel 的 quantization (HDR)。
  • 有些低階 FPGA 的 DSP 乘法器其輸入 bit 數約在 18 ~ 19 bits,超過的時候可能改為查表較省。

3. Lookup Table

  • 查表 index 盡量為 2 的冪次方為佳。方便硬體直接對應。
  • 平行輸入的查表也需要複數個表格,才能同時查表出數字。

4. DDR ( Frame-buffer )

進入DDR便是跟時間的競賽,DDR必須要 address、charge、access 的步驟,隨著 IO 次數的增加, latency 也會越久,直接影響到 FPS。設計良好的 DDR 對應方式是重要的。

  • DDR其實並不是 random access 的;一樣是 sequential line segment access,巧妙安排我們的 block 資料成連續的 line section方便在一個 T 存取,而非隨機取樣多個 T,這在 CG 硬體領域常用在 texture mapping  (Tiled ordering)。
  • 有時進出 DDR 的 latency 被當成一種 sync 的手段。

5. Timing

  • 時間<=>空間,最貴的東西,在整個 pipeline 不允許發生 timing 問題
  • 雖然可以使用 clock domain 解,但邏輯上必須要先行得通,並且代價通常很高
  • 演算法實現最常被卡關的地方...

Leave a Reply

Your email address will not be published. Required fields are marked *