香农费诺编码的matlab的实现

合集下载

信息论常用无失真信源编码设计(含MATLAB程序)

信息论常用无失真信源编码设计(含MATLAB程序)

《信息论基础》题目:常用无失真信源编码程序设计目录1. 引言 (2)2. 香农编码 (2)2.1 编码步骤 (3)2.2 程序设计 (3)2.3 运行结果 (3)3. 费诺编码 (4)3.1 编码步骤 (5)3.2 程序设计 (5)3.3 运行结果 (5)4. 哈夫曼编码 (6)4.1 编码步骤 (7)4.2 程序设计 (7)4.3 运行结果 (8)5. 结论 (9)6. 参考文献 (10)7. 附录 (11)7.1 香农编码Matlab程序 (11)7.2 费诺编码Matlab程序 (12)7.3 哈夫曼编码Matlab程序 (14)1. 引言信息论(Information Theory)是运用概率论与数理统计的方法研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科。

信息系统就是广义的通信系统,泛指某种信息从一处传送到另一处所需的全部设备所构成的系统。

信息论是关于信息的理论,应有自己明确的研究对象和适用范围[1]。

信息论将信息的传递作为一种统计现象来考虑,给出了估算通信信道容量的方法。

信息传输和信息压缩是信息论研究中的两大领域。

这两个方面又由信息传输定理、信源-信道隔离定理相互联系。

信源编码是一种以提高通信有效性为目的而对信源符号进行的变换,或者说为了减少或消除信源冗余度而进行的信源符号变换。

具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列[2]。

在通信中,传送信源信息只需要具有信源极限熵大小的信息率,但在实际的通信系统中用来传送信息的信息率远大于信源极限熵。

为了能够得到或接近信源熵的最小信息率,必须解决编码的问题,而编码分为信源编码和信道编码,其中的信源编码又分为无失真信源编码和限失真信源编码。

由于无失真信源编码只适用于离散信源,所以本次作业讨论无失真离散信源的三种简单编码,即香农(Shannon)编码、费诺(Fano) 编码和哈夫曼(Huffman) 编码[3]。

用matlab实现香农码和费诺码

用matlab实现香农码和费诺码

信息论与编码―大作业班级:电信091班姓名:***学号:**********目录一、用matlab实现Shannon编码 (3)1、编码主程序 (3)2、含有的子函数binary (4)3、注意事项 (5)4、例题展示 (5)二、用matlab实现Feno编码 (7)1、编码主程序 (7)2、两个子m文件展示 (9)3、注意事项 (12)4、例题展示 (12)一、用matlab实现Shannon编码1、编码主程序n=input('输入单符号信源个数n=')p=zeros(1,n);for i=1:np(1,i)=input('输入单符号信源个数:');endif sum(p)<1||sum(p)>1error('不符合概率分布无效')endy=fliplr(sort(p));%大到小排序D=zeros(n,4);%生成n*4的零矩阵D(:,1)=y';%把y赋给零矩阵的第一列for i=2:nD(1,2)=0;%令第一行第二列的元素为0D(i,2)=D(i-1,1)+D(i-1,2);%求累加概率endfor i=1:nD(i,3)=-log2(D(i,1));%求第三列的元素D(i,4)=ceil(D(i,3));%求第四列的元素,对D(i,3)向无穷方向取最小正整数endDA=D(:,2)';%取出D中第二列元素B=D(:,4)';%取出D中第四列元素for j=1:nC=binary(A(j),B(j))%生成码字End2、含有的子函数binaryfunction [C]=binary(A,B)%对累加概率求二进制的函数C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作temp=A;%temp赋初值for i=1:B%累加概率转化为二进制,循环求二进制的每一位,A控制生成二进制的位数temp=temp*2;if temp>1temp=temp-1;C(1,i)=1;elseC(1,i)=0;endend3、注意事项正式运行前应该把binary.m文件放到matlab的工作空间中去,以保证主函数能成功调用。

基于Matlab的信源编码实验系统的设计

基于Matlab的信源编码实验系统的设计

基于Matlab的信源编码实验系统的设计宋丽丽;秦艳【摘要】Source coding is an important content of Information Theory and Coding course . The source coding experimental system is designed using graphical user interface (GUI) of Matlab. The several method of source coding are realized including Shannon coding, Fenno coding, Huffman coding, uniform encoding and non uniform encoding . It proves that this system has characteristics of easy operation and strong ability of interaction, which offers an effective assistant tool for the experimental teaching.%信源编码是“信息论与编码”课程的重要内容。

本文利用Matlab中GUI图形用户界面设计了信源编码的实验系统,实现了几种常用的信源编码方法:香农编码、费诺编码、Huffman编码、均匀编码和非均匀编码。

实践证明,该系统具有操作简单和交互性强等特点,为实验教学提供了一个有效的辅助工具。

【期刊名称】《电气电子教学学报》【年(卷),期】2012(034)006【总页数】3页(P80-81,106)【关键词】信源编码;实验教学;Matlab;图形用户界面【作者】宋丽丽;秦艳【作者单位】内蒙古工业大学信息工程学院,内蒙古呼和浩特010080;内蒙古工业大学信息工程学院,内蒙古呼和浩特010080【正文语种】中文【中图分类】TN911.2信源编码是“信息论与编码课程”的重要内容,为使学生更好的理解与掌握,本文基于Matlab开发的信源编码实验系统,实现了离散信源编码方法中的香农编码、费诺编码和Huffman编码以及连续信源编码方法中的均匀量化编码与非均匀量化编码。

费诺编码的matlab实现

费诺编码的matlab实现

