资源描述
function y =dectobin(innum,N)%十进制小数转换为二进制数%输入参数为innum和N%innum为输入的十进制小数%N为指定转换后二进制的位数if (innum1)|(N = 0)%判断输入的有效性 disp(error!); return;endcount=0;tempnum=innum;record=zeros(1,N);while(N) count=count+1;%长度小于N if(countN-1) N=0;% return; end tempnum=tempnum*2;%小数转换为二进制,乘2取整 if tempnum1 record(count)=1; tempnum=tempnum-1; elseif(tempnum=1) record(count)=1; N=0;%stop loop else record(count)=0; endend y=record;将上述文件保存为dectobin.m作为接下去主程序的调用,可实现将小数转二进制。与主程序保存在同一文件夹下主程序如下clc;clear all;p=0.3,0.3,0.4; %信源符号概率symbol=a,b,c ; %信源符号,与p相对应 range=1; %区间长度plow=0; %区间低概率端点phigh=0; %区间高概率端点pp=1; %计算当前联合概率symin=input(输入符号串,s);%输入待编码任意长的信号串,只能包含a,b,cn=length(symin);for i=1:n %for循环计算各区间对应的值 if symin(i)=a plow=plow; phigh=plow+range*p(1); range=phigh-plow; pp=pp*p(1); endif symin(i)=b plow=plow+range*p(1); phigh=plow+range*p(2); range=phigh-plow; pp=pp*p(2);endif symin(i)=c plow=plow+range*p(2); phigh=plow+range*p(3); range=phigh-plow; pp=pp*p(3);endend l=ceil(log2(1/pp); %计算所需码长maout=dectobin(plow,l+10);%将区间低概率端点转换成二进制,取比l长十位%dectobin自己写的函数将小于1的小数转换成对应二进制temp=0;for i=l:l+10 %判断是否要只进不舍 if(maout(i)=1) temp=1; endendfor i=1:l if(maout(i)=0) s(1,i)=0; else s(1,i)=1; endendlma=dec2bin(bin2dec(s)+bin2dec(temp),l) %根据temp判断是否向前进位并输出
展开阅读全文