foreign-architecture 小註解

今天想要用 apt-get, 結果冒出 Unable to locate package git-fame

cashchou@server: ~ $ sudo apt-get install git-fame
Reading package lists… Done
Building dependency tree
Reading state information… Done
E: Unable to locate package git-fame

為了消除  Unable to locate package, 據說要清理 source list, 很多人是因為網路的關係連不上 ubuntu, 但我確定都連得上, 所以不用改 source list. 而是可以試著 update. 結果在 apt-get update 的時候, 看到一堆類似的 warning. 像是:

W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/precise-updates/InRelease Unable to find expected entry ‘ main/binary-foreign-architecture/Packages’ in Release file (Wrong sources.list entry or malformed file)

之類的東西. 話說 main 和 Packages 中間應該是出現 architecture 沒錯, 但應該是 amd64, i386 這種 architecture, 而不是直接來個 foreign architecture 吧! 

cashchou@server: /etc/apt $ dpkg –print-architecture
amd64
cashchou@server: /etc/apt $ dpkg –print-foreign-architectures
foreign-architecture

這表示我們 server 的架構是 amd64, 如果曾不小心打成 and64, 或是 i586 打成 1586…這些都會被認為是不相容的外國建築 (foreign-architectures) . 但…這 server 上的外國建築竟然就叫做外國建築吶! 我試著把它刪除, 結果…得到一句繞口令…不能移除不是外國建築的外國建築.

cashchou@server: /etc/apt $ dpkg –remove-architecture foreign-architectures
dpkg: warning: cannot remove non-foreign architecture ‘foreign-architectures’

原來是我忘了 sudo, 加 sudo 硬是把它幹掉之後, apt-get update 就正常了.

sudo dpkg –remove-architecture foreign-architecture

但還是不能 upgrade.

cashchou@server: /etc/apt $ sudo apt-get upgrade
Reading package lists… Done
Building dependency tree
Reading state information… Done
You might want to run ‘apt-get -f install’ to correct these.
The following packages have unmet dependencies: …一大堆錯誤

據說, 此時可以試著 apt-get -f install, 但我試過這招沒用. 因為 unmet 太多了.

…一大堆錯誤
E: Unmet dependencies. Try using -f.

啊 force 也沒用啊!! 根據網路資訊 [1], 接下來的 SOP 就是先自動修復, 依序執行下面幾步. 當然 // 後面不是指令, 只是註解.

sudo apt-get update      // update your package list
sudo apt-get autoclean   // clean up any partial packages
sudo apt-get clean       // clean up the apt cache
sudo apt-get autoremove  // will clean up any unneeded dependencies.

還不行的話, 只好逐個修復. 

sudo dpkg --remove -force --force-remove-reinstreq package name

弟兄們裝了太多 package, 彼此互相影響, 我沒時間一個一個重裝, 只好留待比較急的人有緣人來處理了~~~

[REF]

  1. http://www.linuxquestions.org/questions/linux-general-1/resolve-generated-breaks-held-packages-896449/

NSAID 小註解

如果直接 Google “NSAID", 將會得到一大串 nonsteroidal anti-inflammatory drug (非類固醇抗發炎藥物) [1] 的搜尋結果, 不過我想要整理的是 Non-Secure Access ID.

根據 [2], 在 ARM 的 trusted media protection platform 當中, 有個 TZASC (Trusted Zone Address Space Controller) 400 把 SOC 的本體和 DDR 隔開來, DDR memory controller (DMC) 接在它和 DDR memory 之間. 因此, 那些 IP 可以存取哪一塊記憶體就會受到管制.

TEEnNSAID

至於圖中那些不同顏色的 IP, 代表處在不同等級的保護. 在 TEE 的字典裡, 最不安全的是 rich domain 例如 APP 們; 再來是 protected domain, 例如 virtual machine. 比較安全的是 trusted domain, 像是 TEE 的 TA (trusted Application); 最安全的是 secure domain, 例如獨立的硬體. 

那些黃色的 IP, 屬於 protected world. 例如 audio, video, HDMI (稱為 master) 有時候可能不需要嚴格保護, 所以他們有個 non-secure 的 access ID, 告訴 TZC 說我要合法存取我自己的那塊記憶體. 至於不合法的存取, 在 TZC 會被過濾掉 – 針對 ID 過濾, 或是只能讀或寫.

另外, 圖中的 GPU 是白色, 這只是舉例. GPU 也可以支援 protected world. ARM 有部分 GPU 可以從外部電路將它切到 protect mode, 另外有一些新型號 GPU 的 protect mode 是內建的.

[REF]

  1. 非類固醇消炎止痛藥- 維基百科,自由的百科全書 – Wikipedia
  2. http://www.iaik.tugraz.at/content/about_iaik/events/ETISS_INTRUST_2013/ETISS/slides/GPTEE_Public.pdf

Far Field Pickup 硬體小整理

