一般信道容量迭代算法

合集下载

(最新整理)信道容量的计算

(最新整理)信道容量的计算

(完整)信道容量的计算编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)信道容量的计算)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)信道容量的计算的全部内容。

§4.2信道容量的计算这里,我们介绍一般离散信道的信道容量计算方法,根据信道容量的定义,就是在固定信道的条件下,对所有可能的输入概率分布)(x P 求平均互信息的极大值。

前面已知()Y X I ;是输入概率分布的上凸函数,所以极大值一定存在。

而);(Y X I 是r 个变量)}(),(),({21r x p x p x p 的多元函数。

并且满足1)(1=∑=ri i x p 。

所以可用拉格朗日乘子法来计算这个条件极值。

引入一个函数:∑-=ii x p Y X I )();(λφ解方程组0)(])();([)(=∑∂-∂∂∂i ii i x p x p Y X I x p λφ1)(=∑iix p (4.2。

1)可以先解出达到极值的概率分布和拉格朗日乘子λ的值,然后在解出信道容量C .因为 )()(log)()();(11i i i i i ri sj i y p x y Q x y Q x p Y X I ∑∑===而)()()(1i i ri i i x y Q x p y p ∑==,所以e e y p y p i i i i i x y Q i x p i x p log log ))(ln ()(log )()()(==∂∂∂∂。

解(4.2。

1)式有0log )()()()()()(log )(111=--∑∑∑===λe y p x y Q x y Q x p y p x y Q x y Q ii i ii r i s j i i i i sj i i (对r i ,,2,1 =都成立) 又因为)()()(1j k k rk k y p x y Q x p =∑=ri x y Q sj i j,,2,1,1)(1==∑=所以(4.2.1)式方程组可以转化为 ),,2,1(log )()(log)(1r i e y p x y Q x y Q j i j sj i j =+=∑=λ1)(1=∑=ri i x p假设使得平均互信息);(Y X I 达到极值的输入概率分布},,{21r p p p 这样有 e y p x y Q x y Q x p j i j i j ri sj i log )()(log)()(11+=∑∑==λ从而上式左边即为信道容量,得 e C log +=λ 现在令)()(log)();(1j i j sj i j i y p x y Q x y Q Y x I ∑==式中,);(Y x I i 是输出端接收到Y 后获得关于i x X =的信息量,即是信源符号i x X =对输出端Y 平均提供的互信息。

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

离散消息信道容量的迭代计算
此仿真中不同的信道转移概率表示不同的离散信道,信道容量对比仿真分析 如下表所示:
表 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 )

信道容量迭代计算实验报告

信道容量迭代计算实验报告

信道容量迭代计算实验报告王升10271051信科1002信道容量迭代计算实验报告一、实验目的:了解信道容量的定义和计算方法,能编写出正确的程序进行迭代计算得出信道容量。

二、实验要求:1)输入:输入信源个数、信宿个数和信道容量的精度,程序能任意生成随机的信道转移概率矩阵。

2)输出:输出最佳信源分布和信道容量。

三、实验环境:Matlab四、实验原理:五、源程序代码:clear;r=input('输入信源个数:');s=input('输入信宿个数:');deta=input('输入信道容量的精度:');Q=rand(r,s); %创建m*n随机分布矩阵A=sum(Q,2);B=repmat(A,1,s);disp('信源转移概率矩阵:'),p=Q./B %信源转移概率矩阵i=1:1:r;q(i)=1/r;disp('原始信源分布:'),qc=-10e-8;C=repmat(q',1,s);for k=1:1:100000m=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;endenddisp('最大信道容量时的信源分布:q='),disp(q') disp('最大信道容量:c='),disp(c(k+1))六、实验结果:。

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

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

实验二信道容量迭代算法一、实验目的:了解信道容量的计算方法二、实验内容与原理:内容: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_); }四、运行结果。

信道容量的一般计算方法-

信道容量的一般计算方法-

例:已知信道转移概率如图所示,求信道容量利用公式1⎪⎪⎩⎪⎪⎨⎧==+=∑∑==1)(log )()|(log )|(11r i i j i j s j i j x P C e y P x y P x y P λ由题可知:)(32)(11x P y P =,)(31)(12x P y P =,)()(23x P y P =当1=i 时,得到一个等式C x P x P =++0log 0)(31log 31)(32log 32131132当2=i 时,得到第二个等式C x P =⋅++)(1log 10log 00log 02再考虑约束条件1)()(21=+x P x P ,可解得:21)()(21==x P x P ,1=C 比特/次传递由于0)()(121≥≥x P x P ,,所有1=C 比特/次传递方法2:利用公式j sj i j i j s j i j x y P x y P x y P β)|()|(log )|(11∑∑===当1=i 时,得到一个等式321031320log 031log 3132log 32βββ⋅++=++当2=i 时,得到第二个等式3211001log 10log 00log 0βββ⋅+⋅+⋅=⋅++因为)(32)(11x P y P =,)(31)(12x P y P =,即)(2)(21y P y P =。

而C y P j j +=)(log β,所有12log )(log )(log 2121==−=−y P y P ββ根据等式可以解得0,31log ,32log 321===βββ。

据此可求得1)13132log()2log(1=++==∑=s j j C β比特/次传递信道输出符号的概率分布为C j j y P −=β2)(得31222)(31log 132log 11====−C y P β,6122)(131log 22===−−C y P β,2122)(033===−C y P β。

迭代算法求信道容量

迭代算法求信道容量

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>>。

matlab 信道容量的迭代计算

matlab 信道容量的迭代计算
《信息论基础》课程实验报告(四)
班级:计算072班姓名:白梅学号:20071189
实验内容:信道容量的迭代计算。
实验要求:
1.输入一个信道矩阵;
2.输出下列内容:(1)最佳输入概率分布;(2)信道容量;(3)迭代次数;(4)输入符号的个数;(5)输出符号的个数;(6)迭代计算精度;
3.实验报告中要包括源代码和输入、输出结果。
实验源程序如下:
function[CC,Paa]=ChannelCap(P,k)
if(length(find(P<0))~=0)
error('Not a prob.vector,negative component,不是概率分布');
end
if(abs(sum(P')-1)>10e-10)
error('Not a prob.vector,component do not add up to 1。不是概率分布');
Pa=Paa;
s0='很好!输入正确,迭代结果如下: ';
s1='最佳输入概率分布Pa:';
s2='信道容量C:';
s3='迭代次数n:';
s4='输入符号数r:';
s5='输出符号数s:';
s6='迭代计算精度k:';
for i=1:r
B{i}=i;
end
end
disp(s0);
disp(s1),disp(B),disp(Paa);
end
[r,s]=size(P);
Pa=(1/(r+eps))*ones(1,r);

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

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

一般离散无记忆信道容量的迭代计算信道容量的迭代算法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。

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

实验二一般信道容量迭代算法1.实验目的
一般离散信道容量的迭代运算
2.实验要求
(1)理解和掌握信道容量的概念和物理意义
(2)理解一般离散信道容量的迭代算法
(3)采用Matlab编程实现迭代算法
(4)认真填写实验报告。

3.算法
4.算法流程图
5.代码(要求写出关键语句的解释和运行结果)
6.计算下列信道的信道容量
例一:
0.980.02 0.050.95⎡⎤⎢⎥⎣⎦
例二:
0.60.4 0.010.99⎡⎤⎢⎥⎣⎦
例三:
0.790.160.05 0.050.150.8⎡⎤⎢⎥⎣⎦
7.思考题:
迭代精度指的是什么?它对计算结果的影响?
3.实验的算法:
1. 初始化信源分布:p i =r
1
,循环变量k=1,门限△,C (0)=-∞;
2. ∑==
r
i ji
k i
ji
k i k ij
p p
p p 1
)()()(φ
3. ∑∑∑===+=
r
i s
j k ij
ji
s
j k ij ji k i
p
p p 1
1)(1
)
()
1(]
log exp[]
log exp[φ
φ
4. ])log exp(log[1
1
)
()
1(∑∑==+=r i s
j k ij ji k p C
φ
5. 若
∆>-++)
1()
()1(k k k C
C C ,则k=k+1,转第2步
6. 输出P *=()()
r k i P 1+和()1+k C ,终止。

4.算法流程图如下:
5.代码如下:


()()⎪
⎭⎫
⎝⎛=+=+⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡=∑∑∑i i i
i i j i i j i i j i j i a n n C a x p n n C x y p x p x y p x y p a max ln ,1)(ln ,1)/()()/(ln
)/(exp 21 ()()ε
<+-+n n C n n C ,1,121()n n C C ,11+= ∑=
i
i
i i i i a x p a x p x p )()()(
输入
)()()0(i i x p x p = 结束
源程序:
clc;clear all;
N = input('输入信源符号X的个数N=');
M = input('输出信源符号Y的个数M=');
p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零
fprintf('输入信道矩阵概率\n')
for i=1:N
for j=1:M
p_yx(i,j)=input('p_yx=');%输入信道矩阵概率
if p_yx(i)<0
error('不符合概率分布')
end
end
end
for i=1:N %各行概率累加求和
s(i)=0;
for j=1:M
s(i)=s(i)+p_yx(i,j);
end
end
for i=1:N %判断是否符合概率分布
if (s(i)<=0.999999||s(i)>=1.000001) error('不符合概率分布')
end
end
b=input('输入迭代精度:');%输入迭代精度
for i=1:N
p(i)=1.0/N; %取初始概率为均匀分布
end
for j=1:M %计算q(j)
q(j)=0;
for i=1:N
q(j)=q(j)+p(i)*p_yx(i,j);
end
end
for i=1:N %计算a(i)
d(i)=0;
for j=1:M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));
end
end
a(i)=exp(d(i));
end
u=0;
for i=1:N %计算u
u=u+p(i)*a(i);
end
IL=log2(u); %计算IL
IU=log2(max(a));%计算IU
n=1;
while((IU-IL)>=b) %迭代计算
for i=1:N
p(i)=p(i)*a(i)/u; %重新赋值p(i)
end
for j=1:M %计算q(j)
q(j)=0;
for i=1:N
q(j)=q(j)+p(i)*p_yx(i,j);
end
end
for i=1:N %计算a(i)
d(i)=0;
for j=1:M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));
end
end
a(i)=exp(d(i));
end
u=0;
for i=1:N %计算u
u=u+p(i)*a(i);
end
IL=log2(u); %计算IL
IU=log2(max(a));%计算IU
n=n+1;
end
fprintf('信道矩阵为:\n');
disp(p_yx);
fprintf('迭代次数n=%d\n',n);
fprintf('信道容量C=%f比特/符号',IL);
例一的运行结果:
输入信源符号X的个数N=2
输出信源符号Y的个数M=2 输入信道矩阵概率
p_yx=0.98
p_yx=0.02
p_yx=0.05
p_yx=0.95
输入迭代精度:0.006
信道矩阵为:
0.9800 0.0200
0.0500 0.9500
迭代次数n=2
信道容量C=0.785846比特/符号
6.计算下列信道的信道容量
例一:
0.980.02 0.050.95⎡⎤⎢⎥⎣⎦
信道容量:C=0.785846(bit/符号)
例二:
0.60.4 0.010.99⎡⎤⎢⎥⎣⎦
信道容量:C=0.368754(bit/符号)
例三:
0.790.160.05 0.050.150.8⎡⎤⎢⎥⎣⎦
信道容量C=0.571214(bit/符号)。

相关文档
最新文档