多媒体技术实验报告学院:城南学院姓名:学号:指导老师:尹波息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之与近似相同,并对各组赋予一个N进制码元0、1……N-1。

之后再针对每一大组内的信源符号做如上的处理,即再分为概率与相同的N组,赋予N进制码元。

如此重复,直至每组只剩下一个信源符号为止。

此时每个信源符号所对应的码字即为费诺码。

具体过程如下:[1] 将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。

[2] 依次排列的信源符号按概率值分为两大组,使两个组的概率之与近似相同,并对各组赋予一个二进制码元“0”与“1”。

[3] 使划分后的两个组的概率之与近似相同,并对各组赋予一个二进制符号“0”与“1”。

[4] 如此重复,直至每个组只剩下一个信源符号为止。

[5] 信源符号所对应的码字即为费诺码。

例:有一幅40个像素组成的灰度图像,灰度共有5级,分别用符号A,B,C,D与E表示。

40个像素中出现灰度A的像素数有15个,出现灰度B的像素数有7个,出现灰度C的像素数有7个,其余情况见表。

费诺编码方法属于概率匹配编码,具有如下特点:1、概率大,则分解次数小;概率小则分解次数多。

这符合最佳码原则。

2、码字集合就是唯一的。

3、分解完了,码字出来了,码长也有了,即先有码字后有码长。

因此,费诺编码方法又称为子集分解法。

3、程序设计思路4、程序代码clc;clear;A=[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]; A=fliplr(sort(A));%降序排列[m,n]=size(A);for i=1:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break;endendfor i=1:n%生成B第2列的元素if i<=kB(i,2)=0;elseB(i,2)=1;endend%生成第一次编码的结果END=B(:,2)';END=sym(END);%生成第3列及以后几列的各元素j=3;while (j~=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x==-1break;elseif B(q,j-1)==xy=1;continue;elsey=0;break;endendendif y==1q=q+1;endif q==p|q-p==1B(p,j)=-1;elseif q-p==2B(p,j)=0;END(p)=[char(END(p)),'0'];B(q-1,j)=1;END(q-1)=[char(END(q-1)),'1'];elsea=sum(B(p:q-1,1))/2;for k=p:q-2if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=[char(END(i)),'0'];elseB(i,j)=1;END(i)=[char(END(i)),'1'];endendendendp=q;endC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAENDfor i=1:n[u,v]=size(char(END(i)));L(i)=v;endavlen=sum(L、*A)H=-sum(A、*log2(A));disp(['ENtropy of the source:',num2str(H),'bits']);5、实验结果①实验运行结果(以[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]为例)②计算:信息熵就是多少?上述编码方法的平均码长就是多少?信息熵就是2、7829; 平均码长就是2、88;。

基于matlab对香农公式仿真

基于matlab对香农公式仿真

引言香农公式表明,信道的带宽或信道中的信噪比越大,则信息的极限传输速率就越高。

香农公式也得出这三者关系的表达式,本文讨论如何用MATLAB进行仿真得出信噪比,带宽和信道容量的关系,并以图像的形式表示出来。

1.数字通信系统中带宽的概念早期的电子通信系统都是模拟系统。

当系统的变换域研究开始后,人们为了能够在频域定义系统的传递性能,便引进了“带宽”的概念。

当输入的信号频率高或低到一定程度,使得系统的输出功率成为输入功率的一半时(即-3dB),最高频率和最低频率间的差值就代表了系统的[[通频带宽]],其单位为赫兹(Hz)。

比如在传统的固定电话系统中,从固定话机终端到交换中心的双绞线路系统(Twist pair),所能提供的通信带宽可以到2MHz以上,其中我们的语音通信只使用了从300Hz~3400Hz 的频段,使用的通信带宽约为3KHz。

现在,基于双绞线传输的xDSL接入网技术,能够充分使用语音带宽以外的频率,高速传送数据业务,实现宽带网接入。

图1.1 模拟电话线的频带数字通信系统中“带宽”的含义完全不同于模拟系统,它通常是指数字系统中数据的传输速率,其表示单位为比特/秒(bit/S)或波特/秒(Baud/S)。

带宽越大,表示单位时间内的数字信息流量也越大;反之,则越小。

衡量二进制码流的基本单位称为“比特”,若传输速率达到64kb/s,就表示二进制信息的流量是每秒64,000比特。

衡量多进制码流的的基本单位为“波特”,若多进制码流的传输速率达80KB/S,就表示多进制符号的信息流量是每秒80,000波特,如果将多进制码,比如四进制码(22),换算成的二进制来衡量,则信息比特流量为80X2=160Kb/S。

不同的数字业务其提供或需求的带宽也不一样。

如前面所说在固定电话网中的局与局之间的中继接口,所提供的带宽为64Kb/S;ISDN网中的用户网络侧接口(UNI)中的U接口(2B1Q码),带宽为80KB/S(160Kb/S);局间E1接口所提供的带宽为2Mb/S;同步数字传输网(SDH)中的STM-1信号速率为155Mb/S,等等。

香农编码的MATLAB实现

香农编码的MATLAB实现

• (2)令 p(a0) = 0,用 pa (aj)(j = i+1)表示第 i 个码字的累加概率,则:
j 1
pa (a j ) p(ai ) i0
j 1,2,..., n
二、实验原理
1. 香农编码步骤
• (3)令 ki 为第 i 个码字的码长,按照下式计算 出各概率对应的码字长度 ki :
三、实验内容
• (5)十进制小数转换成二进制小数
➢ k_max = max(k);
➢ bin = zeros(n,k_max);
% 对二进制小数矩阵初始化
➢ for i = 1:n
➢ for j = 1:k_max

bin(i,j)=floor(pa(i)*2); % 将累加概率转换成二进制

pa(i)=pa(i)*2-floor(pa(i)*2);
三、实验内容
• (7)计算平均码长、信息率和编码效率
➢ K = sum(p.* k); % 平均码长
➢ R = K;
% 信息率
➢ eff = H/R; % 编码效率
三、实验内容
• (8)输出结果
➢ disp(['信源分布 P(X) = [',num2str(p),']']); ➢ disp('编码结果:'); ➢ for i = 1:n ➢ disp([num2str(p(i)),' -> ' ,num2str(codeword(i,:))]); ➢ end ➢ disp(['信源熵 H(X) = ' ,num2str(H),' (bit/sign)']); ➢ disp(['平均码长 K = ' ,num2str(K),' (bit/sign)']); ➢ disp(['信息率 R = ' ,num2str(R),' (bit/sign)']); ➢ disp(['编码效率 η = ' ,num2str(eff)]);

实验三-香农编码的MATLAB实现

实验三-香农编码的MATLAB实现

实验三-⾹农编码的MATLAB 实现信息论编码实验3~9连载,更多看专栏。

⾹农编码仿真实现⼀、⾹农编码的原理⾹农码严格意义上来说不是最佳码,与基于符号概率进⾏映射的哈夫曼编码不同的地⽅在于,⾹农码基于累积概率的⼆进制数进⾏编码。

编码步骤:1. 将概率分布列降序排序;2. 求出每⼀⾏所对应的累加概率 P ;3. 根据累加概率 P 计算该符号对应⾹农码的长度 L ;4. 将累加概率 P 转换成⼆进制数,取其前 L 位,即为该符号的⾹农码。

对于⾹农码的评价:⾹农编码的效率不⾼,实⽤性不⼤,但对其他编码⽅法有很好的理论指导意义。

⼀般情况下,按照⾹农编码⽅法编出来的码,其平均码长不是最短的,即不是紧致码(最佳码)。

只有每⼀个符号的概率都是1/2的整数倍时,编码效率才能达到最⾼。

⼆、⾹农编码实例以后有空再补充吧~三、程序及流程图下⾯是代码:i i i i i%%实验三:⾹农编码仿真实验clear allclc%⽤户输⼊符号概率p =input('请输⼊离散信源概率分布,例如[0.5,0.5]:\n');N =length(p);L =ceil(-log2(p));%获得码长向量,元素表⽰每个符号所对应的码长%获得累加概率P及对应码字[p_SortDescend,reflect]=sort(p,'descend');%将概率从⼤到⼩进⾏排序%注:reflect所表⽰的映射关系很重要P =zeros(1,N);%初始化累加概率CODE =strings(1,N);%初始化对应码字(字符串形式)for i=1:N % i表⽰排序后第⼏个符号code =zeros(1,L(reflect(i)));%初始化对应码字(数组形式)if i==1%定义第⼀个编码为0P(1)=0;CODE(reflect(i))=num2str(code);elseP(i)=sum(p_SortDescend(1,1:i-1));%获得累加概率end%下⾯计算⾹农码(计算累加概率的⼆进制数,并取前Li位)p_count =P(i)*2;% p_count⽤于逐步的计算累加概率的⼆进制数for m=1:L(reflect(i))% m表⽰这个符号⾥第⼏个码字if p_count >=1code(m)=1;p_count = p_count-1;elsecode(m)=0;endp_count = p_count*2;end%将⾹农码赋值给对应的符号CODE(reflect(i))=num2str(code);endH =sum(-p.*log2(p));%计算信源信息熵L_ave =sum(L.*p);%计算平均码长yita = H/L_ave;%计算编码效率%展⽰输出码字、平均码长和编码效率fprintf('\n运⾏结果:\n');disp(['信号符号: ',num2str(1:N)]);disp(['对应概率: ',num2str(p)]);fprintf('对应码字:');disp(CODE);disp(['平均码长:',num2str(L_ave)]);disp(['编码效率:',num2str(yita)]);四、程序运⾏结果下⾯假设输⼊[0.1,0.2,0.3,0.4]五、程序⾃评价怎么说呢,代码原理其实很简单,但是我⼀直对它的命令⾏窗⼝的输出耿耿于怀,这没有达到我理想的输出效果:1. 每⼀列对应元素都对齐;2. “对应码字”的输出不要加引号,并且可以密集排列;3. “对应码字”下⾯不要有换⾏。

MATLAB 香农编码和费诺编码

MATLAB 香农编码和费诺编码

