⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fano1.m

📁 信源编码中的fano编码的MATALB程序实现
💻 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 + -