信息论与编码实验报告-率失真函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称:信息论与编码姓名:
系:
专业:
年级:
学号:
指导教师:
职称:
年月日
实验五 率失真函数
一、 实验目的
验证率失真函数的极值特性,理解相关参数的变化对率失真函数的影响。

二、实验原理
(1)输入S ,d 的初始值、条件概率、输出分布等值; (2)计算输出分布∑==M
i j i j pji pi q 1;
(3)进入迭代,标志为0或者误差大于指定eps 则迭代,否则退出迭代; (4)计算一个互信息∑∑===M
i M
j j
ij ij i q pji pji pi pji qj I 11)log(
);(;
(5)计算一个条件概率分布∑==
M
k Sd k Sd j ik
ij
e
q e
q i j P 1
);(;
(6)重算一次(4),并计算∑==M i ij ij i d pji pi D 1

(7)重算(3)-(7)步骤,直到退出迭代;
三、实验环境
Microsoft Windows 7、 Visual Studio 2005 profession
四、编码程序
#include <iostream>
#include <math.h> #include <iomanip> 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<M; j++)
{
q[j]=0;
for(i=0; i<M; i++)
{
q[j] += Pi[i] * Pji[i][j];
}
}
}
//计算条件概率分布pji
void calcProbabilityDistribution()
{
int i, j, k;
double temp = 0;
for(i=0; i<M; i++)
{
temp = 0;
for(k=0; k<M; k++)
{
temp = temp + q[k] * exp(S*d[i][k]);
}
for(j=0; j<M; j++)
{
//设定一个初始的条件概率分布
Pji[i][j] = q[j] * exp(S*d[i][j])/temp;
}
}
}
//取得R(r,r)=I(qj;Pji)【实际上就是根据互信息量公式求互信息】double getSelfInformation()
{
int i, j;
double I=0;
for(i=0; i<M; i++)
for(j=0; j<M; j++)
{
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<M; k++)
{
probabilityCount += Pi[k];
}
//和不为1,说明概率有错误
if(fabs(probabilityCount-1.0) > eps)
{
cout<<"概率和不为1,程序异常退出!"<<endl;
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<M; i++)
{
q[i] = 0;
}
//率失真函数的初始化,根据汉明失真距离来初始化
for(i=0; i<M; i++)
{
for(j=0; j<M; j++)
{
if(i == j)
{
d[i][j] = 0;
}
else
{
d[i][j] = 1;
}
}
}
for(i=0; i<M; i++)
{
for(j=0; j<M; j++)
{
//设定一个初始的条件概率分布
Pji[i][j] = 1/(double)(M);
}
}
//计算输出分布
calcOutDistribution();
//迭代算法
cout<<"误差精度:"<<eps<<endl;
while(flag == 0 || fabs(mutualInformation2-mutualInformation1) > eps)
{
cout<<setprecision(20)<<endl<<"第"<<++nCount<<"次迭代"<<endl;
flag = 1;
//获得一个互信息R(r, r)
mutualInformation1 = getSelfInformation();
//计算下一个条件概率分布
calcProbabilityDistribution();
//在上面的原来的输出分布q和新生成的条件概率分布Pji的基础上获得新的互信息R(r, r+1)
mutualInformation2 = getSelfInformation();
//再计算条件概率分布
calcOutDistribution();
cout<<"互信息1:"<<mutualInformation1<<endl<<"互信息2:"<<mutualInformation2<<endl;
for(i=0; i<M; i++)
{
for(j=0; j<M; j++)
{
//求最大允许失真度D
D = D + Pi[i]*Pji[i][j]*d[i][j];
}
}
cout<<"D = "<<D<<endl;
cout<<"R(D) = "<<mutualInformation2<<endl; //这是利用迭代算法求出的最大允许失真度为D时的R(D)
cout<<"------------================------------"<<endl;
}
return 0;
}
五、实验结果
运行实验结果如下:
六、实验总结
通过这次实验,让我们更好的掌握了率失真的求解方法,而且通过计算机解决问题效率提高了很多,节省了很多繁琐的步骤,更加直观和方便的让我们了解到相关参数变化对率失真的影响。

相关文档
最新文档