信息论matlab的实验用到的编码

合集下载

霍夫曼编码的matlab实现(信源编码实验)资料

霍夫曼编码的matlab实现(信源编码实验)资料

霍夫曼编码的m a t l a b 实现(信源编码实验)重庆交通大学信息科学与工程学院综合性设计性实验报告专业班级:通信工程2012级1班学号: 631206040118姓名:王松实验所属课程:信息论与编码实验室(中心):软件与通信实验中心指导教师:黄大荣2015年4月霍夫曼编码的matlab实现一、实验目的和要求。

利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。

本实验用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理。

霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

离散无记忆信源:例如U u1u2u3u4u5P(U) = 0.4 0.2 0.2 0.1 0.1通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、实验步骤分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

信息论与编码实习报告

信息论与编码实习报告

信息论与编码实习报告指导老师:姓名:班级:学号:实验一绘制二进制熵函数曲线一、内容用Matlab软件制作二进制熵函数曲线。

二、要求1.掌握Matlab绘图函数2.掌握、理解熵函数表达式及其性质三.Matlab程序及实验结果1.matlab程序:p=0.00001:0.001:1;h=-p.*log2(p)-(1-p).*log2(1-p);plot(p,h);title('二进制熵函数曲线');ylabel('H(P,1-P)')2.运行结果:结果分析:从图中可已看出当p=0.5即信源等概时熵取得最大值。

实验二一般信道容量迭代算法一、内容编程实现一般信道容量迭代算法。

伪代码见教材。

二、要求1.掌握一般信道容量迭代算法的原理2.掌握MA TLAB开发环境的使用(尤其是程序调试技巧),或者使用C语言完成程序设计三.Matlab程序及运行结果1.matlab程序:clc;clear all;N = input('输入信源符号X的个数N=');M = input('输入信源符号Y的个数M=');p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零fprintf('输入信道矩阵概率\n')for i=1:Nfor j=1:Mp_yx(i,j)=input('p_yx='); %输入信道矩阵概率if p_yx(i)<0error('不符合概率分布')endendEndfor i=1:N %各行概率累加求和s(i)=0;for j=1:Ms(i)=s(i)+p_yx(i,j);endendfor i=1:N %判断是否符合概率分布if (s(i)<=0.999999||s(i)>=1.000001)error('不符合概率分布')endendb=input('输入迭代精度:'); %输入迭代精度for i=1:Np(i)=1.0/N; %取初始概率为均匀分布endfor j=1:M %计算Q(j)Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endendF(i)=exp(f(i));endx=0;for i=1:N %计算x x=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=1;while((IU-IL)>=b) %迭代计算for i=1:Np(i)=p(i)*F(i)/x; %重新赋值p(i) endfor j=1:M %计算Q(j) Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endEndF(i)=exp(f(i));endx=0;for i=1:N %计算xx=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=n+1;endfprintf('信道矩阵为:\n');disp(p_yx);fprintf('迭代次数n=%d\n',n);fprintf('信道容量C=%f比特/符号',IL);2.运行结果为:若输入信道矩阵为:0.8500 0.15000.7500 0.2500则运行结果为:实验四线性分组码的信道编码和译码一、内容编程实现线性分组码(6,2)重复码的信道编码和译码。

《信息论》实验指导书—-应用MATLAB软件实现

《信息论》实验指导书—-应用MATLAB软件实现

《信息论》实验指导书—-应用M A T L A B软件实现-CAL-FENGHAI.-(YICAI)-Company One1《信息与编码理论》上机实验指导书———————应用MATLAB软件实现UPC通信工程系前言本实验系列是采用MATLAB软件,主要针对《信息论基础》课程中的相关内容进行的实验。

MATLAB是一完整的并可扩展的计算机环境,是一种进行科学和工程计算的交互式程序语言。

它的基本数据单元是不需要制定维数的矩阵,它可直接用于表达数学的算式和技术概念,解决同样的数值计算问题,使用MATLAB要比使用Basic、Fortran和C语言等提高效率许多倍。

MATLAB还是一种有利的教学工具,在大学的线性代数课程以及其它领域的高一级课程的教学中,已称为标准的教学工具。

该指导书共安排了4个实验,现就一些情况作简要说明:各实验要求学生在MATLAB系统上尽量独立完成,弄懂。

实验内容紧扣课程教学内容的各主要基本概念,希望同学们在完成每个实验后,对所学的内容起到巩固和加深理解的作用。

每个实验做完后必须交一份实验报告。

恳请各位实验老师和同学在实验中提出宝贵意见,以利于以后改进提高。

目录实验一离散信源及其信息测度 (3)实验二离散信道及其容量 (6)实验三无失真信源编码 (8)实验四有噪信道编码 (10)附录部分常用MATLAB命令 (12)实验一 离散信源及其信息测度一、[实验目的]离散无记忆信源是一种最简单且最重要的信源,可以用完备的离散型概率空间来描述。

本实验通过计算给定的信源的熵,加深对信源及其扩展信源的熵的概念的理解。

二、[实验环境]windows XP,MATLAB三、[实验原理]信源输出的各消息的自信息量的数学期望为信源的信息熵,表达式如下 1()[()]()log ()qi i i H X E I xi p x p x ===-∑信源熵是信源的统计平均不确定性的描述,是概率函数()p x 的函数。

信息论与编码matlab

信息论与编码matlab

信息论实验报告姓名胡小辉班级电子信息工程0902 学号 **********1.实验目的1、掌握哈夫曼编码、费诺编码、汉明码原理;2、熟练掌握哈夫曼树的生成方法;3、学会利用matlab、C语言等实现Huffman编码、费诺编码以及hamming编码。

2.实验原理Huffman编码:哈夫曼树的定义:假设有n个权值,试构造一颗有n个叶子节点的二叉树,每个叶子带权值为wi,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树;实现Huffman编码原理的步骤如下:1. 首先将信源符号集中的符号按概率大小从大到小排列。

2. 用0和1表示概率最小的两个符号。

可用0表示概率小的符号,也可用1表示概率小的符号,但整个编码需保持一致。

3. 将这两个概率最小的符号合并成一个符号,合并符号概率为最小概率之和,将合并后的符号与其余符号组成一个N-1的新信源符号集,称之为缩减符号集。

4. 对缩减符号集用步骤1,2操作5. 以此类推,直到只剩两个符号,将0和1分别赋予它们。

6. 根据以上步骤,得到0,1赋值,画出Huffman码树,并从最后一个合并符号回朔得到Huffmaan编码。

费诺编码:费诺编码的实现步骤:1、将信源消息符号按其出现的概率大小依次排列:。

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

3、将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。

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

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

hamming编码:若一致监督矩阵H 的列是由不全为0且互不相同的所有二进制m(m≥2的正整数)重组成,则由此H矩阵得到的线性分组码称为[2m-1,2m-1-m,3]汉明码。

我们通过(7,4)汉明码的例子来说明如何具体构造这种码。

设分组码(n,k)中,k = 4,为能纠正一位误码,要求r≥3。

信道编码-MATLAB仿真实验中的应用

信道编码-MATLAB仿真实验中的应用

⚫ 输入参数2——trellis,卷积码编码器的网格结构;
⚫ 输入参数3——tblen,a positive integer scalar,用于规定回溯深 度。If the code rate is 1/2, a typical value for tblen is about five times the constraint length of the code;
⚫ 输入参数1——msg,未编码的信息符号序列,二进制矢量形式; ⚫ 输入参数2——trellis,卷积码编码器的网格结构; ⚫ 输出参数——code,编码后的卷积码符号序列,二进制矢量形式。
⚫ 卷积码译码的MATLAB函数为:
⚫ vitdec
卷积码的维特比译码(二进制数据)
⚫ 最常用的函数格式为:
⚫ 输入参数5—— dectype,指示译码器的判决类型。其取值不同, 对应的输入参数1——code的数据类型也不同。其取值如下表:
Values of Meaning dectype Input
'unquant' 软判决,code的数据类型为实数(未量化),其中1表示逻 辑‘0’,-1表示逻辑‘1’ 。
decoded = vitdec(code,trellis,tblen,opmode,dectype);
decoded = vitdec(code,trellis,tblen,opmode,'soft',nsdec)
⚫ 输入参数1——code,维特比译码器的输入符号序列,矢量形式。以 前述2/3码率的编码器结构为例,每个符号代表编码器输出的3个bit;
一、信道编码概述 四、卷积码译码
二、卷积码的结构 描述
三、卷积码编码
⚫ 信道编码又称检纠错编码,通过增加一定的 冗余度以提高数字通信系统的可靠性。

MATLAB中的信号编码与解码技巧

MATLAB中的信号编码与解码技巧

MATLAB中的信号编码与解码技巧引言现代通信系统中,信号编码和解码是关键技术,它们在数据传输和存储中扮演着至关重要的角色。

MATLAB作为一种强大的数学计算软件和编程环境,提供了丰富的功能和工具,用于信号处理和通信系统建模。

本文将探讨MATLAB中的一些常见信号编码和解码技巧,以提供读者对这一主题的深入理解。

一、数字信号编码1. PCM编码脉冲编码调制(PCM)是一种常用的数字信号编码技术,在语音和音频传输中广泛应用。

MATLAB提供了丰富的函数,可以帮助我们实现PCM编码。

例如,使用`audioread`函数可以读取音频文件,并使用`pcmenco`函数进行PCM编码。

2. Huffman编码霍夫曼编码是一种无损数据压缩算法,可以根据数据的统计特性进行代码设计。

在MATLAB中,`huffmandict`函数可用于生成霍夫曼编码字典,`huffmanenco`函数用于对数据进行编码,`huffmandeco`函数用于解码。

二、模拟信号编码1. AM编码幅度调制(AM)是一种传统的模拟信号编码技术,常用于广播和无线电通信。

在MATLAB中,我们可以使用`ammod`函数实现AM编码,并使用`amdemod`函数进行解调。

2. FM编码频率调制(FM)是另一种常见的模拟信号编码技术,广泛应用于音频和视频传输。

在MATLAB中,`fmmod`函数可用于FM编码,`fmdemod`函数可用于解调。

三、数字信号解码1. PCM解码PCM编码的逆过程是PCM解码,MATLAB中的`pcmdeco`函数可用于解码PCM信号并恢复原始信号。

2. Huffman解码通过使用霍夫曼编码表,我们可以对霍夫曼编码进行解码。

在MATLAB中,`huffmandeco`函数可用于解码数据,并使用`huffmanenco`函数所生成的编码字典。

四、应用实例:数字音频编码数字音频编码是一个实际应用领域,通过对音频信号进行编码和解码,可以实现音频数据的压缩和传输。

信息论与编码实验报告

信息论与编码实验报告

实验一:计算离散信源的熵一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。

四、求解:1、习题:A 地天气预报构成的信源空间为:()⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡6/14/14/13/1x p X 大雨小雨多云晴 B 地信源空间为:17(),88Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦ 小雨晴 求各种天气的自信息量和此两个信源的熵。

2、程序代码:p1=[1/3,1/4,1/4,1/6];p2=[7/8,1/8];H1=0.0;H2=0.0;I=[];J=[];for i=1:4H1=H1+p1(i)*log2(1/p1(i));I(i)=log2(1/p1(i));enddisp('自信息I分别为:');Idisp('信息熵H1为:');H1for j=1:2H2=H2+p2(j)*log2(1/p2(j));J(j)=log2(1/p2(j));enddisp('自信息J分别为');Jdisp('信息熵H2为:');H23、运行结果:自信息量I分别为:I = 1.5850 2.0000 2.0000 2.5850信源熵H1为:H1 = 1.9591自信息量J分别为:J =0.1926 3.0000信源熵H2为:H2 =0.54364、分析:答案是:I =1.5850 2.0000 2.0000 2.5850 J =0.1926 3.0000H1 =1.9591; H2 =0.5436实验2:信道容量一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

信息论matlab的实验用到的编码

