matlab实现香农编码
(2012-04-29 21:49:40)
标签:
杂谈 |
分类: 学术研究 |
http://blog.163.com/yangxiaoquan20080808@126/blog/static/856940402011055567463/
香
课题分析:
编程方法:
据课本上的介绍编码香农码的方法。
首先,给定信源符号概率,要先判断信源符号概率是否满足概率分布,即各概率之和是否为1,如果不为1就没有继续进行编码的必要,虽然任可以正常编码,但编码失去了意义。
其次,对信源符号概率进行从小到大的排序,以便进行下一步。从第一步就知道信源符号的个数n,于是构造一个nx4的零矩阵D,以便储存接下来运算的结果。把排好序的信源符号概率以列的形式赋给D的第一列。
再次,做编码的第二步,求信源符号概率的累加概率(方法见程序),用来编写码字。
接着求各信源符号概率对应的自信息量,用于求解码长k。
然后,我们对刚求的自信息量对无穷方向取最小正整数,得到的最小正整数就是该信源符号所对应编码的码长k,有了码长,接下来就可以求解码字。
最后,对所求到的累加概率求其二进制,取其小数点后的数,所取位数由该信源符号对应的码长决定,所用的步骤结束,依次得到各信源符号的香农编码。
程序展现:
%求解给定信源符号概率的香农编码
n=input('输入信源符号个数n=')
p=zeros(1,n);
for
p(1,i)=input('输入信源符号概率:');
end
if
error('输入概率不符合概率分布')
end
y=fliplr(sort(p));%从大到小的排序
D=zeros(n,4);%生成7*4的零矩阵
D
A=D(:,2)';%取出D中第二列元素
B=D(:,4)';%取出D中第四列元素
for
C=deczbin(A(j),B(j))%生成码字
end
function
C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作
temp=A;%temp赋初值
实验过程及结果分析: