信息论与编码实验报告Word格式.docx
- 文档编号:21232033
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:25
- 大小:141.82KB
信息论与编码实验报告Word格式.docx
《信息论与编码实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验报告Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
FILE*f;
char*temp=newchar[485];
f=fopen("
nan311.txt"
"
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中的文档如下:
Thereisno,ourvanityandourdreamsandplansforourselves.Ifwecanisolatethiselementinwhatwe[(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});
(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=HK1;
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,最终编码
编码效率:
平均信息量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)=1r;
原始信源分布:
),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=Dsu2;
%信源分布
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
四、编码程序
#include<
iostream>
math.()
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,程序异常退出!
endl;
return-1;
前两个变量代表求的相邻的两个互信息R(r,r)和R(r,r+1);
D代表限定失真
doublemutualInformation1,mutualInformation2,D;
inti,j,flag,nCount;
初始值
mutualInformation1=0;
mutualInformation2=0;
D=0;
flag=0;
nCount=0;
迭代次数指示器
initmothod
输出分布的初始化
q[i]=0;
率失真函数的初始化,根据汉明失真距离来初始化
if(i==j)
{
d[i][j]=0;
}
else
d[i][j]=1;
设定一个初始的条件概率分布
Pji[i][j]=1(double)(M);
计算输出分布
calcOutDistribution();
迭代算法
cout<
误差精度:
eps<
while(flag==0||fabs(mutualInformation2-mutualInformation1)>
setprecision(20)<
endl<
第"
++nCount<
次迭代"
flag=1;
获得一个互信息R(r,r)
mutualInformation1=getSelfInformation();
计算下一个条件概率分布
calcProbabilityDistribution();
在上面的原来的输出分布q和新生成的条件概率分布Pji的基础上获得新的互信息R(r,r+1)
mutualInformation2=getSelfInformation();
再计算条件概率分布
互信息1:
mutualInformation1<
互信息2:
mutualInformation2<
for(j=0;
求最大允许失真度D
D=D+Pi[i]*Pji[i][j]*d[i][j];
}
D="
D<
R(D)="
这是利用迭代算法求出的最大允许失真度为D时的R(D)
================"
return0;
五、实验结果
运行实验结果如下:
六、实验总结
通过这次实验,让我们更好的掌握了率失真的求解方法,而且通过计算机解决问题效率提高了很多,节省了很多繁琐的步骤,更加直观和方便的让我们了解到相关参数变化对率失真的影响。
实验六差错控制方法
1、了解纠错编码的基本原理
2、了解几种常用编码:
奇偶校验码、正反码等,线性分组码、循环码、卷积码的编解码原理
3、重点掌握线性分组码、循环码、卷积码的编解码原理。
N个重复码是一种将输入比特重复n遍
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 编码 实验 报告