実験一:算数符号化実験
2767 ワード
一、実験目的
算数符号化の原理を把握する.
二、実験内容
Matlabライタを用いて算数符号化を実現し、以下を含む.
1、ファイルシンボルに対して確率統計を行い、符号表を生成する.
2、ファイルを圧縮符号化する;
3、(選択)ファイルを解凍し、元のデータと解凍したデータの間に損失があるかどうかを比較する.
四、実験原理
算術符号化の符号化対象は、メッセージまたは文字シーケンスであり、その符号化構想は、メッセージまたは文字シーケンスを0と1の間の間隔(Interval)上の浮動小数点数として表すことである.
算術符号化を行う前に、文字シーケンス内の各文字の出現確率を統計し、各文字の出現確率の大きさに応じて、各文字を[0,1]区間のあるサブ区間にマッピングする必要がある.そして、再帰アルゴリズムを再利用して、文字シーケンス全体を[0,1]区間のあるIntervalにマッピングする.符号化を行う場合は、そのIntervalから任意の小数点を選択してバイナリ数に変換するだけです.
シンボルシーケンスが長ければ長いほど、そのIntervalを符号化する間隔が小さくなり、この間隔を表すために必要なバイナリビット数が多くなるほど、符号化出力の符号語が長くなる.
五、実験手順
文字列「state_tree」を算術的に符号化するには、次の手順に従います.
1、ファイルシンボル「state_tree」に対して確率統計を行い、符号表を生成する.
2、初期化時、被分割範囲の初期値は[0,1]であり、すなわち被分割範囲の下限はlow=0、上限はhigh=1であり、この範囲の長さはrange_length=high-low =1.
第一題:
結果:
文字列'state_tree'
_,a,e,r,s,t確率はそれぞれ
p =
0.100000000000000 0.100000000000000 0.300000000000000 0.100000000000000 0.100000000000000 0.300000000000000
[ 0.6, 0.7]
[ 0.67, 0.7]
[ 0.673, 0.676]
[ 0.6751, 0.676]
[ 0.67528, 0.67555]
[ 0.67528, 0.675307]
[ 0.6752989, 0.675307]
[ 0.67530295, 0.67530376]
[ 0.675303112, 0.675303355]
[ 0.6753031606, 0.6753032335]
2番目の問題:
結果:
入力値0.6753031606
s
t
a
t
e
_
t
r
e
e
感想:まず構想を設計して、それから一歩一歩分析します.出力デジタルビット数を制御し、vpa(a,n)はsymsを出力し、論理演算ができないため、16ビットフォーマットを定義しdoubleフォーマットに変換する必要がある.原題は11ビットの有効な数字なので、vpa(a,11)でnumberを設定しなければなりません.そうしないと、whileループは間違い文字列の山を無限に解くことができます.
算数符号化の原理を把握する.
二、実験内容
Matlabライタを用いて算数符号化を実現し、以下を含む.
1、ファイルシンボルに対して確率統計を行い、符号表を生成する.
2、ファイルを圧縮符号化する;
3、(選択)ファイルを解凍し、元のデータと解凍したデータの間に損失があるかどうかを比較する.
四、実験原理
算術符号化の符号化対象は、メッセージまたは文字シーケンスであり、その符号化構想は、メッセージまたは文字シーケンスを0と1の間の間隔(Interval)上の浮動小数点数として表すことである.
算術符号化を行う前に、文字シーケンス内の各文字の出現確率を統計し、各文字の出現確率の大きさに応じて、各文字を[0,1]区間のあるサブ区間にマッピングする必要がある.そして、再帰アルゴリズムを再利用して、文字シーケンス全体を[0,1]区間のあるIntervalにマッピングする.符号化を行う場合は、そのIntervalから任意の小数点を選択してバイナリ数に変換するだけです.
シンボルシーケンスが長ければ長いほど、そのIntervalを符号化する間隔が小さくなり、この間隔を表すために必要なバイナリビット数が多くなるほど、符号化出力の符号語が長くなる.
五、実験手順
文字列「state_tree」を算術的に符号化するには、次の手順に従います.
1、ファイルシンボル「state_tree」に対して確率統計を行い、符号表を生成する.
2、初期化時、被分割範囲の初期値は[0,1]であり、すなわち被分割範囲の下限はlow=0、上限はhigh=1であり、この範囲の長さはrange_length=high-low =1.
第一題:
clc;
a=['_','a','e','r','s','t'];
s=input(' ');
space=0;a1=0;e1=0;r1=0;s1=0;t1=0;
for i=1:length(s)
c=find(a==s(i));
switch c
case 1
space=space+1;
case 2
a1=a1+1;
case 3
e1=e1+1;
case 4
r1=r1+1;
case 5
s1=s1+1;
case 6
t1=t1+1;
end
end
disp('_,a,e,r,s,t ');
p=[space,a1,e1,r1,s1,t1]/length(s)
sp=cumsum(p);
low=0;high=1;range_length=high-low;
for i=1:length(s)
c=find(a==s(i));
High=sp(c);
Low=High-p(c);
next_low=low+range_length*Low;
next_high=low+range_length*High;
low=next_low;high=next_high;range_length=high-low;
disp([vpa(low,11),vpa(high,11)])
end
結果:
文字列'state_tree'
_,a,e,r,s,t確率はそれぞれ
p =
0.100000000000000 0.100000000000000 0.300000000000000 0.100000000000000 0.100000000000000 0.300000000000000
[ 0.6, 0.7]
[ 0.67, 0.7]
[ 0.673, 0.676]
[ 0.6751, 0.676]
[ 0.67528, 0.67555]
[ 0.67528, 0.675307]
[ 0.6752989, 0.675307]
[ 0.67530295, 0.67530376]
[ 0.675303112, 0.675303355]
[ 0.6753031606, 0.6753032335]
2番目の問題:
clc;
format long
p=[0.1,0.1,0.3,0.1,0.1,0.3];
s='_aerst';
high=cumsum(p);
low=high-p;
number=input(' ');
while(number)
c=find((number>=low)&(number
結果:
入力値0.6753031606
s
t
a
t
e
_
t
r
e
e
感想:まず構想を設計して、それから一歩一歩分析します.出力デジタルビット数を制御し、vpa(a,n)はsymsを出力し、論理演算ができないため、16ビットフォーマットを定義しdoubleフォーマットに変換する必要がある.原題は11ビットの有効な数字なので、vpa(a,11)でnumberを設定しなければなりません.そうしないと、whileループは間違い文字列の山を無限に解くことができます.