總結本研究的貢獻。
第二章 壓縮法則解說
第一節 向量量化器
本研究將向量量化器應用於溫度量測,由於每小時之間的溫度差別很小,
而且上午的溫度變化固定為上升,下午的溫度變化固定為下降,因此溫度資料 之間的變動幅度很小,使用向量量化器可以達到良好的壓縮效果。
向量量化器(Vector Quantization,VQ),為脈波編碼調變系統(Pulse Code
Modulation System),如圖 2.1 所示;令感測資料(Sensor Data)為一個向量 x,令 碼字(Codeword)為一個向量 y,當傳送端(Transmitter)將感測資料 x 收集完成時,
透過傳遞代碼cj取代感測資料x;在接收端(Receiver)取得代碼 cj後,根據cj找 出對應的碼字yj。
圖2.1 脈波編碼調變系統
傳送端內部包含編碼器(Encoder),如圖 2.2 所示;在感測資料收集完成後,
使用相近程度計算函數,於碼簿(Codewords)中逐一比對各個碼字 y,並找到與
感測資料最相近的碼字之索引j,接著執行代碼計算函數,將索引 j 轉換為代碼 cj,透過傳遞簡短的代碼取代傳輸一群感測值。
(a) VQ 編碼器
(b) VQ 編碼器內部結構圖
圖2.2 (a) VQ 編碼器,(b) VQ 編碼器內部結構圖
接收端內部包含解碼器(Decoder),如圖 2.3 所示;在取得代碼 cj後,使用索
引計算函數,將代碼cj轉換為索引j,接著執行碼字搜尋函數,根據索引於碼簿 中搜尋並找出對應的碼字yj。
(a) VQ 解碼器
(b) VQ 解碼器內部結構圖
圖2.3 (a) VQ 解碼器,(b) VQ 解碼器內部結構圖
碼簿的製作過程也稱為K-Means,透過蒐集過去的感測資料,使用 K-Means
圖2.4 碼簿結構圖
執行K-Means 的步驟二為分類訓練資料,首先計算訓練資料與碼字的平方 距離(Squared Distance),一筆訓練資料分別與 M 筆碼字計算一次,計算公式:
,1, ,2, , , , ,1, ,2, , ,
1 1 1 1
平均失真(Average Distortion)為 D,計算公式:
1 1
圖2.5 執行 K-Means 的步驟一為初始化碼簿
圖2.7 執行 K-Means 的步驟三為更新碼簿
執行K-Means 的步驟四為重複執行前兩步驟,直到
P
1與P
2不再變動:
1 , 1 1, 2, 3, 4
P X P x x x x
2 , 2 5, 6, 7, 8
P X P x x x x
圖2.8 執行 K-Means 的步驟四為疊代直到收斂
第二節 餘值向量量化器
相關的資料定義符號,令感測資料為一個向量x,x 包含 N 筆感測值 x:
x x1, ,2 ,xN
x
先將x 於第一級的 VQ 中選出最相近的碼字 y1,i,將x 與 y1,i相減,即可得到餘
值r1;再將餘值r1於第二級的VQ 中選出最相近的碼字 y2,j,將第一級的餘值r1
與第二級的碼字y2,j相減,即可得到第二級的餘值r2,r2即為RVQ 的餘值;兩 級VQ 裡選擇的碼字 y1,i與y2,j相加,即為RVQ 的碼字;兩級 VQ 裡選擇的碼字 之代碼ci與cj,即為RVQ 傳遞所用之代碼。
圖2.9 RVQ 的壓縮過程,以兩級 VQ 為例
以下透過數學式子,輔助說明RVQ 的碼簿製作過程,首先將相關的資料定
義符號,感測資料為一個向量x,x 包含 N 筆感測值 x:
夫曼樹,只需要很小的一維陣列之儲存空間;編碼以0 為結尾,每種編碼具有
第三章 物聯網量測
存在於生活周遭的感測器不斷的產生資料,與此同時感測器的數量又有逐 漸增加的趨勢,因此物聯網產生的資料量將會越來越龐大,資料傳輸所消耗的 功率也會持續升高;面對資料量不斷上升的問題,本研究利用VQ 與 VLC 降低 資料傳輸量,間接減少功率消耗,並且以溫度量測與細懸浮微粒量測作為實作 的例子。
第一節 溫度量測
溫度的特性為每小時之間變化很小,且上午的變化固定為上升,下午的變 化固定為下降,以文山區某一天的溫度資料為例子,如圖3.1 所示,而且絕大多 數的日溫度變化都具有此特性,因此溫度資料之間的變動幅度很小,適合使用 向量量化器進行壓縮。
溫度量測的一種基本方式為每若干分鐘收集一次溫度值,每小時將其取平 均值,一天總共儲存24 筆小時平均溫度值,本研究的量測系統設計為一次性傳 送資料,使用者也可以隨時索取當下的溫度值,若無詢問則不主動回傳,傳遞 以一次為原則,因為不斷的回傳相似之溫度值為非必要的行為,倘若頻繁傳送 溫度值,將會造成傳輸量增加,又會導致功率消耗上升,除此之外,透過增加 傳遞資料的維度,還可以運用VQ 進行資料傳輸的壓縮,達成降低資料傳輸量與 減少功率消耗之目的,但是VQ 壓縮會產生壓縮失真,因此本研究利用 VLC 壓 縮此誤差,補足VQ 造成壓縮失真的缺點。系統的裝設流程如圖 3.2 所示,流程 分為三個步驟,以下將三個步驟分成三節討論。
圖3.2 系統裝設流程圖
第3-1.1節 產生合適於溫度資料的碼簿
使用VQ 與 VLC 降低溫度資料傳輸量的實驗,首先需要訓練資料用來輸入 K-Means 產生碼簿,如何使用訓練資料製作合適的碼簿為本節討論的重點,由
於溫度量測的實驗是在文山區進行,所以訓練資料選用文山區的溫度資料;實 驗另外還需要測試資料用來評估VQ 與 VLC 的壓縮率,測試資料選用鄰近文山 區的信義區之溫度資料,此部分於下一章再進行討論。
溫度資料取自中央氣象局的觀測資料查詢系統(CODiS) [6],查詢系統中的
日報表包含當日每小時的溫度值,因為本研究的量測系統設計為一次性傳送24 筆小時平均溫度值之資料,所以選擇日報表作為K-Means 的訓練資料;從查詢 系統取出溫度資料的方法稱為網路內容擷取(Web Scraping),又稱為資料探勘 (Data Mining),此方法是以自動化的程式向 Web 伺服器要求資料,在取得資料
後解析資料並且從中擷取出研究所需的資訊,整個擷取過程不需要人力介入,
擷取軟體的實作是使用Python 程式語言,並且參考 Ernie 的 Python 程式碼 [7]。
在使用訓練資料輸入K-Means 產生碼簿之前,首先需要完成三個步驟的前 置作業,如圖3.3 所示:
圖3.3 使用 K-Means 的前置作業
第一步驟是移除不完整的訓練資料,因為每筆訓練資料的維度大小需要一致才 能計算平方距離(Squared Distance);第二步驟是把溫度值做四捨五入取整數,因
為溫度值如果保留小數的部分,對於使用者的感受上來說並沒有差別,使用者 無法感受到溫度太細微的變化,因此溫度量測的精確度不需要太高,而且取整
圍是0 到 255,使用 byte 足夠儲存一筆整數的溫度值,另外取整數後還可以降
之30 筆平均失真再取平均值做統計,獲得碼簿大小 M 與平均失真之關係如圖 3.4 所示:
圖3.4 碼簿大小 M 與平均失真之關係
圖3.4 呈現出碼簿大小 M 越大則平均失真越低,因此增加 M 可以降低 VQ 造成的壓縮失真,間接促使第二道VLC 之壓縮程序的壓縮率上升並且降低資料 傳輸量,但是當M 大於 8 的平均失真之下降幅度會越來越低,因此以下的碼簿 壓縮之實驗選擇的碼簿大小M 為 8。
第3-1.2節 將碼簿進行無失真壓縮
儲存VQ 的碼簿勢必會消耗相當多的記憶體,由於物聯網的記憶體很小,例 如Arduino UNO 的記憶體大小只有 2048 個位元組,又或是 Arduino Mega 2560 的記憶體大小為8192 個位元組,而且在上載程式碼至 Arduino 時編譯器只允許
程式碼使用低於80%的記憶體,除此之外,還要考慮到撰寫系統的各種功能之 程式碼需要使用到的記憶體,因此在記憶體資源非常寶貴的情況下,需要解決 儲存碼簿消耗過多記憶體之問題,所以本研究將碼簿進行無失真壓縮。
從3-1.1 節的文山區溫度資料接續討論,以碼簿大小 M 為 8 為例子進行實 驗,首先設定參數N=24、T=2402 與 M=8,執行 K-Means 產生 300 個 M 為 8 的 碼簿,再從中選出平均失真最低的碼簿並取整數,如圖3.5 所示,8 筆碼字總共 包含192 筆溫度值,溫度值的分布範圍為 12 至 33 度,因此一筆溫度值至少要 使用五個位元表示與儲存,儲存包含192 筆溫度值的碼簿總共需要消耗 960 個 位元。
圖3.5 執行 K-Means 產生 M 為 8 的碼簿
為了降低儲存碼簿所消耗的記憶體,本研究將VQ 的輸入設定為溫度的差 值,並將訓練資料以差值表示後輸入K-Means 產生碼簿,再將碼簿進行 VLC 壓 縮,減少儲存碼簿的記憶體消耗量;以差值表示溫度資料的方法共分為兩個步
驟,第一步驟是直接把第一筆溫度值以若干個位元表示並且不做壓縮,第二步
將184 筆溫度的差值使用 VLC 進行壓縮,首先根據機率進行編碼,編碼結果如
本研究使用Arduino 開發嵌入式系統,開發工具為 Arduino Integrated Development Environment,又稱為 Arduino Software (IDE),Arduino Software (IDE)為類似 C 的程式語言,程式碼的設計架構分為宣告區、setup() function 與 loop() function,setup() function 負責初始化設定,其中包含設定變數與感測器模 組的腳位,此段函數只會執行一次;loop() function 則會不斷的重複執行,以本
研究為例,實驗的主要任務為收集一天的溫度資料,因此loop() function 負責每 若干分鐘收集一次溫度值,並在每一個小時取平均值後儲存,不斷的重複收集
小時平均溫度值,直到收集完一天的溫度資料後執行壓縮與傳輸。
y1 00000010101010000001100000000
y2 00000101110111110111010100011011011011011011011011000 y3 00000000000000000000000
y4 0000010101010101000011011011011000000 y5 0000010111011101010001111111100011011000000 y6 0000010111011101010001101111111111000000000 y7 0000010111011101000111100000011000000
y8 0000011101111101010100000110110110110110110000 表3.3 進行 VLC 編碼之結果
步驟一是將碼字強制轉型為字串型態並使用字串變數儲存:
String string[8] = {
"00000010101010000001100000000",
"00000101110111110111010100011011011011011011011011000", "00000000000000000000000",
"0000010101010101000011011011011000000",
"0000010111011101010001111111100011011000000", "0000010111011101010001101111111111000000000", "0000010111011101000111100000011000000",
"0000011101111101010100000110110110110110110000"};
步驟二是依照8 個位元切割字串:
String string1[4] = {"00000010", "10101000", "00011000", "00000"};
String string2[7] = {"00000101", "11011111", "01110101", "00011011", "01101101", "10110110",
"11000"};
String string3[3] = {"00000000", "00000000", "0000000"};
String string4[5] = {"00000101", "01010101", "00001101", "10110110", "00000"};
String string5[6] = {"00000101", "11011101", "01000111", "11111000", "11011000", "000"};
String string6[6] = {"00000101", "11011101", "01000110", "11111111", "11000000", "000"};
String string7[5] = {"00000101", "11011101", "00011110", "00000110", "00000"};
String string8[6] = {"00000111", "01111101", "01010000", "01101101", "10110110", "110000"};
步驟三是以0 補足最後一筆字串至 8 個位元,再將 8 個字元之字串視為無號數
的二進制並轉換成對應之整數,再使用byte 變數之陣列依照順序儲存:
static byte y1[4] = {2, 168, 24, 0};
static byte y2[7] = {5, 223, 117, 27, 109, 182, 192};
static byte y3[3] = {0, 0, 0};
static byte y4[5] = {5, 85, 13, 182, 0};
static byte y5[6] = {5, 221, 71, 248, 216, 0};
static byte y6[6] = {5, 221, 70, 255, 192, 0};
static byte y7[5] = {5, 221, 30, 6, 0};
static byte y8[6] = {7, 125, 80, 109, 182, 192};
在Arduino 內儲存經過無失真壓縮的表 3.1 之碼簿只需要消耗 42 個位元組。
第二節 細懸浮微粒量測
直徑小於或等於2.5 微米(µm)的懸浮微粒(Particulate Matter,PM)稱為細懸 浮微粒(PM2.5),PM2.5資料的特性為每小時之間的濃度感測值差別很大,以古亭
測站某兩天的PM2.5資料為例子,如圖3.7 所示:
圖3.7 古亭測站某兩天的 PM2.5資料
圖3.7 呈現出 PM2.5資料之間的變動幅度非常大,如果使用單一向量量化器進行
RVQ 與 VLC 應用於 Arduino 量測可以降低 PM2.5資料之傳輸量,在第二章
的第二節中有簡介包含兩級VQ 的 RVQ 之壓縮過程與碼簿製作之流程,進行實 驗首先需要使用訓練資料的差值透過K-Means 產生合適於 PM2.5資料的RVQ 碼 簿,由於K-Means 的操作方式在上一節已經討論過,因此本節討論的重點在於 RVQ 的壓縮過程與解壓縮過程,以包含 L 級 VQ 的 RVQ 為例,全數的 VQ 之碼
簿大小皆為M,RVQ 的壓縮過程與解壓縮過程如圖 3.8 所示。
簿大小皆為M,RVQ 的壓縮過程與解壓縮過程如圖 3.8 所示。