Matlab 算術編碼

2021-10-01 11:07:55 字數 1379 閱讀 4768

資訊理論的第三個作業……終於是完完全全自己寫的**了!留下了不學無術的淚水qaq

%算術編碼程式

%輸入:信源u、信源分布p、需要進行編碼的序列s

%輸入備註:輸入格式:a=[0 1] p = [1/4 3/4] s = [1 0 1 1 1]

%輸出:該序列的算術編碼s

%輸出備註:以序列所在區間的左端點值作為所求序列的碼字

%輸入備註:如果信源符號是字元型,輸入方式為:a = 'ab'; s = 'bbbababb';

%其實符號是數字可以寫成陣列也可以寫成字元型別,matlab都支援運算,如:a = '01' s = '1101'

%序列比較長的時候寫成字元型別比較方便

function [s] = suanshu(a,p,s)

%設定初始值,序列為空,左端點為0,右端點為1,長度為1

slow(1)=0;

shigh(1)=1;

range=shigh(1)-slow(1);

%計算信源符號的數目和所需要編碼的序列長度

n = length(a);

m = length(s);

%計算信源a中每個元素對應的左右端點low high

low(1) = 0;

for i = 1:n

if i == 1

high(i) = p(i);

else

low(i) = p(i-1) + low(i-1);

high(i) = low(i) + p(i);

endend%開始遍歷所要編碼序列中的每個元素

for i = 1:m

%尋找與當前元素相等的信源符號,把索引放入num中

num = find(a==s(i));

%開始計算新增新符號後的序列左右端點newslow和newshigh

slow(i+1) = slow(i) + range*low(num);

shigh(i+1) = slow(i) + range*high(num);

range = shigh(i+1) - slow(i+1);

end%最後以序列所在區間的左端點值作為所求序列的碼字

%即輸出最後計算得到的slow(m+1)

s = slow(m+1);

執行結果示例:

>> a = '01'

a =01

>> p = [1/8 7/8]

p = 0.1250 0.8750

>> s = '11111110111110'

s =11111110111110

>> suanshu(a,p,s)

ans =

0.6312

算術編碼 解碼以及matlab實現

m 2 二元資料p 0.80.2 需要自己給出x 1010 需要編碼的序列,發行方想要傳送的原始序列 low 0 區間下界 high 1 區間上界 for i 1 length x if x i 0 high high high low p 2 elseif x i 1 low low high l...

算術編碼 浮點

在給定符號集和符號概率的情況下,算術編碼可以給出接近最優的編碼結果,相比於霍夫曼編碼來說更接近夏農極限。對於helloworld來說,共7種符號 符號概率如下 如下 include stdafx.h include include include includeusing namespace std...

c 算術編碼

熵編碼 算術編碼 算術編碼把整個信源序列表示為實數線上的0到1之間的乙個區間,其長度等於該序列的概率,在該區間內選擇乙個代表性的小數 最少位數 轉化為二進位製作為實際的編碼輸出。序列中的每個新增元素都要用來縮短這個區間。訊息序列中元素越多,所得到的區間就越小,區間越小,就需要更多的數字來表示這個區間...