資訊理論的第三個作業……終於是完完全全自己寫的**了!留下了不學無術的淚水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之間的乙個區間,其長度等於該序列的概率,在該區間內選擇乙個代表性的小數 最少位數 轉化為二進位製作為實際的編碼輸出。序列中的每個新增元素都要用來縮短這個區間。訊息序列中元素越多,所得到的區間就越小,區間越小,就需要更多的數字來表示這個區間...