用matlab实现香农码和费诺码.docx
- 文档编号:26483711
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:10
- 大小:78.77KB
用matlab实现香农码和费诺码.docx
《用matlab实现香农码和费诺码.docx》由会员分享,可在线阅读,更多相关《用matlab实现香农码和费诺码.docx(10页珍藏版)》请在冰豆网上搜索。
用matlab实现香农码和费诺码
信息论与编码
―大作业
班级:
电信091班
姓名:
***
学号:
**********
一、用matlab实现Shannon编码
1、编码主程序
n=input('输入单符号信源个数n=')
p=zeros(1,n);
fori=1:
n
p(1,i)=input('输入单符号信源个数:
');
end
ifsum(p)<1||sum(p)>1
error('不符合概率分布无效')
end
y=fliplr(sort(p));%大到小排序
D=zeros(n,4);%生成n*4的零矩阵
D(:
1)=y';%把y赋给零矩阵的第一列
fori=2:
n
D(1,2)=0;%令第一行第二列的元素为0
D(i,2)=D(i-1,1)+D(i-1,2);%求累加概率
end
fori=1:
n
D(i,3)=-log2(D(i,1));%求第三列的元素
D(i,4)=ceil(D(i,3));%求第四列的元素,对D(i,3)向无穷方向取最小正整数
end
D
A=D(:
2)';%取出D中第二列元素
B=D(:
4)';%取出D中第四列元素
forj=1:
n
C=binary(A(j),B(j))%生成码字
End
2、含有的子函数binary
function[C]=binary(A,B)%对累加概率求二进制的函数
C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作
temp=A;%temp赋初值
fori=1:
B%累加概率转化为二进制,循环求二进制的每一位,A控制生成二进制的位数
temp=temp*2;
iftemp>1
temp=temp-1;
C(1,i)=1;
else
C(1,i)=0;
end
end
3、注意事项
正式运行前应该把binary.m文件放到matlab的工作空间中去,以保证主函数能成功调用。
图一子函数存储示意图
4、例题展示
将课本第五章例题4键入入运行,可得结果和课本完全一致。
输入信源符号个数n=7
n=
7
输入信源符号概率:
0.2
输入信源符号概率:
0.19
输入信源符号概率:
0.18
输入信源符号概率:
0.17
输入信源符号概率:
0.15
输入信源符号概率:
0.1
输入信源符号概率:
0.01
D=
0.200002.32193.0000
0.19000.20002.39593.0000
0.18000.39002.47393.0000
0.17000.57002.55643.0000
0.15000.74002.73703.0000
0.10000.89003.32194.0000
0.01000.99006.64397.0000
C=
000
C=
001
C=
011
C=
100
C=
101
C=
1110
C=
1111110
二、用matlab实现Feno编码
1、编码主程序
clearall;
N=input('N=');%输入信源符号的个数
s=0;l=0;H=0;
fori=1:
N
fprintf('第%d个',i);
p(i)=input('p=');%输入信源符号概率分布矢量,p(i)<1
ifp(i)<=0
error('不符合概率分布')
end
s=s+p(i)
H=H+(-p(i)*log2(p(i)));%计算信源信息熵
end
if(s<=0.999999||s>=1.000001)
error('不符合概率分布')
end
tic;
fori=1:
N-1%按概率分布大小对信源排序
forj=i+1:
N
ifp(i)
m=p(j);p(j)=p(i);p(i)=m;
end
end
end
x=f1(1,N,p,1);
fori=1:
N%计算平均码长
L(i)=length(find(x(i,:
)));
l=l+p(i)*L(i);
end
n=H/l;%计算编码效率
fprintf('按概率降序排列的码字:
\n');
disp(x)%显示按概率降序排列的码字
fprintf('平均码长:
\n');
disp(l)%显示平均码长
fprintf('编码效率:
\n');
disp(n)%显示编码效率
fprintf('计算耗时time=%f\n',toc);
2、两个子m文件展示
1、第一个函数f1存放于f1.m
functionx=f1(i,j,p,r)
globalx;
x=char(x);
if(j<=i)
return;
else
q=0;
fort=i:
j%对于区间[i,j]自上而下求累加概率值
q=p(t)+q;y(t)=q;
end
fort=i:
j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组
v(t)=abs(y(t)-(q-y(t)));
end
fort=i:
j
if(v(t)==min(v))%求该数组中最小的一个值来确定分界点位置
fork=i:
t%赋值码字
x(k,r)='0';
end
fork=(t+1):
j
x(k,r)='1';
end
d=t;
f1(i,d,p,r+1);%递归调用及相互调用
f2(d+1,j,p,r+1);
f1(d+1,j,p,r+1);
f2(i,d,p,r+1);
else
end
end
end
return;
2、第二个函数函数f2存放于f2.m
functionx=f2(i,j,p,r)
globalx;
x=char(x);
if(j<=i)
return;
else
q=0;
fort=i:
j%对于区间[i,j]自上而下求累加概率值
q=p(t)+q;y(t-i+1)=q;
end
fort=1:
j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组
v(t)=abs(y(t)-(q-y(t)));
end
fort=1:
j-(i-1)
if(v(t)==min(v))%求该数组中最小的一个值来确定分界点位置
d=t+i-1;
fork=i:
d%赋值码字
x(k,r)='0';
end
fork=(d+1):
j
x(k,r)='1';
end
f2(d+1,j,p,r+1);%递归调用及相互调用
f1(i,d,p,r+1);
f2(i,d,p,r+1);
f1(d+1,j,p,r+1);
else
end
end
end
return;
3、注意事项
还是那句话,要提前把子函数放到工作空间。
4、例题展示
N=7
第1个p=0.2
s=
0.2000
第2个p=0.19
s=
0.3900
第3个p=0.18
s=
0.5700
第4个p=0.17
s=
0.7400
第5个p=0.15
s=
0.8900
第6个p=0.1
s=
0.9900
第7个p=0.01
s=
1
按概率降序排列的码字:
00
010
011
10
110
1110
1111
平均码长:
2.7400
编码效率:
0.9521
计算耗时time=0.187857
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 实现 香农 费诺码
![提示](https://static.bdocx.com/images/bang_tan.gif)