声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2579|回复: 7

[编程技巧] 诚心求教——算术编码解码

[复制链接]
发表于 2006-5-16 11:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我调用下面3个子程序后没有结果,请大虾帮我看看下面3个子程序有没有问题,如果没问题,如何用一个主程序来调用它们来完成算术编码和解码。不是不会调用,是调用后,MATLAB马上死掉,动不了了。<br><br>程序如下:<br><br>%******************************************************************************************<br>%                              算术编码(Arithmetic Coding)<br>%******************************************************************************************<br>function varargout=ArithCode(x,p)<br>% 参考文献:<br>%     数据压缩原理与应用(第二版)[美]David Salomon 著 pp:71-82<br>Len=length(x);<br>CodeLen=0; % 初试码长设为0<br>Code=0; % 初试化编码结果<br>Low=0+(1-0)*p(1).low;<br>High=0+(1-0)*p(1).high;<br>% 对Low和High重定标<br>Low=floor(Low*10^4);<br>High=floor(High*10^4);<br>% 逐个进行编码<br>for i=2:Len<br>      for j=1:length(p)<br>        if x(i)==p(j).value<br>          Num=p(j).num;<br>        end<br>      end<br>    % 还原为小数<br>    Low=Low/10^4;<br>    if High==9999<br>         High=1;<br>    else<br>       High=High/10^4;<br>    end<br>    % LowT,HighT分别用语暂存Low和High<br>    LowT=Low;<br>    HighT=High;<br>    % Low和High更新<br>    Low=LowT+(HighT-LowT)*p(Num).low;<br>    High=LowT+(HighT-LowT)*p(Num).high;<br>    Low=floor(Low*10^4);<br>    High=floor(High*10^4-1);<br>    % 一旦Low和High最左边的数字相等,则将最左边的数字写入输出流<br>    if floor(Low/1000)==floor(High/1000)<br>         CodeLen=CodeLen+1;% 码长加1<br>         Code=Code*10+floor(Low/1000);<br>         % Low的右端移入0,High的右端移入9<br>         Low=(Low-floor(Low/1000)*1000)*10+0;<br>         High=(High-floor(High/1000)*1000)*10+9+1;<br>             end<br>end<br>CodeLen=CodeLen+4; % 加上最终四位码子作为总的码长<br>Code=Code*10^4+Low; % 编码最后4位<br>varargout{1}=CodeLen;<br>if nargout&gt;=2<br>      varargout{2}=Code;<br>end<br><br><br><br>%******************************************************************************************<br>%                           计算符号的概率,累计频率以及频率范围<br>%******************************************************************************************<br>function varargout=CumFreq(x)<br>xt=x; % 暂存原始数据<br>maxx=99; % 定义最大值,避免重复扫描<br>count1=1;count2=1;<br>Len=length(x);<br>% 定义结构体数组用于存储序号,符号,该符号的概率以及累计频率的上下限<br>p=struct('num',[],'value',[],'probability',[],'low',[],'high',[]);<br>for i=1:Len<br>      if xt(i)==maxx<br>            i=i+1;<br>      else<br>        for j=i+1:Len<br>               if xt(j)==x(i)<br>                    count1=count1+1; % 频率加1<br>                    xt(j)=maxx;<br>               end<br>        end<br>        p(count2).num=count2;<br>        p(count2).value=x(i);<br>        p(count2).probability=count1/Len;<br>        count2=count2+1;<br>        count1=1;<br>      end<br>end<br>% 对应的频率范围<br>p(1).high=1.0<br>p(1).low=p(1).probability;<br>for i=2:length(p)<br>     p(i).high=p(i-1).low;<br>     p(i).low=p(i-1).low-p(i).probability;<br>end<br>varargout{1}=p;  <br><br><br><br>%******************************************************************************************<br>%                                算术解码(Arithmetic Decoding)<br>%******************************************************************************************<br>function varargout=ArithDecode(p,CodeLen,Code)<br>% 参考文献:<br>%              数据压缩原理与应用(第二版)[美]David Salomon 著 pp:71-82<br>Len=0;<br>Low=0000;High=9999;<br>CodeLenT=CodeLen-4;<br>CodeT=floor(Code/10^CodeLenT); % 码字初始化<br>%  逐个进行解码<br>while CodeT~=Low<br>       index=((CodeT-Low+1)*10-1)/(High-Low+1);<br>       index=floor(index)/10;<br>       for i=1:length(p)  <br>           if index&gt;=p(i).low &amp; index&lt;p(i).high<br>               Len=Len+1;<br>               x(Len)=p(i).value;<br>               Low=Low+(High-Low+1)*p(i).low;<br>               High=Low+(High-Low+1)*p(i).high;<br>           end<br>       end<br>       % 一旦Low和High最左边的数字相等,则将最左边的数字写入输出流<br>       if floor(Low/1000)==floor(High/1000)<br>            % Low的右端移入0,High的右端移入9<br>            Low=(Low-floor(Low/1000)*1000)*10+0;<br>            High=(High-floor(High/1000)*1000)*10+9+1;<br>            CodeLen=CodeLen-1;<br>            Code=Code-floor(Low/1000)*10^CodeLen;<br>            CodeLenT=CodeLenT-1;<br>            CodeT=floor(Code/10^CodeLenT);<br>       end<br>end<br>varargout{1}=Len;<br>if nargout&gt;=2<br>      varargout{2}=x;<br>end
[此贴子已经被作者于2006-5-21 14:42:57编辑过]

回复
分享到:

使用道具 举报

发表于 2006-5-16 15:46 | 显示全部楼层
<P>一种改进了的算术编码!<br>不错,<br>很值得大家研究研究一下!</P>
[此贴子已经被作者于2006-5-16 15:47:49编辑过]

 楼主| 发表于 2006-5-17 22:47 | 显示全部楼层
<P>happy教授最近很忙吗?还有哪些高手能帮我看看程序!!</P>
发表于 2006-5-20 14:02 | 显示全部楼层

回复:(jingang159)求教happy教授——算术编码解码问...

代码是否正确没功夫看<BR>你可以找一个算术编码的代码比较验证一下<BR><BR>前面我好像给过一个,你搜索一下<BR><BR>用主程序调用是什么意思啊?调用函数你不会?晕<BR><BR>另外问问题的时候不要指名道姓谁来回答,这样即使有知道的人看到了也不一定回答你
 楼主| 发表于 2006-5-21 14:51 | 显示全部楼层
<P>不是不会调用,可能是我的子程序有问题吧,调用后MATLAB死掉了,动不了!!~~~</P>
发表于 2009-1-20 14:57 | 显示全部楼层
楼主的程序中ArithCode(x,p),中x,p分别代表什么?
发表于 2009-1-20 22:45 | 显示全部楼层

回复 7楼 zhenyulu18 的帖子

这个估计得自己看书了,LZ好久都没有来了!
《数据压缩原理与应用(第二版)》[美]David Salomon 著 pp:71-82
发表于 2009-5-8 17:06 | 显示全部楼层
请Happy教授给我一个算术编码的代码,好不好?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-26 08:18 , Processed in 0.067153 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表