matlab费诺编码程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

%函数f1存放于f1.mfunctionx=f1(i,j,p,r)globalx;x=char(x);if(j=i)return;elseq=0;fort=i:j%对于区间[i,j]自上而下求累加概率值q=p(t)+q;y(t)=q;endfort=i:j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组v(t)=abs(y(t)-(q-y(t)));endfort=i:jif(v(t)==min(v))%求该数组中最小的一个值来确定分界点位置fork=i:t%赋值码字x(k,r)='0';endfork=(t+1):jx(k,r)='1';endd=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);elseendendendreturn;%函数f2存放于f2.mfunctionx=f2(i,j,p,r)globalx;x=char(x);if(j=i)return;elseq=0;fort=i:j%对于区间[i,j]自上而下求累加概率值q=p(t)+q;y(t-i+1)=q;endfort=1:j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组v(t)=abs(y(t)-(q-y(t)));endfort=1:j-(i-1)if(v(t)==min(v))%求该数组中最小的一个值来确定分界点位置d=t+i-1;fork=i:d%赋值码字x(k,r)='0';endfork=(d+1):jx(k,r)='1';endf2(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);elseendendendreturn;主函数clc;clearall;fprintf('………………费诺编码程序………………\n');fprintf('小组成员:苏、杨、张\n\n');fprintf('请输入信源符号的个数:');N=input('N=');%输入信源符号的个数s=0;l=0;H=0;fori=1:Nfprintf('请输入第%d个符号的概率:',i);p(i)=input('p=');%输入信源符号概率分布矢量,0p(i)1ifp(i)=0||p(i)=1error('请注意P的范围是0P1')ends=s+p(i)H=H+(-p(i)*log2(p(i)));%计算信源信息熵endif(s~=1)error('信源符号概率和不等1')endtic;fori=1:N-1%按概率分布大小对信源排序forj=i+1:Nifp(i)p(j)m=p(j);p(j)=p(i);p(i)=m;endendendx=f1(1,N,p,1);fori=1:N%计算平均码长L(i)=length(find(x(i,:)));l=l+p(i)*L(i);endn=H/l;%计算编码效率fprintf('编码后所得码字:\n');disp(x)%显示按概率降序排列的码字fprintf('平均码长:K=\n');disp(l)%显示平均码长fprintf('信息熵:H(X)=\n');disp(H)%显示信息熵fprintf('编码效率:η=\n');disp(n)%显示编码效率%fprintf('计算耗时time=%f\n',toc);

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功