信息论matlab的实验用到的编码
if (i<n)
for k=(maxN-1):-1:i
P(:,k+1)=P(:,k);
end
end
end
P(:,i)=MAX;
end
p=P(1,:);
x=P(2,:);
% shannon编码生成器%
%函数说明:%
% [W,L,q]=shannon(p)为shannon编码函数%
% p为信源的概率矢量,W为编码返回的码字%
% Pb:输出概率矩阵,Pab:反向转移概率矩阵%
% C:初始信道容量,r:输入符号数,s:输出符号数%
%**************************************************%
function [CC,Paa]=ChannelCap(P,k)
%提示错误信息
if (length(find(P<0))~=0)
current_index=next_index;
current_P=next_P;
W(i,j)=code_num;
j=j+1;
if (length(current_P)==1)
break;
end
end
l(i)=length(find(abs(W(i,:))~=0)); %得到各码字的长度
end
L=sum(P.*l); %计算平均码字长度
% L为编码返回的平均码字长度,q为编码效率%
%*****************************************%
function [W,L,q]=shannon(p)
%提示错误信息
if (length(find(p<=0))~=0)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
current_index=i;
j=1;
current_P=P;
while 1
[next_P,code_num,next_index]=compare(current_P,current_index);
current_index=next_index;
current_P=next_P;
W(i,j)=code_num;
s2='Shannon编码平均码字长度L:';
s3='Shannon编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
附录D Fano编码
%函数说明:%
% [next_P,next_index,code_num]=compare(current_P,current_index)%
附录B 离散无记忆信道容量的迭代计算
%信道容量C的迭代算法%
%函数说明:%
% [CC,Paa]=ChannelCap(P,k)为信道容量函数%
%变量说明:%
% P:输入的正向转移概率矩阵,k:迭代计算精度%
% CC:最佳信道容量,Paa:最佳输入概率矩阵%
% Pa:初始输入概率矩阵,Pba:正向转移概率矩阵%
s5='输出符号数s:';
s6='迭代计算精度k:';
for i=1:r
B{i}=i;
end
disp(s0);
disp(s1),disp(B),disp(Paa);
disp(s4),disp(r);
disp(s5),disp(s);
disp(s2),disp(CC);
disp(s6),disp(k);
end
end
% (2)再求Pab
suma=zeros(1,s);
for j=1:s
for i=1:r
Pab(j,i)=Pa(i)*Pba(i,j)/(Pb(j)+eps);
suma(j)=suma(j)+Pa(i)*Pba(i,j)*log2((Pab(j,i)+eps)/(Pa(i)+eps));
end
if (abs(sum(p)-1)>10e-10)
error('Not a ,component do not add up to 1') %判断是否符合概率和为1
end
% 1)排序
n=length(p);
x=1:n;
[p,x]=array(p,x);
% 2)计算代码组长度l
l=ceil(-log2(p));
% L为编码返回的平均码字长度,q为编码效率%
%*****************************************%
function [W,L,q]=shannon(p)
%提示错误信息
if (length(find(p<=0))~=0)
error('Not a ,negative component'); %判断是否符合概率分布条件
end
% 3)求信道容量C
C=sum(suma);
% 4)求下一次Pa,即Paa
L=zeros(1,r);
sumaa=0;
for i=1:r
for j=1:s
L(i)=L(i)+Pba(i,j)*log(Pab(j,i)+eps);
end
a(i)=exp( L(i));
end
sumaa=sum(a);
Pa=(1/(r+eps))*ones(1,r);
sumrow=zeros(1,r);
Pba=P;
% 2)进行迭代计算
n=0;
C=0;
CC=1;
while abs(CC-C)>=k
n=n+1;
% (1)先求Pb
Pb=zeros(1,s);
for j=1:s
for i=1:r
Pb(j)=Pb(j)+Pa(i)*Pba(i,j);
error('Not a ,negative component'); %判断是否符合概率分布条件
end
if (abs(sum(P)-1)>10e-10)
error('Not a ,component do not add up to 1');
end
H=(sum(-P.*log2(P)))/(log2(r)+eps);
error('Not a ,negative component'); %判断是否符合概率分布条件
end
if (abs(sum(P')-1)>10e-10)
error('Not a ,component do not add up to 1') %判断是否符合概率和为1
end
% 1)初始化Pa
[r,s]=size(P);
disp(s3),disp(n);
附录C Shannon编码
%函数说明:%
% [p,x]=array(P,X)为按序排序的函数%
% P为信源的概率矢量,X为概率元素的下标矢量%
% p为排序后返回的信源的概率矢量%
% x为排序后返回的概率元素的下标矢量%
%*******************************************%
% Pb:输出概率矩阵,Pab:反向转移概率矩阵%
% C:初始信道容量,r:输入符号数,s:输出符号数%
%**************************************************%
function [CC,Paa]=ChannelCap(P,k)
%提示错误信息
if (length(find(P<0))~=0)
% L为编码返回的平均码字长度,q为编码效率%
%*****************************************%
function [W,L,q]=fano(P)
%提示错误信息
if (length(find(P<=0))~=0)
error('Not a ,negative component'); %判断是否符合概率分布条件
function [next_P,code_num,next_index]=compare(current_P,current_index);
n=length(current_P);
add(1)=current_P(1);
% 1)求概率的依次累加和
for i=2:n
add(i)=0;
add(i)=add(i-1)+current_P(i);
s2='Fano编码平均码字长度L:';
s3='Fano编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
附录E Huffman编码
Huffman编码(1)
% huffman编码生成器%
%函数说明:%
next_P=current_P(1:k);
else
next_index=current_index-k;
code_num=49;
next_P=current_P((k+1):n);
end
% fano编码生成器%
%函数说明:%
% [W,L,q]=fano(P)为fano编码函数%
% P为信源的概率矢量,W为编码返回的码字%
for i=1:n
B{i}=i;
end
[n,m]=size(W);
TEMP=32*ones(n,5);
W=[W,TEMP];
W=W';
[n,m]=size(W);
W=reshape(W,1,n*m);
W=sprintf('%s', W);
s0='很好!输入正确,编码结果如下:';
s1='Fano编码所得码字W:';
j=j+1;
if (length(current_P)==1)
break;
end
end
l(i)=length(find(abs(W(i,:))~=0)); %得到各码字的长度
end
L=sum(P.*l); %计算平均码字长度
H=entropy(P,2); %计算信源熵
q=H/L; %计算编码效率
%打印输出结果
end
if (abs(sum(P)-1)>10e-10)
error('Not a ,component do not add up to 1') %判断是否符合概率和为1
end
% 1)排序
n=length(P);
x=1:n;
[P,x]=array(P,x);
% 2)将信源符号分组并得到对应的码字
for i=1:n
error('Not a ,negative component'); %判断是否符合概率分布条件
end
if (abs(sum(P)-1)>10e-10)
error('Not a ,component do not add up to 1') %判断是否符合概率和为1
if (i<n)
for k=(maxN-1):-1:i
相关文档
最新文档