資訊理論與編碼實驗報告——MATLAB實現算術編碼
阿新 • • 發佈:2021-02-03
一、實驗內容
試用MATLAB編制算術編碼演算法實現程式。
二、實驗過程
2.1 算術編碼實現原理
算術編碼的演算法思想如下:
(1)對一組信源符號按照符號的概率從大到小排序,將[0,1)設為當前分析區間。按信源符號的概率序列在當前分析區間劃分比例間隔。
(2)檢索“輸入訊息序列”,鎖定當前訊息符號(初次檢索的話就是第一個訊息符號)。找到當前符號在當前分析區間的比例間隔,將此間隔作為新的當前分析區間。並把當前分析區間的起點(即左端點)指示的數“補加”到編碼輸出數裡。當前訊息符號指標後移。
(3)仍然按照信源符號的概率序列在當前分析區間劃分比例間隔。然後重複第二步。直到“輸入訊息序列”檢索完畢為止。
(4)最後的編碼輸出數就是編碼好的資料。
解碼是編碼的逆過程,知道了編碼過程後,解碼過程的操作過程也就清晰了。解碼時,通過判斷哪一個符號能擁有我們已編碼的訊息落在的空間來找出訊息中的上界。在編碼的逆過程中,逐漸迴圈操作下去,便得到訊息的準確譯碼。
2.2 算術編譯碼流程圖
2.3 算術編譯碼源程式
clear all; clc; in='00000011111010101'; %輸入碼字 pr=[0.5 0.5]; %各字元出現的概率 temp=[0.0 0.5 1.0]; orignal=temp; n=length(in); %編碼 for i=1:n width=temp(3)-temp(1); w=temp(1); switch in(i) case '0' m=1; case '1' m=2; end temp(1)=w+orignal(m)*width; temp(3)=w+orignal(m+1)*width; left=temp(1); right=temp(3); fprintf('left=%.6f',left); fprintf(' '); fprintf('right=%.6f\n',right); end encode=(temp(1)+temp(3))/2 %解碼 decode=['0']; for i=1:n fprintf('tmp=%.6f\n',encode); if(encode>=orignal(1)& encode<orignal(2)) decode(i)='0'; t=1; elseif(encode>=orignal(2)& encode<orignal(3)) decode(i)='1'; t=2; end encode=(encode-orignal(t)); encode=encode/pr(t); end decode
三、實驗結果
3.1 編碼過程及結果
3.1 譯碼過程及結果
從結果圖中可以看出:“00000011111010101”在0、1出現概率各為0.5的情況下,編碼後為0.0153,譯碼後的結果與前面相符,可知此算術編譯碼正確。
四、總結與展望
本次實驗我學會運用MATLAB實現資訊理論與編碼中的算術編譯碼,通過前期課程的學習,掌握了算術編碼的原理及整體過程。實驗實現的過程又讓我再次回顧了理論知識,也讓我更加的理解算術編碼的核心思想,就是不斷地確定區間、不斷地縮小上下限的過程。後續在科研中,若有用到這方面的知識,我會立即回憶起在這門課中學到的知識,回顧實驗中的探索過程,並繼續深入研究下去。