📄 arithdecode.m
字号:
%******************************************************************************************
% 算术解码(Arithmetic Decoding)
%******************************************************************************************
function yout=ArithDecode(p,CodeLen,code)
% 参考文献:
% 数据压缩原理与应用(第二版)[美]David Salomon 著 pp:71-82
% 根据输入结构体p计算频率
LowCumFreq=zeros(length(p),1);
HighCumFreq=zeros(length(p),1);
HighCumFreq(1)=p(1).Freq;
for i=2:length(p)
LowCumFreq(i)=LowCumFreq(i-1)+p(i-1).Freq;
HighCumFreq(i)=LowCumFreq(i)+p(i).Freq;
end
% 初始化
CodeLenT=CodeLen-4;
CodeT=floor(Code/10^CodeLenT); % 码字初始化
Low=0000;High=9999; % 频率寄存器初始化
% 逐个进行解码
Len=0;
while CodeT~=Low
index=floor(((CodeT-Low+1)*HighCumFreq(length(p))-1)/(High-Low+1));
% LowT,HighT分别用语暂存Low和High
LowT=Low;
HighT=High;
for i=1:length(p)
if index>=LowCumFreq(i) & index<HighCumFreq(i)
Len=Len+1;
yout(Len)=p(i).Value;
Low=LowT+(HighT-LowT+1)*(LowCumFreq(i)/HighCumFreq(length(p)));
High=LowT+(HighT-LowT+1)*(HighCumFreq(i)/HighCumFreq(length(p)))-1;
end
end
% 一旦Low和High最左边的数字相等,则将最左边的数字写入输出流
if floor(Low/1000)==floor(High/1000)
Low=(Low-floor(Low/1000)*1000)*10+0; % Low的右端移入0,High的右端移入9
High=(High-floor(High/1000)*1000)*10+9;
CodeLen=CodeLen-1;
Code=Code-floor(Code/10^CodeLen)*10^CodeLen;
CodeLenT=CodeLen-4;
CodeT=floor(Code/10^CodeLenT);
end
end
if length(num2str(yout))<HighCumFreq(length(p))
yout(Len+1:HighCumFreq(length(p)))=p(1).Value;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -