⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arithdecode.m

📁 本代码参考David《数据压缩原理与应用》P71-P82,实现了有限精度的算术编解码的源代码。
💻 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 + -