此處的 FFP (Far Field Pickup) 專指一段距離以外的人聲的輸入, 通常 5 米之外可以算是 “far". 遠處的ˊ聲音除了變小聲之外, 還會有雜音和回音 (reverberation – 有反射, 反響, 混響…等翻譯) 的問題. 

雜音可能來自平常容易被忽略掉的冷氣機, 隔壁座位的鍵盤敲擊聲或是遠處其他人的交談, 因為主要聲音來源 (人聲) 變小聲了, 這些背景聲就相對成了嚴重干擾. 回音的來源主要則是是牆壁和家具的反射. 如果有影音設備正在播放語者的輸入, 例如用電視打 Skype 時, 回授的聲音 (人聲經由: 麥克風 -> 喇叭 -> 麥克風) 可能變得比發話的聲音更大.

既然有這麼多干擾存在, 第一步當然是選個好的硬體來收音. 在正常環境下, 近距離對著一個好的麥克風講話, 此時的聲壓 (SPL- Sound pressure level) 可以高達 95 dB. 但是到了 far field, SPL 就會下降約 50 dB, 只剩 44 dB [1]. 44 dB 扣掉噪音28 dB, 還剩下 16 dB SNR 可以做語音輸入. 

FF-Microphone

如果換一支原本就只有 55 dB SNR 的麥克風來做 far field pickup 的話, 遠端的音量再扣掉 50 SPL, SNR 就只剩下 ˋˋ44 (S) – 39 (N) = 5 (dB). 這樣要拿來做語音輸入就沒辦法了. 

badFFMicrophone

想到高 SNR, 大家直覺會想到用更高 bit 數的 ADC. 古書有云, SNR = 20log10(2bit). 以 18 bit ADC 為例, 按照公式, 理論 SNR 應該有 20log10(218) = 108 dB. 但考慮到 ADC 的 internal noise, 在 ref [1] 裡面只當它是 96 dB dynamic range (DR). 

根據 ref [2]:

DR = 20 log10(FS/rms noise

18 bit 只是 full scale (FS), 必須考量到實際電路不能理想地反映數學, 以致產生了一定程度的 noise (以 root mean square 計算). 在 ref [3] 裡面提到, 一個 input-referred noise 隨便就可以掉 2.7 bit, 而量化誤差頂多是影響半個 bit 而已.

以 AD7985 這顆 ADC [4] 為例,  它有 16 bit, 數學算出 SNR 是 96 dB, 但實際 SNR (@ 20KHz – 與頻率響應有關) 是 88.5 dB , dynamic range (不特定頻率) 是 89 dB. 因此這三個值的ˋ意義是不同的, 在 far field pickup 的考量中, dynamic range 相對比較重要, 因此 ref [1] 裡面提到的 dB 是指 dynamic range.

當我們的 ADC 有已知的 dynamic range, 那麼還有沒有辦法把再提升呢? 例如能放大一點嗎? 其實這就是 boost 的概念. 在 Windows 作業系統裡面就有 microphone boost, 可以從最小聲的 0dB, 調到最大聲的 +30dB. 

microphoneBoost

然而 “調大聲一點" 也會把噪音調大, 倒是對於抑制內部的噪音有一定效果. 看一下 ref [1] 的這張圖. 圖中的 106 dB 和 96 dB 都是指 dynamic range. 我們可以看到: boost 到一定的程度後, input referred noise 也不會再降低了. 而整個麥克風輸入的 noise floor 是麥克風和 ADC (藍色或是橘色) noise 的加總.

NoiseFloorwithADC

對 106 dB ADC 來說, boost 到 30 dB 才飽和, 而 96 dB ADC boost 到 24 dB 後也就沒有什麼效果了. 另一方面, 不管 boost 多少, 106 dB ADC 的噪音總會比 96 dB ADC 來得小.

實際上, 我們不會把 microphone boost 到極限. 原因在於人聲從 5 公尺外傳過來後, 可能只剩 44~75 dB, 而裝置上的喇叭卻可能直接以 95 dB 灌進麥克風 (例如 Amazon 的 Echo, Google 的 Home 的機構). 所以我們會選擇 SNR 更好的麥克風, dynamic range 更大的 ADC, 並搭配剛剛好的 boost, 以避免破音 – 天花板不變的狀況下, boost 愈多, ADC 的 saturation point (破音點) 愈低.

上述的硬體選擇固然可以降低噪音的干擾, 但是要進一步消除動態 (non-stationary) 的噪音, 還需要 acoustic echo canceling 和  beamforming. 這兩個部分都牽涉很多軟體的演算法. 在這篇短文中就跳過不提了.

[REF]

  1. http://www.edn.com/Pdf/ViewPdf?contentItemId=4438627
  2. http://www.analog.com/en/analog-dialogue/articles/oversampled-adc-pga-dynamic-range.html
  3. http://www.analog.com/en/analog-dialogue/articles/adc-input-noise.html
  4. http://www.analog.com/media/en/technical-documentation/data-sheets/AD7985.pdf

EME 小整理

這裡的 EME 是指 Encrypted Media Extensions, 顧名思義, 它解決加密的媒體 – 主要是視訊的播放的問題, 而且它是一個 extension, 用來擴充 web browser (瀏覽器) 的功能.  這樣一來就可以在 browser 上播有版權、加密過的電影, 而且無須綁定加解密的演算法.

話說, 我們不是用 Adobe Flash plugin 看了好多年的片子了嗎? 為何最近大家都紛紛棄 Flash 而去呢? 一般的看法 [2] 是微軟長久以來把持著桌機的平台和 IE 瀏覽器, 但並未好好支援網頁視訊這個產業, 所以早期的 Youtube 網站才會需要 Adobe Flash Player (其實是 plugin) 來彌補這個技術缺口. 當我們逐漸使用更多的 mobile device, 就應該使用更好的瀏覽器, 自然也就不需要 Adobe 了. 當然, Adobe 得罪 Steve Jobs 那件事應該也是關鍵的一擊.

根據 W3C 的規範, 播放網頁視訊 (HTML5 video) 需要瀏覽器支援 Media Source Extensions (MSE) [3] 技術. 應用程式 (app) 透過 Java script 把影片的 bit stream 送給平台上的解碼器 (decoder, 或者更廣泛的 media codec) 解碼. 再用播放器把解碼後的影片播出來. 

如果片源有 DRM (Digital rights management ) 加密, 就該 EME 上場了. 在 [4] 裡面有相當完整的描述. 正常來說, Media key 不會跟著片源一起送下來, 而是放在網路上的某個伺服器  (license key server). App 可以經由 CDM  (Content Decryption Module) 介面取回 key 來解密片源. 若是 key 會持續變動, 生命週期  (life time) 只在某一段期間  (session) 內, app 就要反覆透過 CDM 去跟 server 要不同的 key ID, 用於新的 session.

CDM 有時候不只涵蓋解密, 也可以順便解碼. 因此 [4] 說到, CDM 可以定義在 browser, OS, HW decoder, firmware decoder, 或是一個獨立的 module. 此外, 這篇文章還提到 common Encryption, clear key, 和 DASH. 有興趣的人可以讀一下 [4] 這篇.

 

[REF]

  1. https://en.wikipedia.org/wiki/Encrypted_Media_Extensions
  2. https://www.cnet.com/news/firefox-tiptoes-toward-a-world-without-adobe-flash/
  3. https://en.wikipedia.org/wiki/Media_Source_Extensions
  4. http://www.html5rocks.com/en/tutorials/eme/basics/
  5. Media/EME – MozillaWiki – Wiki – Mozilla

 

POSIX signal 小整理

做 SOC 軟體的人常常會收到 bug 的 log, 其中一個常見的類型就是 signal XXX, code YYY, fault address ZZZ. 例如:

Fatal signal 11 (SIGSEGV), code 2, fault addr 0x12345678 in tid 12345 (MyTask)

這個 log 是標準 C library 裡面的 signal.h 所定義的 [1].  參考 ref [2], 裡面有較完整的 code No. 說明, 而 ref [3] 有完整的 POSIX signal 定義和歷史沿革; Ref [4] 是把 Unix signal 做成一張表.

取常用的部分, 重新整理如下. 這些都是 core error, 所以會終止程序, 並且產生 core dump.

Signal

No.

Code

No.

Reason

SIGILL

4

ILL_ILLOPC

1

Illegal opcode.

ILL_ILLOPN

2

Illegal operand.

ILL_ILLADR

3

Illegal addressing mode.

ILL_ILLTRP

4

Illegal trap.

ILL_PRVOPC

5

Privileged opcode.

ILL_PRVREG

6

Privileged register.

ILL_COPROC

7

Coprocessor error.

ILL_BADSTK

8

Internal stack error.

SIGFPE

8

FPE_INTDIV

1

Integer divide by zero.

FPE_INTOVF

2

Integer overflow.

FPE_FLTDIV

3

Floating-point divide by zero.

FPE_FLTOVF

4

Floating-point overflow.

FPE_FLTUND

5

Floating-point underflow.

FPE_FLTRES

6

Floating-point inexact result.

FPE_FLTINV

7

Invalid floating-point operation.

FPE_FLTSUB

8

Subscript out of range.

SIGSEGV

11

SEGV_MAPERR

1

Address not mapped to object.

SEGV_ACCERR

2

Invalid permissions for mapped object.

SIGBUS

10

BUS_ADRALN

1

Invalid address alignment.

BUS_ADRERR

2

Nonexistent physical address.

BUS_OBJERR

3

Object-specific hardware error.

SIGTRAP

5

TRAP_BRKPT

1

Process breakpoint.

TRAP_TRACE

2

Process trace trap.

[REF]

  1. https://zh.wikipedia.org/wiki/Signal.h
  2. http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html
  3. http://man7.org/linux/man-pages/man7/signal.7.html
  4. http://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm