信息论与编码实验报告文档格式.docx
- 文档编号:7030340
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:34
- 大小:159.69KB
信息论与编码实验报告文档格式.docx
《信息论与编码实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验报告文档格式.docx(34页珍藏版)》请在冰点文库上搜索。
,"
r"
);
while(!
feof(f)){
fread(temp,1,486,f);
}
fclose(f);
s[0]=*temp;
for(i=0;
i<
strlen(temp);
i++)
{
s[i]=temp[i];
}
for(i=0;
strlen(s);
i++)
if(s[i]=='
'
)
num[26]++;
elseif(s[i]>
='
a'
&
s[i]<
z'
)
num[s[i]-97]++;
A'
Z'
num[s[i]-65]++;
printf("
文档中各个字母出现的频率:
\n"
26;
p[i]=num[i]/strlen(s);
printf("
%3c:
%f\t"
i+65,p[i]);
n++;
if(n==3)
{
n=0;
}
p[26]=num[26]/strlen(s);
空格:
p[26]);
27;
{
if(p[i]!
=0)
result=result+p[i]*log(p[i]);
result=-result;
信息熵为:
%f"
result);
return0;
六、求解结果
其中nan311.txt中的文档如下:
Thereisnohatewithoutfear.Hateiscrystallizedfear,fear’sdividend,fearobjectivized.Wehatewhatwefearandsowherehateis,fearislurking.Thuswehatewhatthreatensourperson,ourvanityandourdreamsandplansforourselves.Ifwecanisolatethiselementinwhatwehatewemaybeabletoceasefromhating.
七、实验总结
通过这次实验,我们懂得了不必运行程序时重新输入文档就可以对文档进行统计,既节省了时间而且也规避了一些输入错误。
在实验中,我们进一步了解到信源熵的计算,理论和实践的结合让我们对这个知识点了解的更加深刻了。
实验二Huffman信源编码
一、实验目的
1.理解信源的最优变长编码的基本思想。
2.熟练掌握Huffman信源编码方法。
二、设计原理
设信源S={s1,s2,…..,sq},其对应的概率分布为P(si)={p1,p2,p3,….,pq},则其编码步骤如下:
(1)将q个信源符号按递减方式排列。
(2)用0、1码符分别表示概率最小的两个信源符号,并将这两个符号合并成一个新的符号,从而得到q-1个符号的新信源成为S信源的缩减信源S1。
(3)将缩减信源S1中的符号仍按递减顺序排列,再将最小两个概率相加,合并成一个符号,并分别用0、1码表示,这样有形成了q-2个缩减信源S2。
(4)依次继续下去,直到缩减信源只剩下两个符号为止,将最后两个符号用0、1分别表示。
(5)从最后一次缩减信源开始,向前返回,沿信源缩减过程的反方向取出所编的马元。
计算定信源和输入信号字母表的Huffman编码,并计算Huffman编码的平均码长。
实验具体要求如下:
信源字母表的概率分布为:
P={0.15,0.12,0.2,0.08,0.04,0.18,0.02,0.09,0.04,0.02,0.06}
输入信号字母表:
U={0,1,2};
1.独立设计信源和输入信号字母表进行Huffman编码,其中信源字母表元素个数要求是8以上,信号字母表元素个数是2以上;
2.输出Huffman编码的平均码长。
MATLAB编码:
function[h,L]=huffman(p,r)
%变量p为符号出现概率所组成的概率向量
%返回值h为利用Huffman编码算法编码后最后得到编码结果
%返回值L为进行Huffman编码后所得编码的码字长度
iflength(find(p<
0))~=0
error('
Notaprob.vector,negativecomponent(s)'
end
%判断概率向量中是否有0元素,有0元素程序显示出错,终止运行
if(sum(p,2)>
1)
Notaprob.vector,componentsdonotaddupto1'
%判断所有符号出现概率之和是否大于1,如果大于1程序显示出错,终止运行
a=length(p);
%测定概率向量长度,将长度值赋给变量n
k=fix((a-1)/(r-1));
l1=a-k*r+k;
q=zeros(1,a);
m=zeros(k+1,a);
mp=m;
q=p;
[m(1,:
),mp(1,:
)]=sort(q);
if(l1>
s=sum(m(1,1:
l1),2);
q=[s,m(1,(l1+1):
a),ones(1,l1-1)];
[m(2,:
),mp(2,:
else
m(2,:
)=m(1,:
mp(2,:
)=1:
1:
a;
fori=3:
k+1
s=sum(m(i-1,1:
r),2);
q=[s,m(i-1,r+1:
a),ones(1,r-1)];
[m(i,:
),mp(i,:
n1=m;
n2=mp;
fori=1:
n1(i,:
)=m(k+2-i,:
n2(i,:
)=mp(k+2-i,:
m=n1;
mp=n2;
c=cell(k+1,a);
forj=1:
r
c{1,j}=num2str(j-1);
fori=2:
k
p1=find(mp(i-1,:
)==1);
forj=1:
c{i,j}=strcat(c{i-1,p1},int2str(j-1));
end
forj=(r+1):
(p1+r-1)
c{i,j}=c{i-1,j-r};
forj=(p1+r):
a
c{i,j}=c{i-1,j-r+1};
ifl1==1
c{k+1,j}=c{k,j};
p1=find(mp(k,:
l1
c{k+1,j}=strcat(c(k,p1),int2str(j-1));
forj=(l1+1):
(p1+l1)
c{k+1,j}=c{k,mp(1,j-l1)};
forj=(p1
(1)+l1+1):
c{k+1,j}=c{k,mp(1,j-l1+1)};
l(j)=length(c{k+1,j});
h=cell(1,a);
h{1,j}=c{k+1,j};
L=sum(l.*m(k+1,:
));
%求平均码长
2、在MATLAB命令窗口中输入:
p=[0.15,0.12,0.2,0.08,0.04,0.18,0.02,0.09,0.04,0.02,0.06];
r=3;
[h,L]=huffman(p,r).
六、运行结果
得出的结论为:
概率
编码
0.15
2120
0.02
11
0.12
2121
0.09
12
0.2
2122
0.04
20
0.08
210
22
211
0.06
0.18
10
L=2.0600
在huffman编码的过程中,我们运用了平时熟悉的数学软件MATLAB的运行来实现,把书本上huffman的算法运用编程来实现。
通过这次实验,使我更加清晰地理解huffman编码的原理及实现过程,并且能够在MATLAB中熟练地进行编码运行。
实验三Shannon编码
1、熟悉离散信源的特点;
2、学习仿真离散信源的方法
3、学习离散信源平均信息量的计算方法
4、熟悉Matlab编程
给定某个信源符号的概率分布,通过以下的步骤进行香农编码
1、信源符号按概率从大到小排列;
2、确定满足下列不等式的整数码长
为
3、为了编成唯一可译码,计算第i个消息的累加概率:
4、将累加概率
变换成二进制数;
5、取
二进制数的小数点后
位即为该消息符号的二进制码字。
2、写出计算离散信源平均信息量的Matlab程序。
3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。
计算如下信源进行香农编码,并计算编码效率:
MATLAB程序:
(1)a=[0.20.180.190.150.170.10.01];
k=length(a);
y=0;
k-1
forn=i+1:
if(a(i)<
a(n))
t=a(i);
a(i)=a(n);
a(n)=t;
s=zeros(k,1);
b=zeros(k,1);
form=1:
s(m)=y;
y=y+a(m);
b(m)=ceil(-log2(a(m)));
z=zeros(b(m),1);
x=s(m);
p=b2d10(x);
forr=1:
b(m)
z(r)=p(r);
disp('
Ê
ä
³
ö
½
á
¹
û
Î
ª
£
º
'
Â
¸
Å
),disp(a(m))
Ç
ó
Í
),disp(s(m))
±
à
ë
»
ý
),disp(b(m))
×
î
Ö
Õ
),disp(z'
(2)functiony=b2d10(x)
8
temp=x.*2;
if(temp<
y(i)=0;
x=temp;
else
x=temp-1;
y(i)=1;
(3)p=[0.20.190.180.170.150.10.01];
sum=0;
sum1=0;
7
a(i)=-log2(p(i));
K(i)=ceil(a(i));
R(i)=p(i)*K(i);
sum=sum+R(i);
c(i)=a(i)*p(i);
sum1=sum1+c(i);
K1=sum;
H=sum1;
Y=H/K1;
disp('
Æ
¾
ù
Ð
Ï
¢
Á
¿
),disp(H)
¤
),disp(K1)
§
),disp(Y)
六、实验结果
输出结果为:
出事概率0.2000,求和结果0,编码位数3,最终编码000
出事概率0.1900,求和结果0.2000,编码位数3,最终编码001
出事概率0.1800,求和结果0.3900,编码位数3,最终编码011
出事概率0.1700,求和结果0.5700,编码位数3,最终编码100
出事概率0.1500,求和结果0.7400,编码位数3,最终编码101
出事概率0.1000,求和结果0.8900,编码位数4,最终编码1110
出事概率0.0100,求和结果0.9900,编码位数7,最终编码1111110
编码效率:
平均信息量2.6087
平均码长3.1400
编码效率0.8308
通过本次的实验,掌握了Shannon编码的实验原理以及编码过程。
Shannon编码中,对概率的排序是最基本的,如果没有将其按照从大到小的顺序排序,则经过MATLAB的程序运行后,将出现错误。
在运用MATLAB编程的过程中,调用了各种函数,实现了编程。
通过与队友的讨论,不但让我们更快的完成MATLAB编码,也深深体会到只有将大家的智慧融合起来,才能更快更好的解决难题。
实验四信道容量的迭代算法
1、进一步熟悉信道容量的迭代算法;
2、学习如何将复杂的公式转化为程序;
3、熟悉程序设计语言的数值计算程序和调试技术。
(1)初始化信源分布
(一般初始化为均匀分布),置迭代计数器k=0,设信道容量相对误差门限为
,
>
0,可设;
(2)
(3)
(4)
(5)如果
,转向(7);
(6)置迭代序号
,转向
(2);
(7)输出
和
的结果;
(8)停止。
1、已知:
信源符号个数r、新宿符号个数s、信道转移概率矩阵P;
2、输入:
任意的一个信道转移概率矩阵,信源符号个数、信宿符号个数和每一个具体的转移概率在运行时从键盘输入;
3、输出:
最佳信源分布P*,信道容量C。
MicrosoftWindows7、
aa.m文件:
clear;
r=input('
输入信源个数:
s=input('
输入信宿个数:
deta=input('
输入信道容量的精度:
Q=rand(r,s);
%创建m*n随机分布矩阵
A=sum(Q,2);
B=repmat(A,1,s);
信源转移概率矩阵:
),p=Q./B%信源转移概率矩阵
i=1:
r;
q(i)=1/r;
原始信源分布:
),q
c=-10e-8;
C=repmat(q'
1,s);
fork=1:
100000
m=p.*C;
%后验概率的分子部分
a=sum(m);
%后验概率的分母部分
su1=repmat(a,r,1);
t=m./su1;
%后验概率矩阵
D=exp(sum(p.*log(t),2));
%信源分布的分子部分
su2=sum(D);
%信源分布的分母部分
q=D/su2;
%信源分布
C=repmat(q,1,s);
c(k+1)=log(sum(exp(sum(p.*log(t),2))))/log
(2);
kk=abs(c(k+1)-c(k))/c(k+1);
if(kk<
=0.000001)
break;
最大信道容量时的信源分布:
q='
),disp(q'
最大信道容量:
c='
),disp(c(k+1))
六、实验结果结果
1)检验:
运行aa.m
输入信源的个数:
2
输入信宿的个数:
3
0.000001
信宿转移概率矩阵:
p=0.50000.30000.2000
0.30000.50000.2000
q=0.50000.5000
最佳信源分布:
q=0.50000.5000
c=0.0365
2)计算信源个数为3,信宿个数为5的信道容量:
5
p=0.04840.13850.30580.28450.2227
0.21040.24710.10770.37620.0585
0.34300.08000.18080.34280.0534
q=0.33330.33330.3333
q=0.46910.17940.3515
c=0.1559
通过实验,我们对信道容量的理解更加深刻了。
信道容量是指信道能无错误传送的最大信息率。
信道的输入、输出都取值于离散符号集,且都用一个随机变量来表示的信道就是离散单符号信道。
由于信道中存在干扰,因此输入符号在传输中将会产生错误,这种信道干扰对传输的影响可用传递概率来描述。
为了评价实际信道的利用率,应具体计算已给信道的容量。
这是一个求最大值的问题。
由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此这也就是求极值的问题。
对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。
对于连续信道,P(x)是一函数,须用变分法求条件极值。
实验过程中,我们虽然也遇到了很多困难,但也正是因为如此,我们才能发现自己基础的薄弱点,学的更有方向。
对于编程方面,我们也有了很大的提升。
实验五率失真函数
验证率失真函数的极值特性,理解相关参数的变化对率失真函数的影响。
(1)输入S,d的初始值、条件概率、输出分布等值;
(2)计算输出分布
(3)进入迭代,标志为0或者误差大于指定eps则迭代,否则退出迭代;
(4)计算一个互信息
(5)计算一个条件概率分布
(6)重算一次(4),并计算
(7)重算(3)-(7)步骤,直到退出迭代;
三、实验环境
VisualStudio2005profession
四、编码程序
iostream>
iomanip>
usingnamespacestd;
//Definesomeglobalvar
constintM=10;
//M元信源
constdoubleS=-50;
//迭代算法中的中间量,S越小,允许最大失真度D越小,当S很小时(例如-100),R(D)=H(X)
staticintd[M][M];
//失真函数
staticdoubleq[M],Pji[M][M];
//输出分布和条件概率分布
staticdoublePi[M]={0.4,0.1,0.25,0.1,0.05,0.05,0.01,0.02,0.005,0.015};
//初始化信源的概率分布
constintsystemDefine=2;
//定义进制(默认为2进制,结果为bit,为e时,结果为nat)
constdoubleeps=1e-8;
//允许误差
//计算输出分布(qj)
voidcalcOutDistribution()
inti,j;
for(j=0;
j<
M;
j++)
q[j]=0;
for(i=0;
i<
i++)
{
q[j]+=Pi[i]*Pji[i][j];
}
}
//计算条件概率分布pji
voidcalcProbabilityDistribution()
inti,j,k;
doubletemp=0;
i++)
temp=0;
for(k=0;
k<
k++)
temp=temp+q[k]*exp(S*d[i][k]);
}
for(j=0;
//设定一个初始的条件概率分布
Pji[i][j]=q[j]*exp(S*d[i][j])/temp;
//取得R(r,r)=I(qj;
Pji)
【实际上就是根据互信息量公式求互信息】
doublegetSelfInformation()
doubleI=0;
{
I+=Pi[i]*Pji[i][j]*log(Pji[i][j]/q[j])/log(systemDefine);
//求互信息量
returnI;
intmain(intargc,char*argv[])
doubleprobabilityCount=0.0;
//概率和
for(intk=0;
probabilityCount+=Pi[k];
//和不为1,说明概率有错误
if(fabs(probabilityCount-1.0)>
eps)
cout<
<
"
概率和不为1,程序异常退出!
e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 编码 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)