📄 fano1.m
字号:
%Fano编码的MATLAB程序:
%作者:四川大学电气信息学院 本科 通信工程 谢东 于2007年12月29日清晨-2008年1月1日凌晨
%自己改进于2008年1月2日清晨.
%费诺编码:一种信源编码。设有离散无记忆信源X,P(X).二进制费诺编码为:1.将信源符号按
%概率从大到小的顺序排列2.将信源分成两组――按两组概率之差为最小分.3.上面一组编码为
%0,下面一组编码为1,一直分到一组只有一个信源为止.4.将一个信源分组得到的0和1全部连
%接起来,组成该信源的码字,信源即得到自己的费诺编码.该程序采用费诺编码算法,通过调
%用函数递归实现。程序看点:调用用f1函数将输入变量赋初值,f1函数完成第一次分组后,并
%对字符数组x(存放码字)第一列赋值得到第一个分界点d,再用f1,f2函数相互调用和自身调用
%分别实现第一分界点以上和以下的符号再次分组并赋值给字符数组x;因为f1,f2函数分别每次,
%实现分界点以上和以下寻找下一个分界点所采用的算法不同,两个函数相互调用弥补了不足,最
%终完成程序设计要求,堪称经典;本程序的难点是字符数组x如何存放码字,程序采用每次调用
%增加存放码字数组x的列数r,在寻得分界点后即赋值,可是最后程序输出只有第一列的值,原来
%变量x每次的值被冲了,没有保存,困惑我好久,最后采用global全局变量解决了上问题,不过
%采用global全局变量定义x后,x的类型需要转换为char最关键的是程序开头必须用clear all把
%global定义的变量归零,不然global定义的变量中存放的还是上次所存的值.
clc;clear all;
N=input('N=');%输入信源符号的个数
s=0;l=0;H=0;
for i=1:N
fprintf('第%d个',i);
p(i)=input('p=');%输入信源符号概率分布矢量,p(i)<1
if p(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;
for i=1:N-1 %按概率分布大小对信源排序
for j=i+1:N
if p(i)<p(j)
m=p(j);p(j)=p(i);p(i)=m;
end
end
end
x=f1(1,N,p,1);
for i=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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -