离散信道容量迭代实现

合集下载

离散消息信道容量的迭代计算

离散消息信道容量的迭代计算
此仿真中不同的信道转移概率表示不同的离散信道,信道容量对比仿真分析 如下表所示:
表 1. 不同离散信道的迭代算法对比
信道转移矩阵
信道容量 精度
输入概率
迭代次数
1/8 7/8 7/8 1/8
0.4564
0.0001
0.5 0.5
1
1/8 7/8 3/10 7/10
0.0338
0.0001
0.5012 0.4988 1
j 1
j 1
s
s
令 j C log P(bj ) 则 P(bj / ai ) j P(bj / ai ) log P(bj / ai )
j 1
j 1
若 r=s,此方程有解,可以解出 s 各未知数β ,再根据 j
P(bj ) 2 j C

s
2 j C 1
j 1 s
从而 C log 2j
关键词:离散信源 率失真函数 Blahut 迭代算法
一.离散消息信道容量
1.1 离散信道
设新到的输入符号集合 X 为随机变量集合,则输出符号集合 Y 也为随机变 量集合。因为信道有随机噪声干扰,使 Y 在 X 给定条件下为随机变量,所以用 条件概率 P(Y|X 描述 Y 与 X 之间的关系,其信道模型如图 1 所示:
参考文献
[1]. 田宝玉,杨洁,贺志强,王晓湘. 信息论基础. 人民邮电出版社. 2008 [2]. 吴伟陵. 信息处理与编码. 人民邮电出版社. 1991
j 1
信道容量求出后,计算并没有结束,必须解出相应的 p(xi ) ,并确认所有的
p(xi ) 都大于或等于 0 时,所求的 C 才存在,因为在我们对 I(X;Y)求偏导时只限
n
p(xi )

离散信道容量迭代实现

离散信道容量迭代实现

中文摘要信道是信息传递的通道,承担信息的传输和储存的任务,是构成通信系统的重要组成部分。

信道容量是指信道能够传输信息量的大小。

信道容量的研究在现实中有着非常重要的理论意义。

而信道容量的计算是一个比较复杂的问题,所以我们要借助于数学软件Matlab来解决这个难题。

本文的第一部分从信道容量的基本概念、基本原理、信道模型及分类等方面系统的介绍了信道容量。

并在此基础上,介绍了一般信道容量的计算步骤。

本文的第二部分开始介绍信道容量的迭代算法及迭代算法在Matlab中的实现,举例检验迭代算法在Matlab中实现的程序的可行性关键词信道容量 Matlab 迭代算法AbstractChannel is a channel of information transmission. And it take on the task of information transmission and storage. Channel is an important part of communication system. Channel capacity is the size of the amount of information can be transmitted. It has important significances in reality. However, calculating the channel capacity is a complex issue. So we must use the mathematical software Matlab to solve this problem.The first part of the article, it introduces channel capacity by the basic concepts, principles and the classification of channel models. On this basis, introduce and discuss the calculation steps of the general channel capacity.The second part of the article, it introduces the Iterative algorithm of the channel capacity and implementes the iterative algorithm in Matlab. After that, by realizing the feasibility of the procedure, we make some examples. And also analyze the procedure.Key word :channel capacity、matlab目录引言 (6)1、离散信道的数学模型 (6)2、信道容量和最佳输入概率分布 (6)2.1信道容量 (6)2.2最佳输入概率分布 (7)3、信道容量和平均互信息的计算步骤 (7)3.1平均互信息的计算 (7)3.2信道容量的计算 (7)4、信道容量的迭代算法 (8)5、实例分析 (9)结论 (10)参考文献 (11)附 (12)引言本文主要结合实例对离散信道及其信道容量进行相关阐述,及用迭代算法实现离散信道容量1、离散信道的数学模型设离散信道的输入为一个随机变量X ,相应的输出的随机变量为Y ,如图所示: 规定一个离散信道应有三个参数: 输入信号:X={X1, X2, …, XN} 输出信号:Y={Y1, Y2, …, YN}信道转移概率:P(y|x) 描述了输入信号和输出信号之间的依赖关系 。

信道容量matlab,离散无记忆信道容量的matlab算法

信道容量matlab,离散无记忆信道容量的matlab算法

信道容量matlab,离散⽆记忆信道容量的matlab算法《离散⽆记忆信道容量的matlab算法》由会员分享,可在线阅读,更多相关《离散⽆记忆信道容量的matlab算法(2页珍藏版)》请在⼈⼈⽂库⽹上搜索。

1、functionI,pp=channelcapacity(P,k)%I是信道容量,pp是最佳⼊⼝分布,P是信道概率转移矩阵,k是迭代精度if nargin=k %迭代过程n=n+1;pb=zeros(1,b);%pb是输出概率for j=1:bfor i=1:apb(j)=pb(j)+pa(i)*Pji(i,j);endendsuma=zeros(1,b);for j=1:bfori=1:aPij(j,i)=pa(i)*Pji(i,j)/(pb(j)+eps); %Pij是反向概率转移矩阵suma(j)=suma(j)+pa(i)*Pji(i,j)*log2(Pij(j,i)+eps)/(p。

2、a(i)+eps);endendIo=sum(suma);%求信道容量的过程L=zeros(1,a);sumaa=0;for i=1:aforj=1:bL(i)=L(i)+Pji(i,j)*log(Pij(j,i)+eps);endaf(i)=exp(L(i);endsumaa=sum(af);fori=1:app(i)=af(i)/(sumaa+eps);endI=log2(sumaa);pa=pp;enddisp(最佳输⼊分布pa:),disp(pp);disp(输⼊的符号数a:),disp(a);disp(输出的符号数b:),disp(b);disp(信道容量I:),disp(I);disp(输出迭代精度k:),disp(k);disp(输出迭代次数n:),disp(n);检验过程:P=0.5,0.3,0.2;0.3,0.5,0.2 I=0.036 bitP=1/2,1/3,1/6;1/6,1/2,1/3;1/3,1/6,1/2 I=0.126 bit1 输⼊P=1,0;1,0;1/2,1/2;0,1;0,1回车2 channelcapacity(P) 即可。

实验二:信道容量的迭代算法

实验二:信道容量的迭代算法

实验二信道容量迭代算法一、实验目的:了解信道容量的计算方法二、实验内容与原理:内容:1.令pe1=pe2=0.1和pe1=pe2=0.01,分别计算该对称信道的信道容量和最佳分布;2.令pe1=0.15,pe2=0.1和pe1=0.075pe2=0.01,分别计算该信道的信道容量和最佳分布;信道容量是信息传输率的极限,当信息传输率小于信道容量时,通过信道编码,能够实现几乎无失真的数据传输;当数据分布满足最佳分布时,实现信源与信道的匹配,使得信息传输率能够达到信道容量。

本实验利用信道容量的迭代算法,使用计算机完成信道容量的计算。

三、程序代码#include<stdio.h>#include<math.h>int main(){double Pe1,Pe2,Pa1_=0,Pa2_=0; double b1a1,b2a1,b1a2,b2a2;double Pa1=0,Pa2=0;double I=0,max=0;//平均互信息量,最大平均互信息量int count=0;printf("输入信道容量参数Pe1:");scanf("%lf",&Pe1);printf("输入信道容量参数Pe2:");scanf("%lf",&Pe2);printf("信道容量参数:Pe1=%lf Pe2=%f\n",Pe1,Pe2);b1a1=1-Pe1;b2a1=Pe1;b1a2=Pe2;b2a2=1-Pe2;for(Pa1=0.01;Pa1<=1;Pa1=Pa1+0.01){ Pa2=1-Pa1;count=count+1;I=Pa1*b1a1*( log( b1a1/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa1*b2a1*( log(b2a1/(Pa1*b2a1+Pa2*b2a2) )/log(2) )+Pa2*b1a2*( log(b1a2/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa2*b2a2*( log(b2a2/(Pa1*b2a1+Pa2*b2a2) )/log(2) );printf("%10lf",I);if (I>max){max=I;Pa1_=Pa1,Pa2_=Pa2;}elsecontinue;}printf("\n");printf(" 一共计算机了:%d\n",count);printf(" 最大互信息量为:%lf\n",max);printf(" 最大互信息量的P(a1)=%lf;P(a2)=%lf\n",Pa1_,Pa2_); }四、运行结果。

离散无记忆信道的信道容量计算实验报告PPT课件

离散无记忆信道的信道容量计算实验报告PPT课件
演讲人:XXXXXX 时 间:XX年XX月XX日
2.信道容量算法
信道容量是互信息的最大值,首先要将信道容量求极值得问题表示 为二重交替优化问题。
(1)
• 运行结 果
(2)
实验结果(1):输入概率转移矩阵是之前例题中的概率转移矩阵,迭代 次数为11和70次,经验证,迭代程序结果比例题中的一般信道容量算 法更为精确。
实验结果(2):迭代次数为4,迭代结果为1.3219,经验算发现此输入 概率转移矩阵的实际结果为1.329,误差不大,符合要求,另外精度越 高,结果越接近。
离散无记忆信道的迭代运算
一、为什么要迭代?
(*)
(1)解方程组求出的输入分布 {P(x)}可能不唯一,因为可能有多个 极值点;
(2)需要验证求出的输入分布序列 是否符合要求。
(2)从达到DMC的信道容量的充要条件出发:
二、Blahut-Arimoto算法
1.交替优化
(2)、通过轮流固定f的其中一个自变量,对另一个没固定的 自变量求极值,由此来确定受此自变量影响下的最值。下一 次对另一个自变量也如此操作,循环往复形成迭代。
程序部分
• 程序设计思路
• (1)参数输入模块
• (2)判断模块
判断矩阵中的元素是否 >=0且<=1
判断矩阵的行相加是否 都为1
• (3)迭代模块1
• (4)迭代模块2
• (5)输出模块Байду номын сангаас
• P116 4.3 (b)
• 一般的DMC
• 一般的DMC
概率矩阵:
参考文献
[1]王育民、李晖 .《信息论与编码理论第二版》[M]北京:高等教育出版社,2013.4 96-101 [2]辛英.《离散信道容量的迭代算法及其实现》[D]山东:山东工商学院,1994 [3]徐伟业 耿苏燕 马湘蓉 冯月芹.《任意DMC信道容量的计算与仿真》[D]南京:南京工程学院 2017

离散无记忆信道的信道容量计算实验报告

离散无记忆信道的信道容量计算实验报告

感谢聆听!
2.信道容量算法
信道容量是互信息的最大值,首先要将信道容量求极值得问题表示 为二重交替优化问题。
(1)
运行结果
(2)
实验结果(1):输入概率转移矩阵是之前例题中的概率转移矩阵,迭代 次数为11和70次,经验证,迭代程序结果比例题中的一般信道容量算 法更为精确。
实验结果(2):迭代次数为4,迭代结果为1.3219,经验算发现此输入概 率转移矩阵的实际结果为1.329,误差不大,符合要求,另外精度越高, 结果越接近。
离散无记忆信道的迭代运算
一、为什么要迭代?
(1)解方程组求出的输入分布 {P(x)}可能不唯一,因为可能有多个 极值点;
(2)需要验证求出的输入分布序列 是否符合要求。
二、Blahut-Arimoto算法
1.交替优化
(2)、通过轮流固定f的其中一个自变量,对另一个没固定的 自变量求极值,由此来确定受此自变量影响下的最值。下一 次对另一个自变量也如此操作,循环往复形成迭代。
程序部分
程序设计思路
(1)参数输入模块
(2)判断模块
判断矩阵中的元素是否 >=0且<=1
判断矩阵的行相加是否 都为1
(3)迭代模块1
(4)迭代模块2
(5)输出模块
P116 4.3 (b)
一般的王育民、李晖 .《信息论与编码理论第二版》[M]北京:高等教育出版社,2013.4 96-101 [2]辛英.《离散信道容量的迭代算法及其实现》[D]山东:山东工商学院,1994 [3]徐伟业 耿苏燕 马湘蓉 冯月芹.《任意DMC信道容量的计算与仿真》[D]南京:南京工程学院 2017

信息论基础离散信道及其信道容量

信息论基础离散信道及其信道容量
量X的条件下,对随机变量Y尚存在 的不确定性。噪声熵完全是由于信 道中噪声引起的,也称为散布度, 它反映了信道中噪声源的不确定性。
通信与信息基础教学部
30
信息论课件
平均互信息
互信息:信道输出端接收到某消息y(或
某消息序列y)后获得关于输入端某消息x (或某消息序列x)的信息量
I (x; y) log P(x / y) log P(xy) log P( y / x)
通信与信息基础教学部
16
信息论课件
几个重要的单符号离散信道
对称离散信道:信道矩阵中的行元素集 合相同,列元素集合也相同的信道,称 为对称信道。
通信与信息基础教学部
17
信息论课件
例:二元对称信道Binary Symmetric Channel (BSC)
1 p
0
0
p
p
1 1 p 1
通信与信息基础教学部
既不作“1”,也不作“0”
通信与信息基础教学部
21
信息论课件
例:二元删除信道Binary Erasure Channel (BEC)
p
0
0
1 p
1 q
e
1
q
1
通信与信息基础教学部
22
信息论课件
单符号离散信道的一些概率关系
对于信道[ X, P, Y ],


输入和输出符号的联合概率
验 概
验 概
通信与信息基础教学部
4
信道分类
信息论课件
根据信道的用户多少:
两端(单用户)信道 ■ 多端(多用户)信道
根据信道输入端和输出端的关联:
无反馈信道
■ 反馈信道

实验二---一般信道容量迭代算法.doc

实验二---一般信道容量迭代算法.doc

实验二---一般信道容量迭代算法.doc实验二一般信道容量迭代算法1.实验目的掌握一般离散信道的迭代运算方法。

2.实验要求1)理解和掌握信道容量的概念和物理意义2)理解一般离散信道容量的迭代算法3)采用Matlab 编程实现迭代算法4)认真填写试验报告3.算法步骤①初始化信源分布),,,,,(21)0(p p p p P ri =(一般初始化为均匀分布) ,置迭代计数器k=0 ,设信道容量相对误差门限为δ ,δ>0 ,可设-∞=C )0(;②∑=i k i ij k i ij k ji p p p p )()()(? s j r i ,??=??=,1;,,1 ③∑∑∑??=+i k ji j ij k ji j ij k i p p p ??)()()1(ln exp ln exp r i ,,1??= ④??=∑∑+ik ji j ij k p C ?)()1(ln exp ln ⑤如果δ≤-++C C Ck k k )1()()1( ,转向⑦;⑥置迭代序号k k →+1,转向②;⑦输出p k i )1(+和C k )(1+的结果;⑧停止。

4.代码P=input('转移概率矩阵P=')e=input('迭代精度e=')[r,s]=size(P);n=0;C=0;C_k=0;C_k1=0;X=ones(1,r)/r;A=zeros(1,r);B=zeros(r,s);%初始化各变量while(1)n=n+1;for i=1:rfor j=1:sB(i,j)=log(P(i,j)/(X*P(:,j))+eps); if P(i,j)==0B(i,j)=0;elseendendA(1,i)=exp(P(i,:)*B(i,:)');endC_k=log2(X*A');C_k1=log2(max(A));if (abs(C_0-C_1)。

信道容量的迭代算法实现

信道容量的迭代算法实现

信道容量的迭代算法实现#include <iostream>using namespace std;#define FLOAT_MINUS_PRECISION 0.00001typedef vector<float*> VEC_PFLOAT;//迭代计算信道容量,参数值为信源,信宿符号个数和信道转移概率矩阵,返回信道容量< /pre> float GetCapacity(int nSourceSymbol,int nHostSymbol,const VEC_PFLOAT& vTransMatrix){//信道容量初始化为最⼩值float fCapacity = FLT_MIN;//信源概率分布float *pfSoureProb = new float[nSourceSymbol];//初始化信源分布为均匀分布int i;for (i = 0; i < nSourceSymbol; i++){pfSoureProb[i] = 1.0 / nSourceSymbol;}//初始化φ函数VEC_PFLOAT vPhi;for (i = 0; i < nSourceSymbol; i++){float *pfTemp = new float[nHostSymbol];vPhi.push_back(pfTemp);}//设置精度;const float cfDelta = 0.02f;float fPrecision;//迭代计算int j,k;float *pfSum = new float[nSourceSymbol];do{for (i = 0; i < nSourceSymbol; i++){for (j = 0; j < nHostSymbol; j++){//计算ΣPi*Pjifloat fSum = 0.0f;for (k = 0; k < nSourceSymbol; k++){fSum += pfSoureProb[i] * vTransMatrix[k][i];}vPhi[i][j] = pfSoureProb[i] * vTransMatrix[j][i] / fSum;}}float fSumDeno = 0.0f; //分母求和for (i = 0; i < nSourceSymbol; i++){float fSum = 0.0f;for (j = 0; j < nHostSymbol; j++){fSum += vTransMatrix[j][i] * logf(vPhi[i][j]);}pfSum[i] = expf(fSum);fSumDeno += pfSum[i];}for (i = 0; i < nSourceSymbol; i++){pfSoureProb[i] = pfSum[i] / fSumDeno;}//计算新⼀轮的容量float fNewC = logf(fSumDeno);//计算精度fPrecision = fabs(fNewC - fCapacity) / fCapacity;fCapacity = fNewC;} while(fPrecision - cfDelta > 0.0f);//释放临时资源delete []pfSum;for (i = 0; i < vPhi.size(); i++){float* pfTemp = vPhi.at(i);delete pfTemp;}vPhi.clear();return fCapacity;}int main(){//转移矩阵VEC_PFLOAT vTransMatrix;int nCol,nLine;cout<<"请输⼊信源符号个数:";cin>>nLine;cout<<"请输⼊信宿符号个数:";cin>>nCol;cout<<"请依次输⼊"<<<"⾏信道转移概率矩阵:(以空格隔开每个概率)\n";< /pre> for (int i = 0; i < nLine; i++){float *pfTemp = new float[nCol];Labelfloat fSum = 0.0f;cout<<"X"<<<":";for (int j = 0; j < nCol - 1; j++){cin>>pfTemp[j];fSum += pfTemp[j];}if (1.0f - fSum < 0){cout<<"转移概率和应该为1,请重新输⼊!\n";goto Label1;}else{pfTemp[j] = 1.0f - fSum;cout<<"信源符号 X"<<<"的转移概率分别为:";for(int k = 0; k < nCol; k++)cout<cout<}vTransMatrix.push_back(pfTemp);}cout<<"信道容量为:"<< /pre>for (int k = 0; k < vTransMatrix.size(); k++){float* pfTemp = vTransMatrix.at(k);delete pfTemp;}vTransMatrix.clear();return0;}。

迭代算法求信道容量

迭代算法求信道容量

C语言方法实现,源程序如下:#include <stdio.h>#include <math.h>#include<stdlib.h>#define N 4#define M 4 /*转移矩阵行数为N,列数为M,自行调整*/ void Init(double *Pa); /* 输入概率分布初始化函数*/void Input(double *Pa,double *a); /*迭代输入概率分布重新调整函数*/void Output(double *Pa,double P[N][M],double *Pb); /*输出概率分布函数*/void Infor(double *Pb,double P[N][M],double *a); /*计算a(i)的函数*/double capacity1(double *Pa,double *a); /*计算C(n+1,n)*/double capacity2(double *a); /*计算C'(n+1,n)的函数*/void main(){ double c1,c2,s,temp;double Pa[N],a[N],Pb[M];double P[N][M];int i,j,count=0; /*count记录迭代次数*/for(i=0;i<N;i++)for(j=0;j<M;j++){ printf("please input P[%d][%d]:",i+1,j+1);scanf("%lf",&P[i][j]);} /*输入转移概率矩阵P*/for(i=0;i<N;i++){ temp=0.0;for(j=0;j<M;j++)temp+=P[i][j];if(temp!=1) { printf("Error!\n");exit(0);}} /*检查输入的转移概率矩阵是否正确:各行之和为1,则继续进行;否则退出程序*/printf("请输入精度:\n");scanf("%lf",&s);Init(Pa);while(1){ count++;Output(Pa,P,Pb);Infor(Pb,P,a);c1=capacity1(Pa,a);c2=capacity2(a);if(fabs(c1-c2)<s) break;else Input(Pa,a);}printf("迭代次数=%d次\n",count);printf("信道容量C=%fbit/符号\n",(1.0/log(2))*c1);printf("输入概率分布为:\n");for(i=0;i<M;i++){ printf("%10f",Pa[i]);if(i==N-1) printf("\n");}}void Init(double *Pa){ double s=N;int i;for(i=0;i<N;i++)Pa[i]=1.0/s;}void Input(double *Pa,double *a){ int i; double temp=0.0;for(i=0;i<N;i++)temp+=Pa[i]*a[i];for(i=0;i<N;i++)Pa[i]=(Pa[i]*a[i])/temp;}void Output(double *Pa,double P[N][M],double *Pb) { int i,j;double temp=0.0;for(j=0;j<M;j++){ for(i=0;i<N;i++)temp+=Pa[i]*P[i][j];Pb[j]=temp;temp=0.0;}}void Infor(double *Pb,double P[N][M],double *a) { int i,j;double temp=0.0;for(i=0;i<N;i++){ for(j=0;j<M;j++)if(P[i][j]==0)temp+=0;else temp+=P[i][j]*log(P[i][j]/Pb[j]);a[i]=exp(temp);temp=0.0;}}double capacity1(double *Pa,double *a){ int i; double temp=0.0;for(i=0;i<N;i++)temp+=Pa[i]*a[i];temp=log(temp);return temp;}double capacity2(double *a){ int i;double max;max=a[0];for(i=1;i<N;i++)if(max<a[i])max=a[i];max=log(max);return max;}实际运行结果如下:1、如果输入的转移概率矩阵不正确:2、正确输入转移概率矩阵:MATLAB语言方法实现,源程序如下:1、M-程序如下(命名为capacity.m):clear;P=input('请输入信道矩阵P='); %输入信道矩阵[r,s]=size(P);e=input('请输入迭代精度:'); %输入迭代精度for i=1:rPa(i)=1.0/r;end %初始概率为均匀分布count=0; %迭代次数while 1Pb=Pa*P; %计算输出概率分布for i=1:ra(i)=0;for j=1:sif P(i,j)==0a(i)=a(i)+0;elsea(i)=a(i)+P(i,j)*log(P(i,j)/Pb(j));endenda(i)=exp(a(i));end %计算a(i)temp=Pa*a'; %计算ΣPa(i)*a(i)C1=log(temp); %计算C(n+1,n)C2=log(max(a)); %计算C'(n+1,n)count=count+1;if abs(C1-C2)<eC=log2(exp(1))*C1;break;elsePa=(Pa.*a)/temp; %重新调整输入概率分布endenddisp('输入分布:');Padisp('信道矩阵为:');Pdisp('迭代次数');countdisp('信道容量');C2、命令窗口指令如下:>> capacity请输入信道矩阵P=[0.5,0.25,0,0.25;0,1,0,0;0,0,1,0;0.25,0,0.25,0.5]请输入迭代精度:0.00000001输入分布:Pa =0.1333 0.3667 0.3667 0.1333 信道矩阵为:P =0.5000 0.2500 0 0.25000 1.0000 0 00 0 1.0000 00.2500 0 0.2500 0.5000 迭代次数count =16信道容量C =1.3219>>。

一般离散无记忆信道容量的迭代计算

一般离散无记忆信道容量的迭代计算

一般离散无记忆信道容量的迭代计算信道容量的迭代算法1信道容量的迭代算法的步骤一、用了matlab 实现DMC 容量迭代的算法如下:第一步:首先要初始化信源分布:.0deta 10,1,0,1)(>>=⋯==,选置,,k r i rP k i 即选取一个精度,本次中我选deta=0.000001。

第二步:}{,)()()()(k ij i ji k i jik i k ij t p pp p t 得到反向转移概率矩阵根据式子∑=。

第三步:第四步:第五步: 若a C C C k k k det )1()()1(>-++,则执行k=k+1,然后转第二步。

直至转移条件不成立,接着执行下面的程序。

第六步:输出迭代次数k 和()1+k C 和1+k P ,程序终止。

()()()()(){}111]log exp[]log exp[+++==∑∑∑k i k i j ij k ji j ij k ji k i p P t pt p p 计算由式()()()()()()。

C t p t P I C k r i s j k ij ji k k k 10011log exp log ,+==++⎪⎭⎪⎬⎫⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡==∑∑计算由式2. Matlab实现clear;r=input('输入信源个数:');s=input('输入信宿个数:');deta=input('输入信道容量的精度: ');Q=rand(r,s); %形成r行s列随机矩阵QA=sum(Q,2); %把Q矩阵每一行相加和作为一个列矩阵AB=repmat(A,1,s); %把矩阵A的那一列复制为S列的新矩阵%判断信道转移概率矩阵输入是否正确P=input('输入信道转移矩阵P:')%从这句话开始将用下面两句代替可自动生成信道转移矩阵[r,s]=size(P);for i=1:rif(sum(P(i,:))~=1) %检测概率转移矩阵是否行和为1.error('概率转移矩阵输入有误!!')return;endfor j=1:sif(P(i,j)<0||P(i,j)>1) %检测概率转移矩阵是否负值或大于1error('概率转移矩阵输入有误!!')return;endendend%将上面的用下面两句代替可自动生成信道转移矩阵%disp('信道转移概率矩阵:')%P=Q./B 信道转移概率矩阵(每一个原矩阵的新数除以所在行的数总和)i=1:1:r; %设置循环首项为1,公差为1,末项为r(Q的行数)的循环p(i)=1/r; %原始信源分布r个信源,等概率分布disp('原始信源分布:')p(i)E=repmat(p',1,s);%把r个等概率元素组成一列,复制为s列for k=1:1:1/detam=E.*P; % m=p.*E; %后验概率的分子部分a=sum(m); %把得到的矩阵m每列相加之和构成一行su1=repmat(a,r,1);%把得到的行矩阵a复制r行,成一新矩阵sul,后验概率的分母部分t=m./su1; %后验概率矩阵n=exp(sum(P.*log(t),2)); %信源分布的分子部分su2=sum(n); %信源分布的分母部分p=n/su2; %信源分布E=repmat(p,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<=deta)break;enddisp('迭代次数:k='),disp(k)enddisp('最大信道容量时的信源分布:p='),disp(p')disp('最大信道容量:C='),disp(C(k+1))3.运行结果及分析结果分析:这两组数据都是我随机选的,都是选的信源个数为2,信宿的个数为3,选用的精度为0.000001。

迭代求解信道容量

迭代求解信道容量
Page Nhomakorabea14
谢谢~~
Page
15
j
H (Y / X ) p (ai ) p (b j / ai ) log p (b j / ai ) p (b j / ai ) log p (b j / ai ) H (Y / xi )
j i j
•输出对称
1 p (b j ) p (ai ) p (b j / ai ) p (b j / ai ) n i i
迭代算法计算信道容量
信道的基本概念
信道分类:
研究信道主要考虑信道中受干扰的影响,由于信道存在的干扰使输入信号和输出 信号之间没有固定的函数关系,只有统计依赖关系,因此可以通过分析输入和输出信 号之间的统计特性来研究信道。 实际通信系统中,信道的种类很多,包含的设备也不相同,因此可以按照不同的 角度对信道进行分类。 根据用用户数量:信道可以分为单用户信道和多用户信道。 单用户信道只有一个输入端和一个输出端,信息只朝一个方向单向传输; 多用户信道的信号输入和输出端至少有一端有两个以上用户,信息在两个方向都能传 输。 根据输入端和输出端关系:无反馈信道、有反馈信道 根据信道参数与时间的关系:固定参数信道(光纤、电缆)、时变参数信道(无线信 道)。 根据噪声种类: 随机差错信道(高斯白噪声为主题的信道)、突发差错信道(噪声干 扰的影响前后相关,如:衰落信道、码间干扰信道)。 根据输入输出信号的特点:离散信道、连续信道、半离散半连续信道以及波形信道。
0.3 0.1 0.6; 0.2 0.5 0.3;
C1=logm(PX*B') C2=logm(max(B)) while (1) if abs(C1-C2)<e break; end for i=1:1:S(1) PX(i)=PX(i)*B(i)/(PX*B'); end for k=1:1:S(1) I=0; PY=zeros(1,S(2)); for j=1:1:S(2) for i=1:1:S(1) PY(j)=PY(j)+PX(i)*PY_X(i,j); end I=I+PY_X(k,j)*log2(PY_X(k,j)/PY(j)); end B(k)=expm(I); end C1=logm(PX*B'); C2=logm(max(B)); end C=C1

信道容量的迭代算法的C语言程序

信道容量的迭代算法的C语言程序

C语言程序:#include<stdio.h>#include<math.h>#include<stdlib.h>int main(){int r,s,i,j,k=0;double p[20]; %存放输入信源概率矩阵double z[20];double q[20][20]; %存放信道转移概率矩阵p x y的概率分布矩阵的转置double F[20][20]; %存放(|)i idouble x,y,a;double epsilon=1e-5; %门限double C=-1000.0; %取初始迭代时的信道容量为一个较大的负数printf("\n请输入信源符号个数: ");scanf("%d",&r);printf("\n请输入信宿符号个数: ");scanf("%d",&s);printf("\n请输入信道转移概率矩阵: \n\n");for(i=0;i<r;i++){for(j=0;j<s;j++)scanf("%lf",&q[i][j]);printf("\n");}for(i=0;i<r;i++)p[i]=(double)(1.0/(double)r); %设初始信源分布为等概分布do{k++;a=C;for(j=0;j<s;j++){x=0.0;for(i=0;i<r;i++)p x y的分母部分x=x+(p[i])*(q[i][j]); % x 为(|)i iif(x>0)for(i=0;i<r;i++)p x y的概率分布矩阵的转置F[i][j]=(p[i])*(q[i][j])/x; % F为(|)i ielsefor(i=0;i<r;i++)F[i][j]=0.0; %的分母部分为0时, 令F=0}y=0.0;for(i=0;i<r;i++){z[i]=0.0;for(j=0;j<s;j++){if(F[i][j]>0)p的分子部分z[i]=z[i]+(q[i][j]*(log(F[i][j])/log(2.0))); %z[i]为i}z[i]=(pow(2.0,z[i]));p的分母部分y=y+z[i]; %z[i]为i}for(i=0;i<r;i++){p[i]=z[i]/y; %更新输入信源概率矩阵}C=(log(y)/log(2.0)); %求信道容量单位为“bit”}while(fabs((C-a)/C)>epsilon);printf("\n迭代次数为;k=%d\n",k); %输出迭代次数printf("\n最佳信源分布为: \n\n");for(i=0;i<r;i++){printf("%.3lf ",p[i]); %输出信源的最佳分布, 保留3位小数}printf("\n");printf("\n信道容量为:C=%.3lf bit\n\n",C); %输出信道容量, 保留3位小数}问题1的执行结果:问题2 的执行结果:。

信道容量迭代算法

信道容量迭代算法

附录:实验代码(C++)
#include<iostream> using namespace std; #include<math.h> #define MAX 50 double Calculate_C1(double p[],double a[]); double Calculate_C2(double a[]); int r,s; double P[MAX][MAX]; int main() { int i,j; double C1,C2,E; double a[MAX],p[MAX]; E=0.000001; cout<<"请输入信源符号个数 r:\n"; cin>>r; cout<<"请输入信宿符号个数 s:\n"; cin>>s; cout<<"请输入信道转移概率矩阵 P[bj][ai]:\n"; for(i=0;i<r;i++) for(j=0;j<s;j++) cin>>P[i][j]; for(i=0;i<r;i++) p[i]=1.0/r; do { for(i=0;i<r;i++) { int w,j; double temp,sum2=0; for(j=0;j<s;j++) { double qj=0; for(w=0;w<r;w++) { qj+=p[w]*P[w][j]; } temp=P[i][j]/qj;
算法原理
1. 2.
1 (0) 初始化信源分布:pi= ,循环变量 k=1,门限△,C =- r

离散无记忆信道的信道容量计算实验报告

离散无记忆信道的信道容量计算实验报告

感谢聆听!
2.信道容量算法
信道容量是互信息的最大值,首先要将信道容量求极值得问题表示 为二重交替优化问题。
(1)
运行结果
(2)
实验结果(1):输入概率转移矩阵是之前例题中的概率转移矩阵,迭代 次数为11和70次,经验证,迭代程序结果比例题中的一般信道容量算 法更为精确。
实验结果(2):迭代次数为4,迭代结果为1.3219,经验算发现此输入概 率转移矩阵的实际结果为1.329,误差不大,符合要求,另外精度越高, 结果越接近。
离散无记忆信道的迭代运算
一、为什么要迭代?
(1)解方程组求出的输入分布 {P(x)}可能不唯一,因为可能有多个 极值点;
(2)需要验证求出的输入分布序列 是否符合要求。
二、Blahut-Arimoto算法
1.交替优化
(2)、通过轮流固定f的其中一个自变量,对另一个没固定的 自变量求极值,由此来确定受此自变量影响下的最值。下一 次对另一个自变量也如此操作,循环往复形成迭代。
程序部分
程序设计思路
(1)参数输入模块
(2)判断模块
判断矩阵中的元素是否 >=0且<=1
判断矩阵的行相加是否 都为1
(3)迭.3 (b)
一般的DMC
一般的DMC
概率矩阵:
参考文献
[1]王育民、李晖 .《信息论与编码理论第二版》[M]北京:高等教育出版社,2013.4 96-101 [2]辛英.《离散信道容量的迭代算法及其实现》[D]山东:山东工商学院,1994 [3]徐伟业 耿苏燕 马湘蓉 冯月芹.《任意DMC信道容量的计算与仿真》[D]南京:南京工程学院 2017

信道容量的迭代算法

信道容量的迭代算法
p (0) (x i )
输入
s P(y j | x i ) ai(n) exp y j | x i ) ln q(y j ) j 1 (i=1,2...)
u (n) p(x i )ai (n)
i
I L log 2 (u (n) ), IU log 2 (max(a i(n) ))
I (X; Y) p(x i ) p(y j | x i ) ln
i j
p(x ) p(y
i i
p(y j | x i )
j
| xi )
(1)
要求信道容量 C 就是要在 p(x i ) 的约束下,求 I (X; Y) 的极大值。 首先引入后验概率,即:
q(x i | y j )
p(x ) p(y
表 1.1 ε的选取与信道容量关系 因此,使用该算法计算 C 的时候要选取适当的ε值,才能保证 值的准确性。
四 程序说明 1、程序采用的是C++语言,编译环境为visual studio 2010 2、信道矩阵放在“Channel_matrix.txt”中,其中初始信源为等概 1/R(R表示信源个数),并放在vector<float> pxi中。 3、本程序使用#define wucha ε 定义误差,因此通过改变 wucha 的值就可以控制迭代的次数 4、程序为:channel_code.cpp 信道矩阵为:Channel_matrix.txt
信道容量的迭代算—彭海军
研究信道的目的是要讨论信道中平均每个符号所能传送的信息 量,而将最大的信息传输率称为信道容量。由于对于普通的线性信 道(信道矩阵 r=s),直接可以采用 C ln e 求解信道容量。但当

第4章离散信道

第4章离散信道
特性p(x)共同决定的,
I ( X ;Y )
XY
p(xy) log
p(y | x) p( y)
XY
p( y
|
x) p(x)log
p(y | x)
p(y | x) p(x)
I(X;Y)
X
信道1的容量
但是容量C已对所有
信道2的容量
可能的p(x)取最大值,因此
容量C仅与信道特性p(y|x)有关,
也就是说,容量C是信道的固有 特性,与信源无关。
H(X|Y)≤H(X):收到输出符号Y以后,总能 消除一些对X的不确定性,获得一些信息。
【定义4-1】 称信道的输入空间X对输出空 间Y的条件熵
H (X | Y ) p(xi y j ) log p(xi | y j )
为信道疑义度。XY
信道疑义度的含义是观察到信道的输出之 后仍然保留的关于信道输入的平均不确定 性。
I ( X ;Y ) I (Y; X ) p(xy) log p( y | x) H ( p p) H ( p)
XY
p( y)
固定信道
p固定 从0到1 变化
固定信源
固定 p从0到1 变化
4.4 信道的组合
组合方式
并行:积信道 例如:Internet
串行:级联信道 例如:GSM
积信道
P P1P2
2 p(1 p)
(1
p)2
p2
则 I(X;Y)=1-H(p) I(X;Z)=1-H(2p(1-p))
从图中能够看出 I(X;Z)≤I(X;Y)
例4-8
X 1/3
Y
Z
1
信道I和信道II的信道矩阵分别为 1/3 2/3
1 1 1

信道容量迭代算法(信息与编码论)

信道容量迭代算法(信息与编码论)

实验四信道容量迭代算法一、实验目的让学生初步掌握信道容量的基础知识、计算方法及迭代算法计算方法,以及取得信道容量的判别算法,并学会使用c 语言完成迭代算法。

二、实验原理信息率失真函数迭代算法具体如下:(1)首先假设绝对值足够大的负数作为斜率S 的取值,并且选择试验信道的转移概率1(|)j k p b a 为等分布的,且令1n =。

(2)根据公式1()(|)()rn j n j k k k p b p b a p a ==∑计算出()n j p b 。

(2)将()n j p b 代入公式1()exp((,))(|)()exp[(,)]n j i j n j i n j i jj p b Sd a b p b a p b Sd a b +=∑计算出1(|)n j i p b a +。

(4)计算平均失真和信息率1111()(|)(,)s r n i n j i i j j i D p a p b a d a b ++===∑∑11(|)()(|)log()r s n j i n i n j i i j n j p b a R p a p b a p b ===∑∑(5)如果1||n n D D ε+-≤,则跳转到(6);否则,令1n n =+,跳转到(2)。

其中ε为事先确定的精度。

(6)令()n D S D =,()n R S R =;改变斜率值S ,选择初始条件概率为等概率分布,令1n =,然后跳转到(2),直至斜率足够接近0为止。

三、实验内容1)给定一个两输入的概率分布和失真矩阵测度分别如下12()1X a a p x p p ⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦11122122(,)(,)01(,)(,)10d a b d a b d a b d a b ⎡⎤⎡⎤==⎢⎥⎢⎥⎣⎦⎣⎦D 令p=0.5,初始斜率s=-20,斜率递增步长为0.05,利用迭代算法完成信息率失真函数的计算;将失真和信息率的值写入excel 文档,利用excel 的绘图工具画出信息率失真函数曲线;2)令p=0.3,0.1重复上述过程。

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

中文摘要信道是信息传递的通道,承担信息的传输和储存的任务,是构成通信系统的重要组成部分。

信道容量是指信道能够传输信息量的大小。

信道容量的研究在现实中有着非常重要的理论意义。

而信道容量的计算是一个比较复杂的问题,所以我们要借助于数学软件Matlab来解决这个难题。

本文的第一部分从信道容量的基本概念、基本原理、信道模型及分类等方面系统的介绍了信道容量。

并在此基础上,介绍了一般信道容量的计算步骤。

本文的第二部分开始介绍信道容量的迭代算法及迭代算法在Matlab中的实现,举例检验迭代算法在Matlab中实现的程序的可行性关键词信道容量 Matlab 迭代算法AbstractChannel is a channel of information transmission. And it take on the task of information transmission and storage. Channel is an important part of communication system. Channel capacity is the size of the amount of information can be transmitted. It has important significances in reality. However, calculating the channel capacity is a complex issue. So we must use the mathematical software Matlab to solve this problem.The first part of the article, it introduces channel capacity by the basic concepts, principles and the classification of channel models. On this basis, introduce and discuss the calculation steps of the general channel capacity.The second part of the article, it introduces the Iterative algorithm of the channel capacity and implementes the iterative algorithm in Matlab. After that, by realizing the feasibility of the procedure, we make some examples. And also analyze the procedure.Key word :channel capacity、matlab目录引言 (6)1、离散信道的数学模型 (6)2、信道容量和最佳输入概率分布 (6)2.1信道容量 (6)2.2最佳输入概率分布 (7)3、信道容量和平均互信息的计算步骤 (7)3.1平均互信息的计算 (7)3.2信道容量的计算 (7)4、信道容量的迭代算法 (8)5、实例分析 (9)结论 (10)参考文献 (11)附 (12)引言本文主要结合实例对离散信道及其信道容量进行相关阐述,及用迭代算法实现离散信道容量1、离散信道的数学模型设离散信道的输入为一个随机变量X ,相应的输出的随机变量为Y ,如图所示: 规定一个离散信道应有三个参数: 输入信号:X={X1, X2, …, XN} 输出信号:Y={Y1, Y2, …, YN}信道转移概率:P(y|x) 描述了输入信号和输出信号之间的依赖关系 。

根据P(y|x) ,可对离散信道分类如下:(1)无干扰信道:输入信号与输出信号 有一一对应关系(2)有干扰无记忆信道:任意时刻输出符号只与对应时刻的输入符号有关;(3)有干扰有记忆信道:这是最一般的信道。

2、信道容量和最佳输入概率分布2、1 信道容量我们先定义信息传输率:R=I(X,Y)=[H(X)-H(X/Y)]=[H(Y)-H(Y/X)] 比特/符号。

互信息I(X;Y)是输入符号分布概率)(i a p 和信道转移概率)|(i j a b p 的函数。

对于某特定信道,转移概率)|(i j a b p 已经确定,则互信息就是关于输1()()(/)0()y f x y f x P y x y f x =⎧==⎨≠⎩,并且12121(|)(|)(|)Ni i i P y x P y y x x P y x ===∏N N ...y ...x ()()max{(;)}max{()(/)}P X P X C I X Y H X H X Y ==-入符号分布概率)(i a p 的 型凸函数,也就是可以找到某种概率分布)(i a p ,使I(X;Y)达到最大,该最大值就是信道所能传送的最大信息量,即信道容量(channel capacity )。

信道容量与与信源无关,它是信道的特征参数,反应的是信道的最大的信息传输能力。

2、2 最佳输入概率分布首先介绍一定理:一般离散信道达到信道容量的充要条件是输入概率分布满足该定理说明,当平均互信息达到信道容量时,信源每一个符号都对输出端输出相同的互信息。

此时满足该条件的输入概率分布即为最佳输入概率分布。

特别地对于二元对称信道P=1/2时,C =0。

不管输入概率如何,都能达到信道容量。

此信道没有实际意义,但在理论上说明信道的最佳输入分布不一定是唯一的。

3、信道容量和平均互信息的计算步骤 3、1平均互信息的计算3、2信道容量的计算()(;)0()(;)0i i a I x Y C x b I x Y C x =≠⎧⎨≤=⎩i i 对所有其p 对所有其p log 2()1()C H p H p =-=-1(/)(;)(/)log()sj i j i j j p b a I x Y p b a p b ==∑对于一般信道的求解方法,就是求解方程组移项得:令 则若r=s ,此方程有解,可以解出s 各未知数βj ,再根据得 从而信道容量求出后,计算并没有结束,必须解出相应的)(i x p ,并确认所有的)(i x p 都大于或等于0时,所求的C 才存在,因为在我们对 I(X;Y)求偏导时只限制1)(1=∑=ni i x p ,并没有限制0)(≥i x p ,所以求出的)(i x p 可能为负值,此时的C 就不存在,必须对)(i x p 进行调整再求解C.一般由迭代算法求出。

4、信道容量的迭代算法记ij i j p x y p =)|( ,i i p x p =)(,ji i i y x p ϕ=)|( i=1,2...r;j=1,2...s初始化信源分布)......,(21)0(r i p p p p p =,置迭代计数器k=0,设信道容量相对误差门限为δ,δ>0;②∑=ik i ij k i ij k ji p p p p )()()(ϕ11(/)[log ()](/)log (/)s sj i j j i j i j j P b a C P b P b a P b a ==+=∑∑log ()j j C P b β=+11(/)(/)log (/)ssji j j i j i j j P ba Pb a P b a β===∑∑()2j Cj P b β-=121jsCj β-==∑1log 2jsj C β==∑11(/)log (/)(/)log ()s sj i j i j i j j j P b a P b a P b a P b C ==-=∑∑③∑∑∑=+ijk jiijjk ji ij k i pp p ]}ln {exp[]ln exp[)()()1(ϕϕ④}]ln exp[ln{)()1(∑∑=+ijk ji ij k p C ϕ ⑤如果δ≤-=∆+++)1()()1(1k k k k CC C C)(,转向⑦ ⑥置迭代序号k+1 k,转向② ⑦输出)1()(+k i x p 的结果和)1(+k C 的结果 ⑧停止5、实例分析以教材3-4、3-6进行分析,并通过matlab 实现3-4概率转移矩阵为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=εεεε1010001|X Y p ,输入信号、输出信号均为 (0,1,2);3-6的概率转移矩阵为⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=2/1002/12/12/10002/12/10002/12/1|XY p ,显然该信道为对称信道,设允许误差门限e=0.0001,分别把这两题的条件代入matlab 程序,即得信道容量C 分别为1.584963比特/符号(3-4题ε=0时)、1.000000比特/符号(3-4题ε=1/2时)、1.000000比特/符号(3-6); 与书后答案1.58、1、1基本符合,故本次设计可行。

相关程序代码见附。

结论/讨论通过本次结合课后习题对离散信道容量通过matlab程序实现,对离散信道及其信道容量又有了更深的了解,同时也对matlab对于矩阵数值迭代的功能加强了掌握。

本次设计参考了一些教材及相关论文,有相当一部分知识不甚了解,所以对于离散信道的相关知识有待进一步地去渗透。

参考文献:【1】曹雪虹、张宗橙信息论与编码清华大学出版社 2009年第二版【2】管宇离散信道容量的迭代算法应用数学与计算数学学报2006年02期附:function main()clc;p=[1 0 00 1/2 1/20 1/2 1/2]p2=[1 0 00 1 00 0 1]p3=[1/2 1/2 0 00 1/2 1/2 00 0 1/2 1/21/2 0 0 1/2]channel_cap(p1,0.0001)channel_cap(p2,0.0001)channel_cap(p3,0.0001)% Matlab实现离散信道容量的迭代算法% 功能:利用迭代算法计算离散信道的容量%参数解释%C:信道容量%P:转移概率矩阵%B:中间变量矩阵%e:信道容限%X:输入概率分布%n:迭代次数function channel_cap(P, e)n=0;C=0;C_0=0;C_1=0;[r,s]=size(P);for i=1:rif(sum(P(i,:))~=1)%检测概率转移矩阵是否行和为1.error('概率转移矩阵输入有误!!')return;endfor j=1:sif(P(i,j)<0||P(i,j)>1)%检测概率转移矩阵是否负值或大于1 error('概率转移矩阵输入有误!!')return;endendendX=ones(1,r)/r;A=zeros(1,r);B=zeros(r,s);while(1)n=n+1;for i=1:rfor j=1:sB(i,j)=log(P(i,j)/(X*P(:,j))+eps);endA(1,i)=exp(P(i,:)*B(i,:)');endC_0=log2(X*A');C_1=log2(max(A));if (abs(C_0-C_1)<e) %满足迭代终止条件停止迭代C=C_0;fprintf('迭代次数: n=%d\n',n)fprintf('信道容量: C=%f比特/符号\n',C) break; %满足后输出结果并退出elseX=(X.*A)/(X*A');continue;endEnd程序运行结果为:p1 =1.0000 0 00 0.5000 0.50000 0.5000 0.5000p2 =1 0 00 1 00 0 1p3 =0.5000 0.5000 0 0 0 0.5000 0.5000 0 0 0 0.5000 0.5000 0.5000 0 0 0.5000迭代次数: n=2信道容量: C=1.000000比特/符号迭代次数: n=1信道容量: C=1.584963比特/符号迭代次数: n=1信道容量: C=1.000000比特/符号。

相关文档
最新文档