信息论与编码实验报告 下载本文

实用文档

最大信道容量:c= 0.0365

2)计算信源个数为3,信宿个数为5的信道容量: 运行aa.m

输入信源的个数:3 输入信宿的个数:5

输入信道容量的精度:0.000001

信宿转移概率矩阵:p =0.0484 0.1385 0.3058 0.2845 0.2227 0.2104 0.2471 0.1077 0.3762 0.0585 0.3430 0.0800 0.1808 0.3428 0.0534 原始信源分布:q = 0.3333 0.3333 0.3333 最佳信源分布:q =0.4691 0.1794 0.3515 最大信道容量:c =0.1559

七、实验总结

通过实验,我们对信道容量的理解更加深刻了。信道容量是指信道能无错误传送的最大信息率。信道的输入、输出都取值于离散符号集,且都用一个随机变量来表示的信道就是离散单符号信道。由于信道中存在干扰,因此输入符号在传输中将会产生错误,这种信道干扰对传输的影响可用传递概率来描述。为了评价实际信道的利用率,应具体计算已给信道的容量。这是一个求最大值的问题。由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此这也就是求极值的问题。对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。对于连续信道,P(x)是一函数,须用变分法求条件极值。

实验过程中,我们虽然也遇到了很多困难,但也正是因为如此,我们才能发

现自己基础的薄弱点,学的更有方向。对于编程方面,我们也有了很大的提升。

实验五 率失真函数

.

实用文档

一、 实验目的

验证率失真函数的极值特性,理解相关参数的变化对率失真函数的影响。

二、实验原理

(1)输入S,d的初始值、条件概率、输出分布等值; (2)计算输出分布qj??piipjij;

i?1M(3)进入迭代,标志为0或者误差大于指定eps则迭代,否则退出迭代; (4)计算一个互信息I(qj;pji)???piipjiijlog(i?1j?1MMpjiijqj);

(5)计算一个条件概率分布P(j;i)?qjeMkk?1Sdij;

Sdik?qeMi?1(6)重算一次(4),并计算D??piipjiijdij;

(7)重算(3)-(7)步骤,直到退出迭代;

三、实验环境

Microsoft Windows 7、 Visual Studio 2005 profession

四、编码程序

#include

#include #include using namespace std; //Define some global var const int M = 10; //M元信源 const double S = -50; //迭代算法中的中间量,S越小,允许最大失真度D越小,当S很小时(例如-100),R(D)=H(X) static int d[M][M]; //失真函数 static double q[M], Pji[M][M]; //输出分布和条件概率分布

static double Pi[M] = {0.4, 0.1, 0.25, 0.1, 0.05, 0.05, 0.01, 0.02, 0.005, 0.015}; //初始化信源的概率分布 const int systemDefine = 2; //定义进制(默认为2进制,结果为bit,为e时,结果为nat) const double eps = 1e-8; //允许误差

.

实用文档

//计算输出分布(qj)

void calcOutDistribution() { int i, j; for(j=0; j

//计算条件概率分布pji

void calcProbabilityDistribution() { int i, j, k; double temp = 0; for(i=0; i

//取得R(r,r)=I(qj;Pji)【实际上就是根据互信息量公式求互信息】 double getSelfInformation() {

int i, j;

double I=0; for(i=0; i

.

实用文档

{

I += Pi[i] * Pji[i][j] * log(Pji[i][j]/q[j])/log(systemDefine); //求互信息量

} } return I; }

int main(int argc, char *argv[]) { double probabilityCount = 0.0; //概率和 for(int k=0; k eps) { cout<<\概率和不为1,程序异常退出!\ return -1; } //前两个变量代表求的相邻的两个互信息R(r, r)和R(r, r+1);D代表限定失真

double mutualInformation1, mutualInformation2, D; int i, j, flag, nCount; //初始值 mutualInformation1 = 0; mutualInformation2 = 0; D = 0; flag = 0; nCount = 0; //迭代次数指示器

//init mothod //输出分布的初始化 for(i=0; i

.

实用文档

for(i=0; i

if(i == j) { d[i][j] = 0; } else { d[i][j] = 1; } } }

for(i=0; i

//计算输出分布 calcOutDistribution();

//迭代算法 cout<<\误差精度:\

while(flag == 0 || fabs(mutualInformation2-mutualInformation1) > eps) { cout<

mutualInformation1 = getSelfInformation(); //计算下一个条件概率分布 calcProbabilityDistribution(); //在上面的原来的输出分布q和新生成的条件概率分布Pji的基础上获得新的互信息R(r, r+1)

mutualInformation2 = getSelfInformation();

.