日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息论中用c语言进行算术编码,信息论与编码之算术编码

發布時間:2023/12/8 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息论中用c语言进行算术编码,信息论与编码之算术编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

例5-10 有4個符號a,b,c,d構成簡單序列S=(a,b,d,a),各符號及其對應概率如下表5-9所列。

符號

符號概率pi

符號累積概率Pj

a

0.100(1/2)

0.000

b

0.010(1/4)

0.100

c

0.001(1/8)

0.110

d

0.001(1/8)

0.111

答:算術編碼的基本思想是:將輸入序列的各個符號按照出現的概率映像到0~1之間數字區域內,該區域表示成可以改變精度的二進制小數,其中出現頻率越低的數據利用精度越高的小數表示。算術壓縮算法中兩個基本的要素為源數據出現的頻率以及對應的編碼區間。其中,源數據出現的頻率決定該算法的壓縮效果,同時也決定編碼過程中源數據對應的區間范圍,而編碼區間則決定算術壓縮算法的最終輸出數據。

對“a,b,d,a”進行算術編碼的步驟如下:

1)初始化時,被分割范圍的初始值是[0,1),即被分割范圍的下限為low=0,上限為 high =1,該范圍的長度為range_length=high-low =1。

2)根據算術編碼的公式:C(s,r)=C(S)+A(S)Pr

A(S,r)=A(S)Pr

其中采用積累概率P(S)表示碼字C(S),符號概率p(S)表示區間狀態A(S)。因為是二進制符號組成的序列,所以r=0,1。

將數據帶入公式求得C(a,b,d,a)編碼后的碼字為01011,Matlab程序具體實現過程如下所示

K=menu('choose whether you want to enter?a character or a number','enter character','enter number')

if K==1;

str=input('請輸入編碼的字符串:');

l=0;r=1;d=1;

p=[0.5 0.25 0.125 0.125];

n=length(str);

disp('a b c d ')

disp(num2str(p))

for i=1:n

switch str(i)

case 'a'

m=1;

case 'b'

m=2;

case 'c'

m=3;

case 'd'

m=4;

otherwise

error('請不要輸入其它字符!');

end

%判斷字符

pl=0;pr=0;

for j=1:(m-1 )

pl=pl+p(j);

end

for j=1:m

pr=pr+p(j);

end

%概率統計

l=l+d*pl;

r=l+d*(pr-pl);

strl=strcat('輸入第',int2str(i),'符號的間隔左右邊界:');

disp(strl);

format long

disp(l);disp(r);

d=r-l;

end %for循環借結束

result=l

else K==2

LP1(1)=0;

p=[0.5 0.25 0.125 0.125];

for i=1:3

LP1(i+1)=LP1(i)+p(i);

end

result=input('please enter the number');

while(result<0.975? )

if (result>=0 & result<0.5)

disp('a')

elseif (result>=0.5 &result<0.75)

disp('b')

elseif (result>=0.75 &result<0.875)

disp('c')

elseif (result>=0.875 &result<0.975)

disp('d')

end

for j=1:4

if (result>=LP1(j) &result

result=(result-LP1(j))/(LP1(j+1)-LP1(j))

break;

else continue;

end

end

end %while

disp('!')

disp('解碼結束')

end %if else

編碼結果如下:請輸入編碼的字符串:'abda'

a b c d

0.5??????? 0.25?????? 0.125?????? 0.125

輸入第1符號的間隔左右邊界:

0

0.50000000000000

輸入第2符號的間隔左右邊界:

0.25000000000000

0.37500000000000

輸入第3符號的間隔左右邊界:

0.35937500000000

0.37500000000000

輸入第4符號的間隔左右邊界:

0.35937500000000

0.36718750000000

result =

0.35937500000000

總結

以上是生活随笔為你收集整理的信息论中用c语言进行算术编码,信息论与编码之算术编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。