u='a';x=a;
v='b';y=b;
w='c';z=c; elseif(a==c)&(a>b),
u='a',x=a;
v='c',y=c;
w='b',z=b;
elseif(a==c)&(a
u='b';x=b;
v='a';y=a;
w='c';z=c;
else
if A(1,1)==a,u='a';x=a;
elseif A(1,1)==b,u='b';x=b;
elseif A(1,1)==c,u='c';x=c;
end
if A(1,2)==a,v='a';y=a;
elseif A(1,2)==b,v='b';y=b;
elseif A(1,2)==c,v='c';y=c;
end
if A(1,3)==a,w='a';z=a;
elseif A(1,3)==b,w='b';z=b;
elseif A(1,3)==c,w='c';z=c;
end
end %%%x,y,z按从大到小顺序存放a,b,c的值,u,v,w存对应字母
if x>=(y+z),U='0';V(1)='0';V(2)='1';W(1)='1';W(2)='1';
else U='1';V(1)='0';V(2)='0';W(1)='1';W(2)='0';
end
disp('霍夫曼编码结果:')
if u=='a',a=fliplr(U),elseif u=='b',b=fliplr(U),else c=fliplr(U),end
if v=='a',a=fliplr(V),elseif v=='b',b=fliplr(V),else c=fliplr(V),end
if w=='a',a=fliplr(W),elseif w=='b',b=fliplr(W),else c=fliplr(W),end
%%%编码步骤为:信源编码,信道编码
disp('信源符号序列:')
s='ababaacbaa' %%%信源编码
q=[];
for i=s;
if i=='a',d=a;
elseif i=='b';d=b;
else d=c;
end; q=[q,d];
end
m=[]; %%%符号变数字
for i=q;
m=[m,str2num(i)];
end
P=[1,1,1,0;0,1,1,1;1,1,0,1];G=[eye(3),P];%%%信道编码
%%%接下来的for循环在程序中多次使用,此处作用是将已编码组m每3个1组放入mk中进行运算之后存入Ck数组中,每次mk中运算结束之后清空,再进行下一组运算,而信道编码结果数组C则由C=[C,Ck]存入每组7个码。在其后的程序中,经常使用它进行每组固定个数(3或4或7)码的单独运算或比较。
mk=[];
C=[];
for i=m; %%%i逐个取m的值
mk=[mk,i];
if length(mk)==3; %%%每组取3个m值存在mk中
Ck=mk*G; %%%利用生成矩阵,计算得每组7个C值放入Ck中
Ck=Ck+randerr(1,7); %%%加信道干扰
C=[C,Ck]; %%%将每组Ck顺次排在C中
mk=[]; %%%清空mk值进入下一个循环
end
end
disp('信道编码结果如下:')
C=mod(C,2)
%%%解码步骤为信道译码,信源译码。
H=[P',eye(4)]; %%% 信道译码
Ci=[];
S=[];
N1=[];
for i=C;
Ci=[Ci,i];
if length(Ci)==7; %%%取得信道传送来码,每7位1组放入Ci
Sk=Ci*H'; %%%计算每组Ci的伴随式
Sk=mod(Sk,2); %%%二进制
for j=1:3; %%%取H的前三列与Sk转置逐次对比,若有相同项则对应Ci码加1
if Sk'==H(:,j);
Ci(j)=Ci(j)+1; end
end
N1=[N1,Ci(1:3)]; %%% 将纠错后的Ci前3个码逐次排进N1数组
Ci=[];
end
end
disp('信道译码结果如下:')
N1=mod(N1,2) %%%二进制化的N1为通过信道纠错译码后的全部码序列
M1=[];%%%数字变符号
for i=N1;
M1=[M1,num2str(i)];
end
Y=[];d=[];%%%信源译码
for i=M1;
d=[d,i];
switch d
case a,Y=[Y,'a'];d=[];
case b,Y=[Y,'b'];d=[];
case c,Y=[Y,'c'];d=[];
end
end
disp('最终译码结果如下:')
Y %%%译码输出
Matlab程序中运行时仅显示霍夫曼编码结果,信道编码结果,信道译码结果及最终结果。尝试几组不同的概率事件后验证,霍夫曼编码满足以下情况:1、三个概率互不相同的信源符号。2、三个信源符号中有两者概率相同。3、三个信源符号中有两者概率之和等于第三个概率。
译码后的结果重现了输入信源序列,但有时会省略最后几位信源符号。原因是3个一组的译码,会致使霍夫曼编码获得的码序列长度不为3的整倍数时,有码源丢失。但是只要继续输入信源符号,原未译出的符号序列就会继续顺次译出来。