诚心求教——算术编码解码
我调用下面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>=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>=p(i).low & index<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>=2<br> varargout{2}=x;<br>end[此贴子已经被作者于2006-5-21 14:42:57编辑过]
<P>一种改进了的算术编码!<br>不错,<br>很值得大家研究研究一下!</P>
[此贴子已经被作者于2006-5-16 15:47:49编辑过]
<P>happy教授最近很忙吗?还有哪些高手能帮我看看程序!!</P>
回复:(jingang159)求教happy教授——算术编码解码问...
代码是否正确没功夫看<BR>你可以找一个算术编码的代码比较验证一下<BR><BR>前面我好像给过一个,你搜索一下<BR><BR>用主程序调用是什么意思啊?调用函数你不会?晕<BR><BR>另外问问题的时候不要指名道姓谁来回答,这样即使有知道的人看到了也不一定回答你 <P>不是不会调用,可能是我的子程序有问题吧,调用后MATLAB死掉了,动不了!!~~~</P> 楼主的程序中ArithCode(x,p),中x,p分别代表什么?回复 7楼 zhenyulu18 的帖子
这个估计得自己看书了,LZ好久都没有来了!《数据压缩原理与应用(第二版)》[美]David Salomon 著 pp:71-82 请Happy教授给我一个算术编码的代码,好不好?
页:
[1]