function varargout = sy(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @sy_OpeningFcn, ...'gui_OutputFcn', @sy_OutputFcn, ...'gui_LayoutFcn', [], ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});endfunction sy_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;guidata(hObject, handles);function varargout = sy_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;function edit1_Callback(hObject, eventdata, handles)function edit1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction radiobutton2_Callback(hObject, eventdata, handles)set(handles.radiobutton3,'value',0);function radiobutton3_Callback(hObject, eventdata, handles)set(handles.radiobutton2,'value',0);function listbox3_Callback(hObject, eventdata, handles)function listbox3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit3_Callback(hObject, eventdata, handles)function edit3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit4_Callback(hObject, eventdata, handles)function edit4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox4_Callback(hObject, eventdata, handles)function listbox4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit5_Callback(hObject, eventdata, handles)function edit5_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction pushbutton9_Callback(hObject, eventdata, handles) r1=get(handles.radiobutton2,'value');if r1==1s1=get(handles.edit1,'String')len=length(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendcount=count/len;p=countl=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2str(W(i,:));endset(handles.listbox6,'String',p); for i=1:L-1 %for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handles.listbox5,'string',b'); set(handles.edit5,'String',H);set(handles.listbox4,'String',out); set(handles.edit3,'String',l);set(handles.edit4,'String',n);elses1=get(handles.edit1,'String')len=length(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendfor i=1:L-1for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount=count/len;p=countfor i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2double(c')n=length(c);k=[];for i=1:nk=[k,length(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handles.edit5,'String',H);set(handles.listbox4,'String',c1);set(handles.edit3,'String',mc);set(handles.edit4,'String',n);set(handles.listbox5,'string',b');set(handles.listbox6,'string',p);endfunction listbox5_Callback(hObject, eventdata, handles) function listbox5_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox6_Callback(hObject, eventdata, handles) function listbox6_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end。

费诺二进制编码matlab代码

费诺二进制编码matlab代码

费诺二进制编码是一种有效的数据压缩方法,在通信领域得到广泛应用。

它通过对数据进行编码和解码,可以显著减小数据传输的大小,从而提高传输效率。

在本文中,我将深入探讨费诺二进制编码的原理、方法和实现,并结合Matlab代码进行详细分析。

1. 费诺二进制编码概述费诺二进制编码是一种前缀编码,它通过用短码字表示高频次的符号,用长码字表示低频次的符号来实现数据的压缩。

这种编码方法能够有效地减小数据传输的大小,提高传输效率。

在实际应用中,我们可以通过构建费诺树来实现费诺二进制编码,下面我将详细介绍费诺树的构建方法。

2. 费诺树的构建费诺树是一种特殊的二叉树,它通过将频次较低的符号放在树的较深位置,频次较高的符号放在树的较浅位置来实现数据压缩。

我们可以通过以下步骤来构建费诺树:- 将所有的符号按照频次从小到大进行排序。

- 将频次最小的两个符号合并为一个新的符号,其频次为原来两个符号的频次之和。

- 重复上述步骤,直到所有的符号都被合并成一个符号。

- 按照合并的先后顺序构建费诺树。

3. 费诺编码的实现在构建了费诺树之后,我们可以通过遍历费诺树的路径来确定每个符号的费诺编码。

对于每个符号,从根节点开始遍历费诺树的路径,当走到叶子节点时,记录经过的路径,即为该符号的费诺编码。

通过这种方式,我们可以为每个符号生成对应的费诺编码,从而实现数据的压缩和解压缩。

4. Matlab代码实现下面我将使用Matlab来实现费诺二进制编码的方法,为了简化示例,我们以一个简单的文本数据为例,假设我们有一个包含'A', 'B', 'C', 'D'四个符号的数据序列,并且它们的频次分别为4, 3, 2, 1。

我们首先按照频次对符号进行排序,并根据上述步骤构建费诺树,然后遍历费诺树的路径生成每个符号的费诺编码,最终实现数据的压缩和解压缩。

以下是Matlab代码实现的示例:```matlab% 构建费诺树symbols = {'A', 'B', 'C', 'D'};freq = [4, 3, 2, 1];[~, idx] = sort(freq, 'descend');symbols = symbols(idx);freq = freq(idx);leafNodes = cell2struct(num2cell(freq), symbols, 2); parentNodes = cell(size(symbols));while numel(leafNodes) + numel(parentNodes) > 1% 合并频次最小的两个符号[freq, idx] = sort([struct2array(leafNodes);struct2array(parentNodes)], 'descend');nodes = {leafNodes, parentNodes};nodes = nodes(idx);leafNodes = rmfield(nodes{1}, fieldnames(nodes{1}){1});fieldName = ['node', num2str(numel(parentNodes) + 1)];parentNodes.(fieldName) = freq(1);parentNodes.(fieldName) = nodes{1};parentNodes = rmfield(parentNodes, fieldName);end```以上是该示例的部分Matlab代码,通过对费诺树的构建和遍历,我们可以得到每个符号的费诺编码,从而实现数据的压缩和解压缩。

香农编码的MATLAB实现

香农编码的MATLAB实现

香农编码的MATLAB实现指导教师:张坤(讲师)专业:信息与计算科学(08级)成员:张深海(组长)陈子姣赵静范亚茹实验目的:用香农编码法编成二进制变长码,写出编码过程的Matlab程序。

实验内容:香农编码方法:p?p?...?p;)将信源消息符号按其出现的概率大小依次排列为(1n12?lb(p)?k??lb(p)?1k;为)确定满足下列不等式的整数码长(2iiiii?1?i)?p(aP个消息的累加概率)(3为了编成唯一可译码,计算第;ki1k?P变换成二进制数;(4)将累加概率i kP二进制数的小数点后位即为该消息符号的二进制码字。

(5)取ii实验步骤:(1)用p = fliplr(p)语句对p进行从大到小的排序;用for循环计算第i个消息的累加概率;(2)调用c = cell(1,n) ,(3)将码字存在元胞数组中;二进制转换;)(4得到该消息符号的二进制码字。

(5)实验结果:Matlab程序:function c = shannon(p)[p , index] = sort(p) ;p = fliplr(p) ;%从大到小n = length(p) ;pa = 0 ;%累加概率for i = 2:npa(i) = pa(i - 1) + p(i - 1) ;endk = ceil(-log2(p)) ;%码字长度计算c = cell(1,n) ;%生成元胞数组,存码字,是cell,跟上一行不一样for i = 1:nc{i} = '' ;,tmp = pa(i) ;for j = 1:k(i)tmp = tmp * 2 ;if tmp >= 1tmp = tmp - 1 ;c{i}(j) = '1' ;elsec{i}(j) = '0' ;endendend%交换回原来的顺序c = fliplr(c) ;c(index) = c ;实例分析:已知:信源消息符号出现的概率p=[0.20 0.19 0.18 0.17 0.15 0.10 0.01]调用上述Matlab程序,得出下面结果:该消息符号的二进制码字为:000 001 011 100 101 1110 1111110。

信息论与编码实验程序与结果图(matlab)

信息论与编码实验程序与结果图(matlab)

结果图信源熵实验程序:clc; close all; clear;linwidd=1fontt=20p0=0; pd=1; N=20p=linspace(p0,pd,N);I=-log2(p);plot(p,I,'k');title('I=-log2(p)函数图');xlabel('p');ylabel('I');clc; close all; clear;linwidd=1fontt=20p0=0; pd=1; N=20p=linspace(p0,pd,N);H=-p.*log2(p)-(1-p).*log2(1-p);plot(p,H,'k');title('H=-p.*log2(p)-(1-p).*log2(1-p)函数图');xlabel('p');ylabel('H');信道容量实验程序:clc; close all; clear;linwidd=1fontt=20p0=0; pd=1; N=20p=linspace(p0,pd,N);r=4c=log2(r)+(1-p).*log2(1-p)+p.*log2(p/(r-1));plot(p,c,'k');title('强对称信道容量数值模拟图');有噪信道编码-- 费诺不等式程序:结果图clc;close all;clear;r=3;p0=;pd=;N=2000;p=linspace(p0,pd,N);q=1-p;H=-p.*log2(p)-q.*log2(q);hold onHH=H+p.*log2(r-1)title(' 费诺不等式表示图 ' );box on xlabel('PE' );ylabel('H(X/Y)');plot(p,HH,'k:')hold onhold onfill([p,1],[HH,0],[,,])stem((r-1)/r,,'' )text,,' 最大值 ')香农编码程序:codelength=zeros(1,n);% 码长初始化for ii=1:nclc;clear all;close all;fprintf(['第',num2str(ii),'个信息对应为 ']);p=[];disp(c{ii});%显示码字if sum(p)<1||sum(p)>1codelength(ii)=length(c{ii});%error('输入概率不吻合概率分布 ')endend n_average=sum(codelength.*p) %平均码长[p index]=sort(p,'descend');fprintf('平均码长为 ');disp(n_average);n=length(p);H=-sum(p.*log2(p));pa=zeros(n,1);fprintf('信源熵 ');disp(H);for ii=2:n x=H/(n_average.*log2(2))pa(ii)=pa(ii-1)+p(ii-1);fprintf('编码效率 ');disp(x);end figurek=ceil(-log2(p));%码字长度计算h=stem(1:n,codelength);%c=cell(1,n);%生成元胞数组,用来存不同样长度的axis([0 n+1 0 n+1]);码字set(h,'MarkerFaceColor','blue','linewidth',2)for ii=1:n实验结果结果图c{ii}='';第 1个信息对应为 000tmp=pa(ii);第 2个信息对应为 001for jj=1:k(ii)第 3个信息对应为 011tmp=tmp*2;第 4个信息对应为 100if tmp>=1第 5个信息对应为 101tmp=tmp-1;第 6个信息对应为 1110%c{ii}{jj}='1';第 7个信息对应为 1111110c{ii}=[char(c{ii}),'1'];n_average =else平均码长为%c{ii}{jj}='0';信源熵c{ii}=[char(c{ii}),'0'];x =end编码效率end费诺编码程序:endendc(index)=c;%换回原来的序次for rr=2:2:needgroupnum*2index2=index_aftergroup(rr,:);for ii=index2(1):index2(2)c{ii}=[char(c{ii}),'1'];endendflag=0;index_p=[];for rr=1:needgroupnum*2indextmp=index_aftergroup(rr,:);if(indextmp(2)-indextmp(1)+1>1)flag=1;index_p=[index_p;indextmp];endendjj=jj+1;endc(index)=c;codelength=zeros(1,N);for ii=1:Nfprintf(['第 ',num2str(ii),'个信息对应为']); disp(c{ii});codelength(ii)=length(c{ii});endn_average=sum(codelength.*p)fprintf(' 平均码长为 ');disp(n_average);H=-sum(p.*log2(p));fprintf('信源熵 ');disp(H);x=H/(n_average.*log2(2))fprintf('figureh=stem(1:N,codelength);霍夫曼编码程序:clc;clear all;close all;A=[ ];A=sort(A,'descend');T=A;[m,n]=size(A);B=zeros(n,n-1);B(:,1)=T;r=B(n,1)+B(n-1,1);T(n-1)=r;T(n)=0;T=sort(T,'descend');t=n-1;for j=2:n-1axis([0 N+1 0 N+1]);set(h,'MarkerFaceColor','blue','linewidth',2)endfunction index_aftergroup=func_group(p,index_p)index=index_p(1):index_p(2);n=length(index);p0=p(index);sump0=sum(p0);half_sump0=sump0/2;for ii=1:n-1tmpsum=sum(p0(1:ii));if abs(tmpsum-half_sump0)<=abs(tmpsum-half_sump0+p0(ii+1))index_aftergroup=[index(1) index(ii);index(ii+1) index(n)];break;endendend实验结果结果图第 1 个信息对应为 00 第2 个信息对应为 010 第 3个信息对应为 011 第 4个信息对应为 10 第 5 个信息对应为 110 第 6 个信息对应为 1110 第 7 个信息对应为 1111n_average =平均码长为信源熵x =编码效率B(1:t,j)=T(1:t);for j=n-2:-1:1K=find(T==r);for i=1:t-2%B(n,j)=K(end);if i>1&&B(i,j)==B(i-1,j) B(n,j)=K(1);d=d+1;r=(B(t-1,j)+B(t,j));elseT(t-1)=r;d=1;T(t)=0;endT=sort(T,'descend');B(B(n,j+1),j+1)=-1;t=t-1;temp=B(:,j+1);end x=find(temp==B(i,j));B;ENDc(i)=ENDc1(x(d)); ENDc1=sym('[1,0]');endENDc=ENDc1;y=B(n,j+1);t=3;ENDc(t-1)=[char(ENDc1(y)),'1']; d=1;ENDc(t)=[char(ENDc1(y)),'0'];编码效率 ');disp(x);t=t+1;T(t)=0;th',2);ENDc1=ENDc;T=sort(T,'descend');hold offend t=t-1;legend(' 每个码长与平均码长的方差',' 码长均A%排序后的原概率序列end方差 ');ENDc%编码结果B;实验结果ENDc1=sym('[1,0]'); A =for i=1:n ENDc=ENDc1;ENDc =[ 11, 1, 0, 101, 100] [a,b]=size(char(ENDc(i)));t=3;avlen =L(i)=b;d=1;selen =end for j=n-2:-1:1mselen =for i=1:t-2H =avlen=sum(L.*A)% 平均码长if i>1&&B(i,j)==B(i-1,j)P =selen=(L-avlen).^2%d=d+1; A =mselen=sum((selen).*A)% 码长均方差else ENDc =[ 0, 10, 111, 1101, 1100]H=-A*(log2(A'))%d=1;avlen =P=H/avlen%end selen =B(B(n,j+1),j+1)=-1;mselen =figure;temp=B(:,j+1);H =subplot(2,1,1)x=find(temp==B(i,j));P =结果图h=stem(1:n,selen);%ENDc(i)=ENDc1(x(d));axis([0 n+1 0 max(selen)+]);endset(h,'MarkerFaceColor','blue','linewidth'y=B(n,j+1);,2)ENDc(t-1)=[char(ENDc1(y)),'1'];xlabel('信源向上排 ');ylabel('方差值ENDc(t)=[char(ENDc1(y)),'0'];selen');t=t+1;hold on ENDc1=ENDc;plot(0:n+1,mselen*ones(1,n+2),'r','linewid endth',2);A%排序后的原概率序列hold off ENDc%编码结果legend('每个信源码长与平均码长的方差 ','码长均方差 ');for i=1:nA=[ ];[a,b]=size(char(ENDc(i)));A=sort(A,'descend');L(i)=b;T=A;end[m,n]=size(A);B=zeros(n,n-1);avlen=sum(L.*A)% 平均码长B(:,1)=T;selen=(L-avlen).^2%r=B(n,1)+B(n-1,1);mselen=sum((selen).*A)% 码长均方差T(n-1)=r;H=-A*(log2(A'))%T(n)=0;P=H/avlen%T=sort(T,'descend');subplot(2,1,2)t=n-1;h=stem(1:n,selen);%for j=2:n-1axis([0 n+1 0 max(selen)+]);B(1:t,j)=T(1:t);set(h,'MarkerFaceColor','blue','linewidth'K=find(T==r);,2)B(n,j)=K(end);xlabel(' 信源向下排 ');ylabel('方差值%B(n,j)=K(1);selen');r=(B(t-1,j)+B(t,j));hold onT(t-1)=r;plot(0:n+1,mselen*ones(1,n+2),'r','linewid。

MATLAB香农编码和费诺编码

MATLAB香农编码和费诺编码

funct‎i on varar‎g out = sy(varar‎g in)gui_S‎i ngle‎t on = 1;gui_S‎t ate = struc‎t('gui_N‎a me', mfile‎n ame, ...'gui_S‎i ngle‎t on', gui_S‎i ngle‎t on, ...'gui_O‎p enin‎g Fcn', @sy_Op‎e ning‎F cn, ...'gui_O‎u tput‎F cn', @sy_Ou‎t putF‎c n, ...'gui_L‎a yout‎F cn', [], ...'gui_C‎a llba‎c k', []);if nargi‎n && ischa‎r(varar‎g in{1})gui_S‎t ate.gui_C‎a llba‎c k = str2f‎u nc(varar‎g in{1});endif nargo‎u t[varar‎g out{1:nargo‎u t}] = gui_m‎a infc‎n(gui_S‎t ate, varar‎g in{:}); elsegui_m‎a infc‎n(gui_S‎t ate, varar‎g in{:});endfunct‎i on sy_Op‎e ning‎F cn(hObje‎c t, event‎d ata, handl‎e s, varar‎g in) handl‎e s.outpu‎t = hObje‎c t;guida‎t a(hObje‎c t, handl‎e s);funct‎i on varar‎g out = sy_Ou‎t putF‎c n(hObje‎c t, event‎d ata, handl‎e s) varar‎g out{1} = handl‎e s.outpu‎t;funct‎i on edit1‎_Call‎b ack(hObje‎c t, event‎d ata, handl‎e s)funct‎i on edit1‎_Crea‎t eFcn‎(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on radio‎b utto‎n2_Ca‎l lbac‎k(hObje‎c t, event‎d ata, handl‎e s)set(handl‎e s.radio‎b utto‎n3,'value‎',0);funct‎i on radio‎b utto‎n3_Ca‎l lbac‎k(hObje‎c t, event‎d ata, handl‎e s)set(handl‎e s.radio‎b utto‎n2,'value‎',0);funct‎i on listb‎o x3_C‎a llba‎c k(hObje‎c t, event‎d ata, handl‎e s)funct‎i on listb‎o x3_C‎r eate‎F cn(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on edit3‎_Call‎b ack(hObje‎c t, event‎d ata, handl‎e s)funct‎i on edit3‎_Crea‎t eFcn‎(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on edit4‎_Call‎b ack(hObje‎c t, event‎d ata, handl‎e s)funct‎i on edit4‎_Crea‎t eFcn‎(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on listb‎o x4_C‎a llba‎c k(hObje‎c t, event‎d ata, handl‎e s)funct‎i on listb‎o x4_C‎r eate‎F cn(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on edit5‎_Call‎b ack(hObje‎c t, event‎d ata, handl‎e s)funct‎i on edit5‎_Crea‎t eFcn‎(hObje‎c t, event‎d ata, handl‎e s)if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on pushb‎u tton‎9_Cal‎l back‎(hObje‎c t, event‎d ata, handl‎e s) r1=get(handl‎e s.radio‎b utto‎n2,'value‎');if r1==1s1=get(handl‎e s.edit1‎,'Strin‎g')len=lengt‎h(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break‎;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=lengt‎h(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count‎(i)=a;endendendcount‎=count‎/len;p=count‎l=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2s‎t r(W(i,:));endset(handl‎e s.listb‎o x6,'Strin‎g',p); for i=1:L-1 %for j=i+1:Lif count‎(i)<count‎(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handl‎e s.listb‎o x5,'strin‎g',b'); set(handl‎e s.edit5‎,'Strin‎g',H);set(handl‎e s.listb‎o x4,'Strin‎g',out); set(handl‎e s.edit3‎,'Strin‎g',l);set(handl‎e s.edit4‎,'Strin‎g',n);elses1=get(handl‎e s.edit1‎,'Strin‎g')len=lengt‎h(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break‎;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=lengt‎h(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count‎(i)=a;endendendfor i=1:L-1for j=i+1:Lif count‎(i)<count‎(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount‎=count‎/len;p=count‎for i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2d‎o uble‎(c')n=lengt‎h(c);k=[];for i=1:nk=[k,lengt‎h(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handl‎e s.edit5‎,'Strin‎g',H);set(handl‎e s.listb‎o x4,'Strin‎g',c1);set(handl‎e s.edit3‎,'Strin‎g',mc);set(handl‎e s.edit4‎,'Strin‎g',n);set(handl‎e s.listb‎o x5,'strin‎g',b');set(handl‎e s.listb‎o x6,'strin‎g',p);endfunct‎i on listb‎o x5_C‎a llba‎c k(hObje‎c t, event‎d ata, handl‎e s) funct‎i on listb‎o x5_C‎r eate‎F cn(hObje‎c t, event‎d ata, handl‎e s) if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');endfunct‎i on listb‎o x6_C‎a llba‎c k(hObje‎c t, event‎d ata, handl‎e s) funct‎i on listb‎o x6_C‎r eate‎F cn(hObje‎c t, event‎d ata, handl‎e s) if ispc && isequ‎a l(get(hObje‎c t,'Backg‎r ound‎C olor‎'),get(0,'defau‎l tUic‎o ntro‎l Back‎g roun‎d Colo‎r'))set(hObje‎c t,'Backg‎r ound‎C olor‎','white‎');end。

基于MATLAB GUI的香农编码设计

基于MATLAB GUI的香农编码设计

基于MATLAB GUI的香农编码设计作者:郭思梦张祥林来源:《中小企业管理与科技·上旬刊》2017年第09期【摘要】通过MATLAB的图形用户界面对香农编码过程进行设计制作,完成要求如下:输入任意符号文本,计算出每个符号的概率,同时计算出信源熵,通过香农编码的方法为每个符号进行编码,并显示在界面中,最后计算得出编码效率。

该方法使得操作过程更加方便,计算结果更加直观。

【Abstract】The Shannon Coding process is designed by MATLAB graphical user interface,and the requirements are as follows: entering any symbolic text, calculating the probability of each symbol, and calculating the entropy of the source, using the method of Shannon Coding to encode for each symbol, and displaying them in the interface, finally , calculating the encoding efficiency. This method makes the operation process more convenient and the calculation results more intuitive.【关键词】香农编码;GUI;信源熵;编码效率【Keywords】 Shannon Coding; GUI; source entropy; coding efficiency【中图分类号】TN911 【文献标志码】A 【文章编号】1673-1069(2017)09-0157-021 引言MATLAB中没有专门用来计算香农编码的函数,因此在编程计算中具有程序复杂、修改困难、不直观等缺点。

实验三 费诺编码

实验三 费诺编码
费诺编程程序: clc;
第 N=input('输入信源符号 的个数:'); s=0; l=0; H=0; for i=1:N fprintf('第%d 个',i); p(i)=input('p='); if (p(i)<=0)||(p(i)>=1) error('不符合分布概率'); end s=s+p(i); H=H+(- p(i)*log2(p(i))); end if (s<=0.999999||s>=1.000001) error('不符合分布概率') end 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) function x=f1(i,j,p,r) global x; x=char(x); if(j<=i) return; else q=0; for t=i:j q=p(t)+q; y(t)=q; end for t=i:j v(t)=abs(y(t)-(q-y(t))); end for t=i:j if(v(t)==min(v)) for k=i:t x(k,r)='0'; end for k=(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; function x=f2(i,j,p,r) global x; x=char(x); if(j<=i) return; else q=0; for t=i:j q=p(t)+q;y(t-i+1)=q; end for t=1:j-(i-1) v(t)=abs(y(t)-(q-y(t))); end for t=1:j-(i-1) if(v(t)==min(v)) d=t+i-1;

香农--费诺编码的matlab实现

香农--费诺编码的matlab实现

香农--费诺编码的matlab实现学院:------ 班级:-----姓名:----学号:----摘要:用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。

编码在电子计算机、电视、遥控和通讯等方面广泛使用。

其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。

关键字:信息论,费诺编码,matlab正文:费诺编码也是一种常见的信源编码方法。

信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字.香农--费诺编码的matlab实现编码如下:clc;clear;A=[0.4,0.3,0.1,0.09,0.07,0.04]; A=fliplr(sort(A));%降序排列[m,n]=size(A);for i=1:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break;endendfor i=1:n%生成B第2列的元素if i<=kB(i,2)=0;elseB(i,2)=1;endend%生成第一次编码的结果END=B(:,2)';END=sym(END);%生成第3列及以后几列的各元素j=3;while (j~=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x==-1break;elseif B(q,j-1)==xy=1;continue;elsey=0;break;endendendif y==1q=q+1;endif q==p|q-p==1B(p,j)=-1;elseif q-p==2B(p,j)=0;END(p)=[char(END(p)),'0'];B(q-1,j)=1;END(q-1)=[char(END(q-1)),'1'];elsea=sum(B(p:q-1,1))/2;for k=p:q-2if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a); break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=[char(END(i)),'0'];elseB(i,j)=1;END(i)=[char(END(i)),'1'];endendendendp=q;endC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAENDfor i=1:n[u,v]=size(char(END(i))); L(i)=v;endavlen=sum(L.*A)实验总结:。

香农编码MATLAB实现

香农编码MATLAB实现
z=zeros(b(m),1);%对码字矩阵初始化
x=s(m);
f=max(b(m));%把码字最大长度赋给f,用于进行十进制转二进制
w=dtob(x,f);%调用子程序将十进制转换为二进制
forr=1:b(m)
z(r)=w(r);
end
disp('输出结果为:');
disp('初始概率'),disp(pa(m))
y(i)=1;
end
end
R(i)=pa(i)*K(i);
sum0=sum0+R(i);%求平均码长
c(i)=a(i)*pa(i);
sum1=sum1+c(i);%信息熵
end
K1=sum0;
H=sum1;
Y=H/K1;%用Y来表示编码效率
disp(['信息熵H(X)=',num2str(H),'(bit/sign)']);
disp('概率累加和必须等于1,请重新输入信源分布');
return
elseபைடு நூலகம்
fori=1:k-1%for循环进行降序排列
forn=i+1:k
if(pa(i)<pa(n))
t=pa(i);
pa(i)=pa(n);
pa(n)=t;
end
end
end
end
disp('信源分布概率从大到小为:'),disp(pa)
y=0;%给y赋初值,用来求概率和
f=0;%给f赋初值,用来得到子程序最大循环次数
s=zeros(k,1);%对求和结果进行矩阵初始化
b=zeros(k,1);%对编码位数矩阵初始化
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息论与编码作业香农--费诺编码的matlab实现
班级:
姓名:
学号:
摘要:
将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。

编码在电子计算机、电视、遥控和通讯等方面广泛使用。

其中费诺编码有广泛的应用,通过本次设计,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。

关键字:信息论,费诺编码,matlab
正文:
费诺编码也是一种常见的信源编码方法。

信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字.
香农--费诺编码的matlab实现
编码如下:
clc;
clear;
N=input('N=');%输入信源符号的个数
for i=1:N
fprintf('第%d个',i);
A(i)=input('p=');%输入信源符号概率分布矢量,p(i)<1
if A(i)<=0
error('不符合概率分布')
end
end
A=fliplr(sort(A));%降序排列
[m,n]=size(A);
for i=1:n
B(i,1)=A(i);%生成B的第1列
end
%生成B第2列的元素
a=sum(B(:,1))/2;
for k=1:n-1
if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a)
break;
end
end
for i=1:n%生成B第2列的元素
if i<=k
B(i,2)=0;
else
B(i,2)=1;
end
end
%生成第一次编码的结果
END=B(:,2)';
END=sym(END);
%生成第3列及以后几列的各元素
j=3;
while (j~=0)
p=1;
while(p<=n)
x=B(p,j-1);
for q=p:n
if x==-1
break;
else
if B(q,j-1)==x
y=1;
continue;
else
y=0;
break;
end
end
end
if y==1
q=q+1;
end
if q==p|q-p==1
B(p,j)=-1;
else
if q-p==2
B(p,j)=0;
END(p)=[char(END(p)),'0'];
B(q-1,j)=1;
END(q-1)=[char(END(q-1)),'1'];
else
a=sum(B(p:q-1,1))/2;
for k=p:q-2
if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);
break;
end
end
for i=p:q-1
if i<=k
B(i,j)=0;
END(i)=[char(END(i)),'0'];
else
B(i,j)=1;
END(i)=[char(END(i)),'1'];
end
end
end
end
p=q;
end
C=B(:,j);
D=find(C==-1);
[e,f]=size(D);
if e==n
j=0;
else
j=j+1;
end
end
B
A
END
for i=1:n
[u,v]=size(char(END(i)));
L(i)=v;
end
avlen=sum(L.*A)
实验总结:
经过本次作业,充分学习了费诺编码理论及其重点内容,掌握了费诺编码原理的同时也锻炼了编程水平,为以后的学习中出现的可能问题做好了准备,锻炼了自己的动手能力和设计能力,掌握了一种科技工具,丰富了自己的学习生活。

相关文档
最新文档